Author: oxygene
Date: Fri Jun 25 15:43:22 2010
New Revision: 5647
URL: https://tracker.coreboot.org/trac/coreboot/changeset/5647

Log:
Add new function to create all mptable entries for buses by
reading that information from the device tree.

Use this function on kontron/986lcd-m

Signed-off-by: Patrick Georgi <[email protected]>
Acked-by: Peter Stuge <[email protected]>

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

Modified: trunk/src/arch/i386/boot/mpspec.c
==============================================================================
--- trunk/src/arch/i386/boot/mpspec.c   Thu Jun 24 16:43:17 2010        (r5646)
+++ trunk/src/arch/i386/boot/mpspec.c   Fri Jun 25 15:43:22 2010        (r5647)
@@ -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   ");
+}
+

Modified: trunk/src/arch/i386/include/arch/smp/mpspec.h
==============================================================================
--- trunk/src/arch/i386/include/arch/smp/mpspec.h       Thu Jun 24 16:43:17 
2010        (r5646)
+++ trunk/src/arch/i386/include/arch/smp/mpspec.h       Fri Jun 25 15:43:22 
2010        (r5647)
@@ -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
 

Modified: trunk/src/mainboard/kontron/986lcd-m/mptable.c
==============================================================================
--- trunk/src/mainboard/kontron/986lcd-m/mptable.c      Thu Jun 24 16:43:17 
2010        (r5646)
+++ trunk/src/mainboard/kontron/986lcd-m/mptable.c      Fri Jun 25 15:43:22 
2010        (r5647)
@@ -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,18 +67,9 @@
                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;

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to