| // PIR table generation (for emulators) |
| // |
| // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net> |
| // Copyright (C) 2002 MandrakeSoft S.A. |
| // |
| // This file may be distributed under the terms of the GNU LGPLv3 license. |
| |
| #include "pci.h" // struct pir_header |
| #include "config.h" // CONFIG_* |
| #include "util.h" // checksum |
| |
| struct pir_header *PirAddr VAR16VISIBLE; |
| |
| struct pir_table { |
| struct pir_header pir; |
| struct pir_slot slots[6]; |
| } PACKED; |
| |
| extern struct pir_table PIR_TABLE; |
| #if CONFIG_PIRTABLE |
| struct pir_table PIR_TABLE __aligned(16) VAR16EXPORT = { |
| .pir = { |
| .version = 0x0100, |
| .size = sizeof(struct pir_table), |
| .router_devfunc = 0x08, |
| .compatible_devid = 0x122e8086, |
| }, |
| .slots = { |
| { |
| // first slot entry PCI-to-ISA (embedded) |
| .dev = 1<<3, |
| .links = { |
| {.link = 0x60, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x61, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x62, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x63, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 0, // embedded |
| }, { |
| // second slot entry: 1st PCI slot |
| .dev = 2<<3, |
| .links = { |
| {.link = 0x61, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x62, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x63, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x60, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 1, |
| }, { |
| // third slot entry: 2nd PCI slot |
| .dev = 3<<3, |
| .links = { |
| {.link = 0x62, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x63, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x60, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x61, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 2, |
| }, { |
| // 4th slot entry: 3rd PCI slot |
| .dev = 4<<3, |
| .links = { |
| {.link = 0x63, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x60, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x61, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x62, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 3, |
| }, { |
| // 5th slot entry: 4rd PCI slot |
| .dev = 5<<3, |
| .links = { |
| {.link = 0x60, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x61, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x62, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x63, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 4, |
| }, { |
| // 6th slot entry: 5rd PCI slot |
| .dev = 6<<3, |
| .links = { |
| {.link = 0x61, .bitmap = 0xdef8}, // INTA# |
| {.link = 0x62, .bitmap = 0xdef8}, // INTB# |
| {.link = 0x63, .bitmap = 0xdef8}, // INTC# |
| {.link = 0x60, .bitmap = 0xdef8}, // INTD# |
| }, |
| .slot_nr = 5, |
| }, |
| } |
| }; |
| #endif // CONFIG_PIRTABLE |
| |
| void |
| pirtable_setup(void) |
| { |
| if (! CONFIG_PIRTABLE) |
| return; |
| |
| dprintf(3, "init PIR table\n"); |
| |
| PIR_TABLE.pir.signature = PIR_SIGNATURE; |
| PIR_TABLE.pir.checksum -= checksum(&PIR_TABLE, sizeof(PIR_TABLE)); |
| PirAddr = &PIR_TABLE.pir; |
| } |