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);
