From owner-svn-src-all@FreeBSD.ORG Sat Jun 6 12:53:54 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B666A106564A; Sat, 6 Jun 2009 12:53:54 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A49518FC0C; Sat, 6 Jun 2009 12:53:54 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n56Crs3g061750; Sat, 6 Jun 2009 12:53:54 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n56Crs3K061749; Sat, 6 Jun 2009 12:53:54 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <200906061253.n56Crs3K061749@svn.freebsd.org> From: Edwin Groothuis Date: Sat, 6 Jun 2009 12:53:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193584 - head/tools/tools/pciid X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Jun 2009 12:53:55 -0000 Author: edwin Date: Sat Jun 6 12:53:54 2009 New Revision: 193584 URL: http://svn.freebsd.org/changeset/base/193584 Log: When trying to see if we could update the share/misc/pci_vendors, I found out that the input format of the Boemler list was different than what the code expected: The last two fields were interpreted as one. Checking the csv version of the list it showed that there was sometimes a chipset number in the column before the card description. This is a rewrite to use the CSV format of the Boemler list. The output is differently formatted: Instead of the "chip description", it is now "description (chip)" Modified: head/tools/tools/pciid/mk_pci_vendors.pl Modified: head/tools/tools/pciid/mk_pci_vendors.pl ============================================================================== --- head/tools/tools/pciid/mk_pci_vendors.pl Sat Jun 6 12:50:10 2009 (r193583) +++ head/tools/tools/pciid/mk_pci_vendors.pl Sat Jun 6 12:53:54 2009 (r193584) @@ -30,7 +30,7 @@ # Generate src/share/misc/pci_vendors from the Hart and Boemler lists, # currently available at: # -# Boemler: http://www.pcidatabase.com/reports.php?type=tab-delimeted +# Boemler: http://www.pcidatabase.com/reports.php?type=csv # Hart: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt # # -l Where an entry is found in both input lists, use the entry with @@ -42,26 +42,28 @@ # use strict; use Getopt::Std; +use Data::Dumper; my $PROGNAME = 'mk_pci_vendors'; my $VENDORS_FILE = 'vendors.txt'; my $PCIDEVS_FILE = 'pcidevs.txt'; -my $cur_vendor; +my ($cur_vendor, $vendorid, $pciid, $vendor); my %opts; -my %vendors; +my %pciids = (); +my %vendors = (); my ($descr, $existing, $id, $line, $rv, $winner, $optlused); my $IS_VENDOR = 1; my $IS_DEVICE = 2; my $V_DESCR = 0; my $V_DEVSL = 1; -my $W_NOCONTEST = 0; +my $W_FINAL = 0; my $W_VENDORS = 1; my $W_PCIDEVS = 2; sub clean_descr($); -sub vendors_parse($\$\$); +sub vendors_parse($\$\$\$\$); sub pcidevs_parse($\$\$); if (not getopts('lp:qv:', \%opts) or @ARGV > 0) { @@ -87,15 +89,14 @@ open(VENDORS, "< $opts{v}") or die "$PROGNAME: $opts{v}: $!\n"; while ($line = ) { chomp($line); - $rv = vendors_parse($line, $id, $descr); - if ($rv == $IS_VENDOR) { - if (exists($vendors{$id})) { - die "$PROGNAME: $id: duplicate vendor ID\n"; + $rv = vendors_parse($line, $vendorid, $pciid, $vendor, $descr); + if ($rv != 0) { + if (defined $vendors{$vendorid} + && $vendors{$vendorid}[$W_VENDORS] ne $vendor) { + die "$PROGNAME: $vendorid: duplicate vendor ID\n"; } - $vendors{$id} = [$descr, {}]; - $cur_vendor = $id; - } elsif ($rv == $IS_DEVICE) { - ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id} = $descr; + $vendors{$vendorid}[$W_VENDORS] = $vendor; + $pciids{$vendorid}{$pciid}[$W_VENDORS] = $descr; } } close(VENDORS); @@ -106,52 +107,57 @@ while ($line = ) { chomp($line); $rv = pcidevs_parse($line, $id, $descr); if ($rv == $IS_VENDOR) { - if (not exists($vendors{$id})) { - $vendors{$id} = [$descr, {}]; - $winner = $W_NOCONTEST; - } elsif ($opts{l}) { - $existing = $vendors{$id}->[$V_DESCR]; - if (length($existing) < length($descr)) { - $vendors{$id}->[$V_DESCR] = $descr; - $winner = $W_PCIDEVS; - } else { - $winner = $W_VENDORS; - } + $vendorid = $id; + $vendors{$vendorid}[$W_PCIDEVS] = $descr; + } elsif ($rv == $IS_DEVICE) { + $pciids{$vendorid}{$id}[$W_PCIDEVS] = $descr; + } +} +close(PCIDEVS); + +foreach my $vid (keys(%vendors)) { + if (!defined $vendors{$vid}[$W_VENDORS] + && defined $vendors{$vid}[$W_PCIDEVS]) { + $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS]; + } elsif (defined $vendors{$vid}[$W_VENDORS] + && !defined $vendors{$vid}[$W_PCIDEVS]) { + $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS]; + } elsif (!$opts{l}) { + $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS]; + } else { + if (length($vendors{$vid}[$W_VENDORS]) > + length($vendors{$vid}[$W_PCIDEVS])) { + $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS]; } else { - $winner = $W_VENDORS; + $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS]; } - $cur_vendor = $id; - if (not $opts{q} and $winner != $W_NOCONTEST) { - $existing = $vendors{$id}->[$V_DESCR]; - print STDERR "$PROGNAME: ", - $winner == $W_VENDORS ? "Boemler" : "Hart", - " vendor wins: $id\t$existing\n"; - } - } elsif ($rv == $IS_DEVICE) { - if (not exists(${$vendors{$cur_vendor}->[$V_DEVSL]}{$id})) { - ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id} = $descr; - $winner = $W_NOCONTEST; - } elsif ($opts{l}) { - $existing = ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id}; - if (length($existing) < length($descr)) { - ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id} = - $descr; - $winner = $W_PCIDEVS; + } + + foreach my $pciid (keys(%{$pciids{$vid}})) { + if (!defined $pciids{$vid}{$pciid}[$W_VENDORS] + && defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) { + $pciids{$vid}{$pciid}[$W_FINAL] = + $pciids{$vid}{$pciid}[$W_PCIDEVS]; + } elsif (defined $pciids{$vid}{$pciid}[$W_VENDORS] + && !defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) { + $pciids{$vid}{$pciid}[$W_FINAL] = + $pciids{$vid}{$pciid}[$W_VENDORS]; + } elsif (!$opts{l}) { + $pciids{$vid}{$pciid}[$W_FINAL] = + $pciids{$vid}{$pciid}[$W_VENDORS]; + } else { + if (length($pciids{$vid}{$pciid}[$W_VENDORS]) > + length($pciids{$vid}{$pciid}[$W_PCIDEVS])) { + $pciids{$vid}{$pciid}[$W_FINAL] = + $pciids{$vid}{$pciid}[$W_VENDORS]; } else { - $winner = $W_VENDORS; + $pciids{$vid}{$pciid}[$W_FINAL] = + $pciids{$vid}{$pciid}[$W_PCIDEVS]; } - } else { - $winner = $W_VENDORS; - } - if (not $opts{q} and $winner != $W_NOCONTEST) { - $existing = ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id}; - print STDERR "$PROGNAME: ", - $winner == $W_VENDORS ? "Boemler" : "Hart", - " device wins: $id\t$existing\n"; } } + } -close(PCIDEVS); $optlused = $opts{l} ? "with" : "without"; print <[$V_DESCR]; - print "$id\t$descr\n"; - foreach $id (sort keys %{$vendors{$cur_vendor}->[$V_DEVSL]}) { - $descr = ${$vendors{$cur_vendor}->[$V_DEVSL]}{$id}; - print "\t$id\t$descr\n"; +foreach my $vid (sort keys %vendors) { + $descr = $vendors{$vid}[0]; + print "$vid\t$descr\n"; + foreach $pciid (sort keys %{$pciids{$vid}}) { + $descr = $pciids{$vid}{$pciid}[0]; + print "\t$pciid\t$descr\n"; } } exit 0; -# Parse a line from the Boemler file and place the ID and description -# in the scalars referenced by $id_ref and $descr_ref. +# Parse a line from the Boemler file and place the vendor id, pciid, +# vendor description and description in the scalars. # -# On success, returns $IS_VENDOR if the line represents a vendor entity -# or $IS_DEVICE if the line represents a device entity. +# Returns 0 if there is a problem. # -# Returns 0 on failure. -# -sub vendors_parse($\$\$) +sub vendors_parse($\$\$\$\$) { - my ($line, $id_ref, $descr_ref) = @_; + my ($line, $vendorid_ref, $pciid_ref, $vendor_ref, $descr_ref) = @_; - if ($line =~ /^([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) { - ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2)); - return $IS_VENDOR; - } elsif ($line =~ /^\t([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) { - ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2)); - return $IS_DEVICE; - } elsif (not $opts{q} and - $line !~ /^\s*$/ and $line !~ /^;/) { - chomp($line); - print STDERR "$PROGNAME: ignored Boemler: $line\n"; + my @a = split(/","/, $line); + $a[0] =~ s/0x//; + $a[1] =~ s/0x//; + + $a[0] =~ s/^"//; + $a[4] =~ s/"$//; + + $a[0] = uc($a[0]); + $a[1] = uc($a[1]); + + return 0 if (length($a[0]) != 4 || length($a[1]) != 4); + + if ($a[4] eq "") { + if ($a[3] ne "") { + $a[4] = $a[3]; + $a[3] = ""; + } else { + $a[4] = "?"; + } } - return 0; + $$vendorid_ref = $a[0]; + $$pciid_ref = $a[1]; + $$vendor_ref = $a[2]; + $$descr_ref = clean_descr($a[4]); + if ($a[3] =~ /[a-zA-Z0-0]/) { + $$descr_ref .= clean_descr(" ($a[3])"); + } + return 1; } # Parse a line from the Hart file and place the ID and description @@ -237,5 +255,7 @@ sub clean_descr($) { my ($descr) = @_; + $descr =~ s/[^[:print:]]//g; + return $descr; }