#! /usr/bin/perl # # read gcc -E {aic79xx_pci.c,aic7xxx_pci.c} and extract module info # sub add_range; sub add_entry; while(<>) { if(/^struct.*ah[cd]_pci_ident_table\s*\[\s*\]\s*=\s*$/ .. /^\}/) { if(/^struct.*ah([cd])_pci_ident_table\s*\[\s*\]\s*=\s*$/) { $mod = $1 eq "c" ? "aic7xxx" : "aic79xx"; } if(/^\s+\{/ .. /^\s+\}/) { if(/^\s+\}/) { if($field && $field != 4) { die "oops, unexpected line $.: $_"; } if($field) { # print "id = $id, id_mask = $id_mask, mask = $mask, name = $name, func = $func\n"; add_entry; } undef $field; undef $id; undef $id_mask; undef $mask; undef $name; undef $func; } if($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) { $id = $1; $field++; } elsif($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*\&\s*0x([0-9A-Fa-f]{16})ull\s*,\s*$/) { $id = $1; $id_mask = $2; $field++; } elsif($field == 1 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) { $mask = $1; $field++; } elsif($field == 2 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|(\".+\"))\s*,\s*$/) { $name = $1; $field++; } elsif($field == 3 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|([a-z].+))\s*,?\s*$/) { $func = $1; $field++; } } } } sub add_range { my ($r); $r = 0xffff - $_[0]; return unless $r; if($r != 15) { printf " & 0x%04x", $r; } else { printf " + 0x0010"; } } sub add_entry { local $_; my ($v, $d, $sv, $sd); my ($vm, $dm, $svm, $sdm); my ($tag); $id_mask = "F" x 16 unless defined $id_mask; $d = hex(substr $id, 0, 4) & hex(substr $id_mask, 0, 4); $v = hex(substr $id, 4, 4) & hex(substr $id_mask, 4, 4); $sd = hex(substr $id, 8, 4) & hex(substr $id_mask, 8, 4); $sv = hex(substr $id, 12, 4) & hex(substr $id_mask, 12, 4); $dm = hex(substr $mask, 0, 4); $vm = hex(substr $mask, 4, 4); $sdm = hex(substr $mask, 8, 4); $svm = hex(substr $mask, 12, 4); $name =~ s/^"|"$//g; if($func !~ /^[a-z]/) { print STDERR "entry \"$name\" dropped\n"; return; } print "\n# $name\n"; $tag = " "; if($vm) { printf "${tag}vendor.id\t\tpci 0x%04x", $v; add_range $vm; print "\n"; $tag = "&"; } if($dm) { printf "${tag}device.id\t\tpci 0x%04x", $d; add_range $dm; print "\n"; $tag = "&"; } if($svm) { printf "${tag}subvendor.id\t\tpci 0x%04x", $sv; add_range $svm; print "\n"; $tag = "&"; } if($sdm) { printf "${tag}subdevice.id\t\tpci 0x%04x", $sd; add_range $sdm; print "\n"; $tag = "&"; } printf "+driver.module.modprobe\t%s\n", $mod; }