Hi,
attached patch adds code to create bus entries in the mptable from the
device tree instead of the hardcodes we do right now.
It also changes kontron/986lcd-m to use the new function, where its
advantage is starting to show:
As we support a given riser card (with pci bridge and bus), we currently
have to look for the card and add a bus and interrupt sources to the
mptable. With this patch, the bus is automatically added to the table.
Once interrupt sources are handled the same way, that special case could
be dropped completely (and such plug-in cards that add buses will be
properly supported on all boards)
I didn't adapt all the mptable.c files in the tree, as I feel the code
should be tested on a more diverse set of boards. Our table generation
code sometimes differs only so slightly, and I don't know in all cases
if the automatic handling would pick up those differences, or if they
actually matter (or are correct in the first place).
Signed-off-by: Patrick Georgi <[email protected]>
Index: src/arch/i386/boot/mpspec.c
===================================================================
--- src/arch/i386/boot/mpspec.c (Revision 5646)
+++ src/arch/i386/boot/mpspec.c (Arbeitskopie)
@@ -323,3 +323,37 @@
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH,
bus_isa, 0xe, apicid, 0xe);
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH,
bus_isa, 0xf, apicid, 0xf);
}
+
+void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus, int
*isa_bus) {
+ int dummy, i, highest;
+ char buses[256];
+ struct device *dev;
+
+ if (!max_pci_bus) max_pci_bus = &dummy;
+ if (!isa_bus) isa_bus = &dummy;
+
+ *max_pci_bus = 0;
+ highest = 0;
+ memset(buses, 0, sizeof(buses));
+
+ for (dev = all_devices; dev; dev = dev->next) {
+ struct bus *bus;
+ for (bus = dev->link_list; bus; bus = bus->next) {
+ if (bus->secondary > 255) {
+ printk(BIOS_ERR, "A bus claims to have a bus ID
> 255?!? Aborting");
+ return;
+ }
+ buses[bus->secondary] = 1;
+ if (highest < bus->secondary) highest = bus->secondary;
+ }
+ }
+ for (i=0; i <= highest; i++) {
+ if (buses[i]) {
+ smp_write_bus(mc, i, "PCI ");
+ *max_pci_bus = i;
+ }
+ }
+ *isa_bus = *max_pci_bus + 1;
+ smp_write_bus(mc, *isa_bus, "ISA ");
+}
+
Index: src/arch/i386/include/arch/smp/mpspec.h
===================================================================
--- src/arch/i386/include/arch/smp/mpspec.h (Revision 5646)
+++ src/arch/i386/include/arch/smp/mpspec.h (Arbeitskopie)
@@ -274,6 +274,7 @@
unsigned long write_smp_table(unsigned long addr);
void mptable_add_isa_interrupts(struct mp_config_table *mc, unsigned long
bus_isa, unsigned long apicid, int external);
+void mptable_write_buses(struct mp_config_table *mc, int *max_pci_bus, int
*isa_bus);
#endif
Index: src/mainboard/kontron/986lcd-m/mptable.c
===================================================================
--- src/mainboard/kontron/986lcd-m/mptable.c (Revision 5646)
+++ src/mainboard/kontron/986lcd-m/mptable.c (Arbeitskopie)
@@ -33,7 +33,7 @@
struct mp_config_table *mc;
struct device *riser = NULL, *firewire = NULL;
int i;
- int max_pci_bus, firewire_bus = 0, riser_bus = 0, isa_bus;
+ int firewire_bus = 0, riser_bus = 0, isa_bus;
int ioapic_id;
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
@@ -54,14 +54,10 @@
mc->reserved = 0;
smp_write_processors(mc);
- max_pci_bus=0;
firewire = dev_find_device(0x104c, 0x8023, 0);
if (firewire) {
firewire_bus = firewire->bus->secondary;
- printk(BIOS_SPEW, "Firewire device is on bus %x\n",
- firewire_bus);
- max_pci_bus = firewire_bus;
}
// If a riser card is used, this riser is detected on bus 4, so its
secondary bus is the
@@ -71,19 +67,10 @@
riser = dev_find_device(0x3388, 0x0022, 0);
if (riser) {
riser_bus = riser->link_list->secondary;
- printk(BIOS_SPEW, "Riser bus is %x\n", riser_bus);
- max_pci_bus = riser_bus;
}
- /* ISA bus follows */
- isa_bus = max_pci_bus + 1;
+ mptable_write_buses(mc, NULL, &isa_bus);
- /* Bus: Bus ID Type */
- for (i=0; i <= max_pci_bus; i++)
- smp_write_bus(mc, i, "PCI ");
-
- smp_write_bus(mc, isa_bus, "ISA ");
-
/* I/O APICs: APIC ID Version State Address */
ioapic_id = 2;
smp_write_ioapic(mc, ioapic_id, 0x20, 0xfec00000);
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot