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