3 #include "pirq_routing.h"
5 static char *preamble
[] = {
8 " * This file is part of the coreboot project.\n",
10 " * Copyright (C) 200x TODO <TODO@TODO>\n",
12 " * This program is free software; you can redistribute it and/or modify\n",
13 " * it under the terms of the GNU General Public License as published by\n",
14 " * the Free Software Foundation; either version 2 of the License, or\n",
15 " * (at your option) any later version.\n",
17 " * This program is distributed in the hope that it will be useful,\n",
18 " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n",
19 " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n",
20 " * GNU General Public License for more details.\n",
22 " * You should have received a copy of the GNU General Public License\n",
23 " * along with this program; if not, write to the Free Software\n",
24 " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n",
26 "#ifdef GETPIR /* TODO: Drop this when copying to coreboot. */\n",
27 "#include \"pirq_routing.h\" /* TODO: Drop this when copying to coreboot. */\n",
28 "#else /* TODO: Drop this when copying to coreboot. */\n"
29 "#include <arch/pirq_routing.h>\n",
30 "#endif /* TODO: Drop this when copying to coreboot. */\n\n"
31 "const struct irq_routing_table intel_irq_routing_table = {\n",
32 "\tPIRQ_SIGNATURE, /* u32 signature */\n",
33 "\tPIRQ_VERSION, /* u16 version */\n",
37 void code_gen(char *filename
, struct irq_routing_table
*rt
)
39 char **code
= preamble
;
40 struct irq_info
*se_arr
= (struct irq_info
*) ((char *) rt
+ 32);
41 int i
, ts
= (rt
->size
- 32) / 16;
44 if ((fpir
= fopen(filename
, "w")) == NULL
) {
45 printf("Failed creating file!\n");
50 fprintf(fpir
, "%s", *code
++);
52 fprintf(fpir
, "\t32 + 16 * %d, /* Max. number of devices on the bus */\n",
54 fprintf(fpir
, "\t0x%02x, /* Interrupt router bus */\n",
56 fprintf(fpir
, "\t(0x%02x << 3) | 0x%01x, /* Interrupt router dev */\n",
57 rt
->rtr_devfn
>> 3, rt
->rtr_devfn
& 7);
58 fprintf(fpir
, "\t%#x, /* IRQs devoted exclusively to PCI usage */\n",
60 fprintf(fpir
, "\t%#x, /* Vendor */\n", rt
->rtr_vendor
);
61 fprintf(fpir
, "\t%#x, /* Device */\n", rt
->rtr_device
);
62 fprintf(fpir
, "\t%#x, /* Miniport */\n",
64 fprintf(fpir
, "\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */\n");
65 fprintf(fpir
, "\t%#x, /* Checksum (has to be set to some value that\n * would give 0 after the sum of all bytes\n * for this structure (including checksum).\n */\n",
67 fprintf(fpir
, "\t{\n");
68 fprintf(fpir
, "\t\t/* bus, dev | fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu */\n");
69 for (i
= 0; i
< ts
; i
++) {
70 fprintf(fpir
, "\t\t{0x%02x, (0x%02x << 3) | 0x%01x, {{0x%02x, 0x%04x}, {0x%02x, 0x%04x}, {0x%02x, 0x%04x}, {0x%02x, 0x%04x}}, 0x%x, 0x%x},\n",
71 (se_arr
+i
)->bus
, (se_arr
+i
)->devfn
>> 3,
72 (se_arr
+i
)->devfn
& 7, (se_arr
+i
)->irq
[0].link
,
73 (se_arr
+i
)->irq
[0].bitmap
, (se_arr
+i
)->irq
[1].link
,
74 (se_arr
+i
)->irq
[1].bitmap
, (se_arr
+i
)->irq
[2].link
,
75 (se_arr
+i
)->irq
[2].bitmap
, (se_arr
+i
)->irq
[3].link
,
76 (se_arr
+i
)->irq
[3].bitmap
, (se_arr
+i
)->slot
,
79 fprintf(fpir
, "\t}\n");
80 fprintf(fpir
, "};\n");
82 fprintf(fpir
, "\nunsigned long write_pirq_routing_table(unsigned long addr)\n");
84 fprintf(fpir
, "\treturn copy_pirq_routing_table(addr);\n");