1#!/usr/bin/perl -w
2#
3# Parse PCI_ROM and ISA_ROM entries from a source file on stdin and
4# output the relevant Makefile variable definitions to stdout
5#
6# Based upon portions of Ken Yap's genrules.pl
7
8use strict;
9use warnings;
10
11die "Syntax: $0 driver_source.c" unless @ARGV == 1;
12my $source = shift;
13open DRV, "<$source" or die "Could not open $source: $!\n";
14
15( my $family, my $driver_name ) = ( $source =~ /^(.*?([^\/]+))\..$/ )
16    or die "Could not parse source file name \"$source\"\n";
17
18my $printed_family;
19
20sub rom {
21  ( my $type, my $image, my $desc, my $vendor, my $device ) = @_;
22  my $ids = $vendor ? "$vendor,$device" : "-";
23  unless ( $printed_family ) {
24    print "\n";
25    print "# NIC\t\n";
26    print "# NIC\tfamily\t$family\n";
27    print "DRIVERS += $driver_name\n";
28    $printed_family = 1;
29  }
30  print "\n";
31  print "# NIC\t$image\t$ids\t$desc\n";
32  print "DRIVER_$image = $driver_name\n";
33  print "ROM_TYPE_$image = $type\n";
34  print "ROM_DESCRIPTION_$image = \"$desc\"\n";
35  print "PCI_VENDOR_$image = 0x$vendor\n" if $vendor;
36  print "PCI_DEVICE_$image = 0x$device\n" if $device;
37  print "ROMS += $image\n";
38  print "ROMS_$driver_name += $image\n";
39}
40
41while ( <DRV> ) {
42  next unless /(PCI|ISA)_ROM\s*\(/;
43
44  if ( /^\s*PCI_ROM\s*\(
45         \s*0x([0-9A-Fa-f]{4})\s*, # PCI vendor
46         \s*0x([0-9A-Fa-f]{4})\s*, # PCI device
47         \s*\"([^\"]*)\"\s*,	   # Image
48         \s*\"([^\"]*)\"\s*,	   # Description
49         \s*.*\s*		   # Driver data
50       \)/x ) {
51    ( my $vendor, my $device, my $image, my $desc ) = ( lc $1, lc $2, $3, $4 );
52    rom ( "pci", $image, $desc, $vendor, $device );
53    rom ( "pci", lc "${vendor}${device}", $desc, $vendor, $device );
54  } elsif ( /^\s*ISA_ROM\s*\(
55	      \s*\"([^\"]*)\"\s*,  # Image
56	      \s*\"([^\"]*)\"\s*   # Description
57	    \)/x ) {
58    ( my $image, my $desc ) = ( $1, $2 );
59    rom ( "isa", $image, $desc );
60  } else {
61    warn "Malformed PCI_ROM or ISA_ROM macro on line $. of $source\n";
62  }
63}
64
65close DRV;
66