1 // PIR table generation (for emulators)
2 // DO NOT ADD NEW FEATURES HERE. (See paravirt.c / biostables.c instead.)
3 //
4 // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
5 // Copyright (C) 2002 MandrakeSoft S.A.
6 //
7 // This file may be distributed under the terms of the GNU LGPLv3 license.
8
9 #include "config.h" // CONFIG_*
10 #include "output.h" // dprintf
11 #include "std/pirtable.h" // struct pir_header
12 #include "string.h" // checksum
13 #include "util.h" // PirAddr
14
15 struct pir_table {
16 struct pir_header pir;
17 struct pir_slot slots[6];
18 } PACKED;
19
20 static struct pir_table PIR_TABLE = {
21 .pir = {
22 .version = 0x0100,
23 .size = sizeof(struct pir_table),
24 .router_devfunc = 0x08,
25 .compatible_devid = 0x122e8086,
26 },
27 .slots = {
28 {
29 // first slot entry PCI-to-ISA (embedded)
30 .dev = 1<<3,
31 .links = {
32 {.link = 0x60, .bitmap = 0xdef8}, // INTA#
33 {.link = 0x61, .bitmap = 0xdef8}, // INTB#
34 {.link = 0x62, .bitmap = 0xdef8}, // INTC#
35 {.link = 0x63, .bitmap = 0xdef8}, // INTD#
36 },
37 .slot_nr = 0, // embedded
38 }, {
39 // second slot entry: 1st PCI slot
40 .dev = 2<<3,
41 .links = {
42 {.link = 0x61, .bitmap = 0xdef8}, // INTA#
43 {.link = 0x62, .bitmap = 0xdef8}, // INTB#
44 {.link = 0x63, .bitmap = 0xdef8}, // INTC#
45 {.link = 0x60, .bitmap = 0xdef8}, // INTD#
46 },
47 .slot_nr = 1,
48 }, {
49 // third slot entry: 2nd PCI slot
50 .dev = 3<<3,
51 .links = {
52 {.link = 0x62, .bitmap = 0xdef8}, // INTA#
53 {.link = 0x63, .bitmap = 0xdef8}, // INTB#
54 {.link = 0x60, .bitmap = 0xdef8}, // INTC#
55 {.link = 0x61, .bitmap = 0xdef8}, // INTD#
56 },
57 .slot_nr = 2,
58 }, {
59 // 4th slot entry: 3rd PCI slot
60 .dev = 4<<3,
61 .links = {
62 {.link = 0x63, .bitmap = 0xdef8}, // INTA#
63 {.link = 0x60, .bitmap = 0xdef8}, // INTB#
64 {.link = 0x61, .bitmap = 0xdef8}, // INTC#
65 {.link = 0x62, .bitmap = 0xdef8}, // INTD#
66 },
67 .slot_nr = 3,
68 }, {
69 // 5th slot entry: 4th PCI slot
70 .dev = 5<<3,
71 .links = {
72 {.link = 0x60, .bitmap = 0xdef8}, // INTA#
73 {.link = 0x61, .bitmap = 0xdef8}, // INTB#
74 {.link = 0x62, .bitmap = 0xdef8}, // INTC#
75 {.link = 0x63, .bitmap = 0xdef8}, // INTD#
76 },
77 .slot_nr = 4,
78 }, {
79 // 6th slot entry: 5th PCI slot
80 .dev = 6<<3,
81 .links = {
82 {.link = 0x61, .bitmap = 0xdef8}, // INTA#
83 {.link = 0x62, .bitmap = 0xdef8}, // INTB#
84 {.link = 0x63, .bitmap = 0xdef8}, // INTC#
85 {.link = 0x60, .bitmap = 0xdef8}, // INTD#
86 },
87 .slot_nr = 5,
88 },
89 }
90 };
91
92 void
pirtable_setup(void)93 pirtable_setup(void)
94 {
95 if (! CONFIG_PIRTABLE)
96 return;
97
98 dprintf(3, "init PIR table\n");
99
100 PIR_TABLE.pir.signature = PIR_SIGNATURE;
101 PIR_TABLE.pir.checksum -= checksum(&PIR_TABLE, sizeof(PIR_TABLE));
102 copy_pir(&PIR_TABLE);
103 }
104