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> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5647 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
43c970f56a
commit
ab272664ee
|
@ -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, 0xe, apicid, 0xe);
|
||||||
smp_write_intsrc(mc, mp_INT, MP_IRQ_TRIGGER_EDGE|MP_IRQ_POLARITY_HIGH, bus_isa, 0xf, apicid, 0xf);
|
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 ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,7 @@ void *smp_write_floating_table_physaddr(unsigned long addr,
|
||||||
unsigned long write_smp_table(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_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
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ static void *smp_write_config_table(void *v)
|
||||||
struct mp_config_table *mc;
|
struct mp_config_table *mc;
|
||||||
struct device *riser = NULL, *firewire = NULL;
|
struct device *riser = NULL, *firewire = NULL;
|
||||||
int i;
|
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;
|
int ioapic_id;
|
||||||
|
|
||||||
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
|
mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
|
||||||
|
@ -54,14 +54,10 @@ static void *smp_write_config_table(void *v)
|
||||||
mc->reserved = 0;
|
mc->reserved = 0;
|
||||||
|
|
||||||
smp_write_processors(mc);
|
smp_write_processors(mc);
|
||||||
max_pci_bus=0;
|
|
||||||
|
|
||||||
firewire = dev_find_device(0x104c, 0x8023, 0);
|
firewire = dev_find_device(0x104c, 0x8023, 0);
|
||||||
if (firewire) {
|
if (firewire) {
|
||||||
firewire_bus = firewire->bus->secondary;
|
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
|
// 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);
|
riser = dev_find_device(0x3388, 0x0022, 0);
|
||||||
if (riser) {
|
if (riser) {
|
||||||
riser_bus = riser->link_list->secondary;
|
riser_bus = riser->link_list->secondary;
|
||||||
printk(BIOS_SPEW, "Riser bus is %x\n", riser_bus);
|
|
||||||
max_pci_bus = riser_bus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ISA bus follows */
|
mptable_write_buses(mc, NULL, &isa_bus);
|
||||||
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 ");
|
|
||||||
|
|
||||||
/* I/O APICs: APIC ID Version State Address */
|
/* I/O APICs: APIC ID Version State Address */
|
||||||
ioapic_id = 2;
|
ioapic_id = 2;
|
||||||
|
|
Loading…
Reference in New Issue