[linda] Add support for QLogic 7220-based Infiniband HCAs
[people/pcmattman/gpxe.git] / src / drivers / infiniband / qib_genbits.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use warnings;
5
6 my $offsets = {};
7 my $structures = {};
8 my $structure = "";
9
10 while ( <> ) {
11   chomp;
12   if ( /^\#define (\S+)_OFFS (\S+)$/ ) {
13     $structure = $1;
14     $offsets->{$structure} = $2;
15   } elsif ( /^\#define ${structure}_(\S+)_LSB (\S+)$/ ) {
16     $structures->{$structure}->{$1}->{LSB} = $2;
17   } elsif ( /^\#define ${structure}_(\S+)_RMASK (\S+)$/ ) {
18     $structures->{$structure}->{$1}->{RMASK} = $2;
19   } elsif ( /^\s*$/ ) {
20     # Do nothing
21   } else {
22     print "$_\n";
23   }
24 }
25
26 my $data = [ map { { name => $_, offset => $offsets->{$_} }; }
27              sort { hex ( $offsets->{$a} ) <=> hex ( $offsets->{$b} ) }
28              keys %$offsets ];
29
30 foreach my $datum ( @$data ) {
31   next unless exists $structures->{$datum->{name}};
32   $structure = $structures->{$datum->{name}};
33   my $fields = [ map { { name => $_, lsb => $structure->{$_}->{LSB},
34                          rmask => $structure->{$_}->{RMASK} }; }
35                  sort { hex ( $structure->{$a}->{LSB} ) <=>
36                             hex ( $structure->{$b}->{LSB} ) }
37                  keys %$structure ];
38   $datum->{fields} = $fields;
39 }
40
41 print "\n/* This file has been further processed by $0 */\n\n\n";
42
43 foreach my $datum ( @$data ) {
44   printf "#define %s_offset 0x%08xUL\n",
45       $datum->{name}, hex ( $datum->{offset} );
46   if ( exists $datum->{fields} ) {
47     my $lsb = 0;
48     my $reserved_idx = 0;
49     printf "struct %s_pb {\n", $datum->{name};
50     foreach my $field ( @{$datum->{fields}} ) {
51       my $pad_width = ( hex ( $field->{lsb} ) - $lsb );
52       die "Inconsistent LSB/RMASK in $datum->{name}\n" if $pad_width < 0;
53       printf "\tpseudo_bit_t _unused_%u[%u];\n", $reserved_idx++, $pad_width
54           if $pad_width;
55       # Damn Perl can't cope with 64-bit hex constants
56       my $width = 0;
57       my $rmask = $field->{rmask};
58       while ( $rmask =~ /^(0x.+)f$/i ) {
59         $width += 4;
60         $rmask = $1;
61       }
62       $rmask = hex ( $rmask );
63       while ( $rmask ) {
64         $width++;
65         $rmask >>= 1;
66       }
67       printf "\tpseudo_bit_t %s[%u];\n", $field->{name}, $width;
68       $lsb += $width;
69     }
70     my $pad_width = ( 64 - $lsb );
71     die "Inconsistent LSB/RMASK in $datum->{name}\n" if $pad_width < 0;
72     printf "\tpseudo_bit_t _unused_%u[%u];\n", $reserved_idx++, $pad_width
73         if $pad_width;
74     printf "};\n";
75     printf "struct %s {\n\tPSEUDO_BIT_STRUCT ( struct %s_pb );\n};\n",
76         $datum->{name}, $datum->{name};
77   }
78   print "\n";
79 }