diff options
Diffstat (limited to 'convert')
-rw-r--r-- | convert/Makefile | 13 | ||||
-rw-r--r-- | convert/README.pcitable | 14 | ||||
-rwxr-xr-x | convert/merge2pcitable.pl | 141 | ||||
-rw-r--r-- | convert/xf86PciInfo2pcitable.c | 22 | ||||
-rw-r--r-- | convert/xf86str.h | 13 |
5 files changed, 203 insertions, 0 deletions
diff --git a/convert/Makefile b/convert/Makefile new file mode 100644 index 00000000..1aec5909 --- /dev/null +++ b/convert/Makefile @@ -0,0 +1,13 @@ +FILES = xf86PciInfo2pcitable + +all: $(FILES) + +clean: + rm -f $(FILES) + +xf86PciInfo2pcitable: %: %.c xf86PciInfo.h + gcc -o $@ $< + +#do +# take new xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h in XFree86-4 +# make ; ./xf86PciInfo2pcitable > /tmp/xf_pcitable ; perl rh_pcitable2pcitable /tmp/xf_pcitable ../pcitable diff --git a/convert/README.pcitable b/convert/README.pcitable new file mode 100644 index 00000000..c792a3e1 --- /dev/null +++ b/convert/README.pcitable @@ -0,0 +1,14 @@ +################################################################################ +# How to merge the pcitable with various source: +# +# update pciutils +./merge2pcitable pciids /usr/share/pci.ids pcitable > pcitable.new + +# with redhat's pcitable in /tmp/rh_pcitable (from kudzu or anaconda) +./merge2pcitable pcitable /tmp/rh_pcitable pcitable > pcitable.new + +# with a new kernel +./merge2pcitable kernel_pcimap $(echo /lib/modules/2.4.*/modules.pcimap | sed 's/ .*//') pcitable > pcitable.new + +# checking the pcitable +./merge2pcitable pcitable pcitable pcitable > /dev/null diff --git a/convert/merge2pcitable.pl b/convert/merge2pcitable.pl new file mode 100755 index 00000000..a5d85046 --- /dev/null +++ b/convert/merge2pcitable.pl @@ -0,0 +1,141 @@ +#!/usr/bin/perl + +$ARGV[0] eq '-f' and $force = shift; +$ARGV[0] eq '-a' and $all = shift; + +my $formats = join '|', grep {$_} map { /^read_(.*)/ ? $1 : '' } keys %main::; + +@ARGV == 3 or die "usage: $0 [-f] [-a] $formats <in_file> <mdk_pcitable>\n"; + +($format, $in, $pcitable) = @ARGV; + +my $read = $main::{"read_$format"} or die "unknown format $format (must be one of $formats)\n"; +my $d_pci = read_pcitable($pcitable); +my $d_in = $read->($in); +merge($d_pci, $d_in); +write_pcitable($d_pci); + +sub to_string { + my ($id, $driver) = @_; + my ($module, $text) = map { qq("$_") } @$driver; + my ($id1, $id2, $subid1, $subid2) = map { "0x$_" } ($id =~ /(....)/g); + join "\t", $id1, $id2, "$subid1 $subid2" ne "0xffff 0xffff" ? ($subid1, $subid2) : (), $module, $text; +} + +# works for RedHat's pcitable old and new format, + mdk format (alike RedHat's old one) +# (the new format has ending .o's and double quotes are removed) +sub read_pcitable { + my ($f) = @_; + my %drivers; + my $rm_quote = sub { s/^"//; s/"$//; $_ }; + open F, $f or die "read_pcitable: can't open $f\n"; + my $line = 0; + foreach (<F>) { + chomp; $line++; + next if /^#/ || /^\s*$/; + if (my ($id1, $id2, @l) = split /\t+/) { + my ($subid1, $subid2) = ('ffff', 'ffff'); + ($subid1, $subid2, @l) = @l if @l == 4; + @l == 2 or die "$f $line: bad number of fields (in $_)\n"; + my ($module, $text) = @l; + + my $class = $text =~ /(.*?)|/; + my $id1_ = $rm_quote->($id1); + if ($class{$id1_}) { + print STDERR "$f $line: class $id1_ named both $class and $class{$id1_}, taking $class{$id1_}\n"; + $class{$id1_} ||= $1; + $text =~ s/(.*?)|/$class{$id1_}|/; + } + + $module =~ s/\.o$//; + $module = "unknown" if $module =~ /alsa|ignore/; # stupid rh stuff + my $id = join '', map { s/^0x//; $_ } $id1, $id2, $subid1, $subid2; + $drivers{$id} and print STDERR "$f $line: multiple entry for $id (skipping $module $text)\n"; + $drivers{$id} ||= [ map &$rm_quote, $module, $text ]; + } + } + \%drivers; +} + +sub read_kernel_pcimap { + my ($f) = @_; + my %drivers; + open F, $f or die "read_kernel_pcimap: can't open $f\n"; + foreach (<F>) { + chomp; + next if /^#/ || /^\s*$/; + my ($module, $id1, $id2, $subid1, $subid2) = split; + $drivers{join '', map { /(....)$/ } $id1, $id2, $subid1, $subid2} = [ $module, '' ]; + } + \%drivers; +} + +sub read_pciids { + my ($f) = @_; + my %drivers; + my ($id1, $id2, $class, $line); + open F, $f or die "read_pciids: can't open $f\n"; + foreach (<F>) { + chomp; $line++; + next if /^#/ || /^;/ || /^\s*$/; + if (/^C\s/) { + last; + } elsif (/^\t\t(\S+)\s+(\S+)\s+(.*)/) { + $id1 && $id2 or die "$f $line: unexpected device\n"; + $drivers{"$id1$id2$1$2"} = [ "unknown", "$class|$3" ]; + } elsif (/^\t(\S+)\s+(.*)/) { + $id2 = $1; + $id1 && $id2 or die "$f $line: unexpected device\n"; + $drivers{"$id1${id2}ffffffff"} = [ "unknown", "$class|$2" ]; + } elsif (/^(\S+)\s+(.*)/) { + $id1 = $1; + $class = $class{$2} || $2; + } else { + die "bad line: $_"; + } + } + \%drivers; +} + +sub read_pcitablepm { + my ($f) = @_; + open F, $f or die "read_pcitablepm: can't open $f\n"; + eval join('', <F>); + + %pci_probing::pcitable::ids or die; + while (my ($k, $v) = each %pci_probing::pcitable::ids) { + $drivers{sprintf qq(%08xffffffff), $k >> 32} = [ $v->[1], $v->[0] ]; + } + \%drivers; +} + +# write in RedHat's pcitable old format (mdk one) +sub write_pcitable { + my ($drivers) = @_; + foreach (sort keys %$drivers) { + print to_string($_, $drivers->{$_}), "\n"; + } +} + +sub merge { + my ($drivers, $new) = @_; + + foreach (keys %$new) { + next if $new->{$_}[0] =~ /parport_pc|i810_ng/; + if ($drivers->{$_}) { + if ($new->{$_}[0] !~ /unknown|ignore/) { + if ($drivers->{$_}[0] =~ /unknown|ignore/ || $force) { + $drivers->{$_}[0] = $new->{$_}[0]; + } elsif ($drivers->{$_}[0] ne $new->{$_}[0]) { + print STDERR "different($drivers->{$_}[0] $new->{$_}[0]): ", to_string($_, $drivers->{$_}), "\n" + # special case for framebuffer modules + unless $new->{$_}[0] =~ /fb/ && $drivers->{$_}[0] =~ /^(Card|Server):/; + } + } + } else { + $drivers->{$_} = $new->{$_} + # don't keep sub-entries with unknown drivers + if $all || /ffffffff$/ || $new->{$_}[0] !~ /(unknown|ignore)/; + } + } +} diff --git a/convert/xf86PciInfo2pcitable.c b/convert/xf86PciInfo2pcitable.c new file mode 100644 index 00000000..30374b79 --- /dev/null +++ b/convert/xf86PciInfo2pcitable.c @@ -0,0 +1,22 @@ +/* take xc/programs/Xserver/hw/xfree86/common/xf86PciInfo.h in XFree86-4 */ +#include "xf86PciInfo.h" + +const char *vendor2text(int id) { + SymTabRec *p; + for (p = xf86PCIVendorNameInfoData; p->token; p++) + if (p->token == id) return p->name; + fprintf(stderr, "error, bad vendor id\n"); + exit(1); +} + +main() { + pciVendorDeviceInfo *p; + + for (p = xf86PCIVendorInfoData; p->VendorID; p++) { + struct pciDevice *q; + const char *vendor = vendor2text(p->VendorID); + for (q = p->Device; q->DeviceID; q++) { + printf("0x%04x\t0x%04x\t\"unknown\"\t\"%s|%s\"\n", p->VendorID, q->DeviceID, vendor, q->DeviceName); + } + } +} diff --git a/convert/xf86str.h b/convert/xf86str.h new file mode 100644 index 00000000..9d9f5001 --- /dev/null +++ b/convert/xf86str.h @@ -0,0 +1,13 @@ +#include <stdio.h> + +typedef struct { + int token; /* id of the token */ + const char * name; /* token name */ +} SymTabRec, *SymTabPtr; + +#define CARD16 int + +#define INIT_PCI_CARD_INFO +#define INIT_PCI_VENDOR_INFO +#define INIT_PCI_VENDOR_NAME_INFO +#define VENDOR_INCLUDE_NONVIDEO |