Add new function to create all mptable entries for buses by
authorPatrick Georgi <patrick.georgi@coresystems.de>
Fri, 25 Jun 2010 13:43:22 +0000 (13:43 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Fri, 25 Jun 2010 13:43:22 +0000 (13:43 +0000)
reading that information from the device tree.

Use this function on kontron/986lcd-m

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5647 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/arch/i386/boot/mpspec.c
src/arch/i386/include/arch/smp/mpspec.h
src/mainboard/kontron/986lcd-m/mptable.c

index 57a10ac670543e0be23ea8563662699199f2edee..031f326b640bf28062fd72b8765d34930119ec9c 100644 (file)
@@ -323,3 +323,37 @@ void mptable_add_isa_interrupts(struct mp_config_table *mc, unsigned long bus_is
        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 2d5c88f3439176adea8eef846868838008035b21..9b4a6281b7373a76c34397325d86ee84f23233e4 100644 (file)
@@ -274,6 +274,7 @@ void *smp_write_floating_table_physaddr(unsigned long addr,
 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 cfa7cb7cdcaeb9933e7577451ac78e6dbb73687e..6d15f56da96a8eb34f314b43d1058d60dfb24478 100644 (file)
@@ -33,7 +33,7 @@ static void *smp_write_config_table(void *v)
         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 @@ static void *smp_write_config_table(void *v)
         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,18 +67,9 @@ static void *smp_write_config_table(void *v)
                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;
-
-       /* 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   ");
+       mptable_write_buses(mc, NULL, &isa_bus);
 
        /* I/O APICs:   APIC ID Version State           Address */
        ioapic_id = 2;