|
@@ -8,6 +8,7 @@ use strict;
|
|
|
use File::Spec;
|
|
|
|
|
|
# Variables from configuration file
|
|
|
+our %consts;
|
|
|
our $iodev_addr_bits;
|
|
|
our $iodev_addr_shift;
|
|
|
our $xdev_addr_bits;
|
|
@@ -28,17 +29,18 @@ sub generate_h($) {
|
|
|
print $out "#ifndef IODEVS_H\n";
|
|
|
print $out "#define IODEVS_H\n\n";
|
|
|
|
|
|
- printf $out "#define IODEV_ADDR_BITS %d\n", $iodev_addr_bits;
|
|
|
- printf $out "#define IODEV_ADDR_SHIFT %d\n", $iodev_addr_shift;
|
|
|
+ foreach my $c (sort(keys(%consts))) {
|
|
|
+ printf $out "#define %-23s 0x%08x /* %d */\n",
|
|
|
+ $c, $consts{$c}, $consts{$c};
|
|
|
+ }
|
|
|
+ print $out "\n";
|
|
|
|
|
|
my $ndev = 0;
|
|
|
my $nxdev = 0;
|
|
|
my $nirq = 0;
|
|
|
|
|
|
- print $out "\n";
|
|
|
-
|
|
|
foreach my $sysirq (@sysirqs) {
|
|
|
- printf $out "#define %s_IRQ %d\n", uc($sysirq), $nirq++;
|
|
|
+ printf $out "#define %-23s %d\n", "\U$sysirq\E_IRQ", $nirq++;
|
|
|
}
|
|
|
|
|
|
foreach my $dev (@iodevs) {
|
|
@@ -53,17 +55,17 @@ sub generate_h($) {
|
|
|
my $xdev = $dev->{-xdev};
|
|
|
|
|
|
if ($xdev) {
|
|
|
- printf $out "\n#define %s_XDEV %d\n", $name, $nxdev;
|
|
|
- printf $out "#define %s_BASE 0x%08x\n", $name,
|
|
|
+ printf $out "\n#define %-23s %d\n", $name.'_XDEV', $nxdev;
|
|
|
+ printf $out "#define %-23s 0x%08x\n", $name.'_BASE',
|
|
|
base($nxdev, $xdev_addr_bits, $xdev_addr_shift);
|
|
|
} else {
|
|
|
- printf $out "\n#define %s_DEV %d\n", $name, $ndev;
|
|
|
- printf $out "#define %s_BASE 0x%08x\n", $name,
|
|
|
+ printf $out "\n#define %-23s %d\n", $name.'_DEV', $ndev;
|
|
|
+ printf $out "#define %-23s 0x%08x\n", $name.'_BASE',
|
|
|
base($ndev, $iodev_addr_bits, $iodev_addr_shift);
|
|
|
}
|
|
|
- printf $out "#define %s_DEV_COUNT %d\n", $name, $dcount;
|
|
|
+ printf $out "#define %-23s %d\n", $name.'_DEV_COUNT', $dcount;
|
|
|
if ($icount) {
|
|
|
- printf $out "#define %s_IRQ %d\n", $name, $nirq;
|
|
|
+ printf $out "#define %-23s %d\n", $name.'_IRQ', $nirq;
|
|
|
}
|
|
|
|
|
|
$ndev += $xdev ? 0 : $dcount;
|
|
@@ -71,7 +73,7 @@ sub generate_h($) {
|
|
|
$nirq += $dcount * $icount;
|
|
|
}
|
|
|
|
|
|
- printf $out "\n#define IRQ_VECTORS %d\n", $nirq;
|
|
|
+ printf $out "\n#define %-23s %d\n", 'IRQ_VECTORS', $nirq;
|
|
|
|
|
|
print $out "\n#endif /* IODEVS_H */\n";
|
|
|
}
|
|
@@ -105,13 +107,13 @@ sub generate_irqtbl($)
|
|
|
$nirq += $dcount*$icount;
|
|
|
}
|
|
|
|
|
|
- print $out "static void irqhandler_spurious(unsigned int vector)\n";
|
|
|
+ print $out "static IRQHANDLER(spurious)\n";
|
|
|
print $out "{\n";
|
|
|
print $out "\tmask_irq(vector);\n";
|
|
|
print $out "}\n\n";
|
|
|
|
|
|
foreach my $irq (@irqtbl) {
|
|
|
- printf $out "void irqhandler_%s(unsigned int) __attribute__((weak,alias(\"irqhandler_spurious\")));\n", $irq->[0];
|
|
|
+ printf $out "IRQHANDLER(%s) __attribute__((weak,alias(\"irqhandler_spurious\")));\n", $irq->[0];
|
|
|
|
|
|
}
|
|
|
print $out "\nirqhandler_t __attribute__((section(\".sdata\")))\n";
|
|
@@ -129,6 +131,12 @@ sub generate_verilog($)
|
|
|
{
|
|
|
my($out) = @_;
|
|
|
|
|
|
+ foreach my $c (sort(keys(%consts))) {
|
|
|
+ printf $out "\tlocalparam %-23s = \'h%08x; // %d\n",
|
|
|
+ $c, $consts{$c}, $consts{$c};
|
|
|
+ }
|
|
|
+ print $out "\n";
|
|
|
+
|
|
|
my $ndev = 0;
|
|
|
my $nxdev = 0;
|
|
|
my $nirq = scalar(@sysirqs);
|
|
@@ -140,12 +148,12 @@ sub generate_verilog($)
|
|
|
my @valid = ();
|
|
|
my @irqs = ();
|
|
|
|
|
|
- print $out "\treg [31:0] nxdev_rdata;\n";
|
|
|
- print $out "\treg [31:0] iodev_rdata;\n";
|
|
|
- printf $out "\twire [%d:0] xdev_valid = iodev_mem_valid << cpu_mem_addr[%d:%d];\n",
|
|
|
+ print $out "\treg [31:0] nxdev_rdata;\n";
|
|
|
+ print $out "\treg [31:0] iodev_rdata;\n";
|
|
|
+ printf $out "\twire [%2d:0] xdev_valid = iodev_mem_valid << cpu_mem_addr[%d:%d];\n",
|
|
|
(1 << $xdev_addr_bits)-1,
|
|
|
$xdev_addr_shift+$xdev_addr_bits-1, $xdev_addr_shift;
|
|
|
- printf $out "\twire [%d:0] iodev_valid = xdev_valid[%d] << cpu_mem_addr[%d:%d];\n",
|
|
|
+ printf $out "\twire [%2d:0] iodev_valid = xdev_valid[%d] << cpu_mem_addr[%d:%d];\n",
|
|
|
(1 << $iodev_addr_bits)-1, (1 << $xdev_addr_bits)-1,
|
|
|
$iodev_addr_shift+$iodev_addr_bits-1, $iodev_addr_shift;
|
|
|
|
|
@@ -229,9 +237,9 @@ sub generate_verilog($)
|
|
|
printf $out "\t\t\t\t%d'd%d:\t iodev_rdata = %s;\n",
|
|
|
$iodev_addr_bits, $ndev++, $dev;
|
|
|
}
|
|
|
- print $out "\t\t\t\tdefault: iodev_rdata = 32'hffffffff;\n";
|
|
|
+ print $out "\t\t\t\tdefault: iodev_rdata = 32'hxxxxxxxx;\n";
|
|
|
print $out "\t\t\tendcase\n";
|
|
|
- print $out "\t\t\tdefault: iodev_rdata = 32'hffffffff;\n";
|
|
|
+ print $out "\t\t\tdefault: iodev_rdata = 32'hxxxxxxxx;\n";
|
|
|
print $out "\t\tendcase\n";
|
|
|
|
|
|
print $out "\n";
|
|
@@ -262,6 +270,12 @@ unless (defined(do File::Spec->rel2abs($infile))) {
|
|
|
die "$0: $infile: $@\n"
|
|
|
}
|
|
|
|
|
|
+# Export these as constants, too
|
|
|
+$consts{'IODEV_ADDR_BITS'} = $iodev_addr_bits;
|
|
|
+$consts{'IODEV_ADDR_SHIFT'} = $iodev_addr_shift;
|
|
|
+$consts{'XDEV_ADDR_BITS'} = $xdev_addr_bits;
|
|
|
+$consts{'XDEV_ADDR_SHIFT'} = $xdev_addr_shift;
|
|
|
+
|
|
|
open(my $out, '>', $outfile) or die;
|
|
|
|
|
|
if ($mode eq 'h') {
|