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 patrick.georgi@coresystems.de Acked-by: Peter Stuge peter@stuge.se
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;