Patchwork Build mptable bus entries from device tree

login
register
about
Submitter Patrick Georgi
Date 2010-06-25 13:06:56
Message ID <4C24A9F0.8030307@georgi-clan.de>
Download mbox | patch
Permalink /patch/1554/
State Accepted
Headers show

Comments

Patrick Georgi - 2010-06-25 13:06:56
Hi,

attached patch adds code to create bus entries in the mptable from the
device tree instead of the hardcodes we do right now.

It also changes kontron/986lcd-m to use the new function, where its
advantage is starting to show:
As we support a given riser card (with pci bridge and bus), we currently
have to look for the card and add a bus and interrupt sources to the
mptable. With this patch, the bus is automatically added to the table.
Once interrupt sources are handled the same way, that special case could
be dropped completely (and such plug-in cards that add buses will be
properly supported on all boards)

I didn't adapt all the mptable.c files in the tree, as I feel the code
should be tested on a more diverse set of boards. Our table generation
code sometimes differs only so slightly, and I don't know in all cases
if the automatic handling would pick up those differences, or if they
actually matter (or are correct in the first place).

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Peter Stuge - 2010-06-25 13:23:09
Patrick Georgi wrote:
> attached patch adds code to create bus entries in the mptable from
> the device tree instead of the hardcodes we do right now.

\o/

> Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>

Acked-by: Peter Stuge <peter@stuge.se>

I think it would be great to write a few lines about what changes
need to be made for boards to use this. Maybe on the wiki?


//Peter
Patrick Georgi - 2010-06-25 13:44:59
Am 25.06.2010 15:23, schrieb Peter Stuge:
> Acked-by: Peter Stuge <peter@stuge.se>
Committed as r5647

> I think it would be great to write a few lines about what changes
> need to be made for boards to use this. Maybe on the wiki?
I was thinking of adding this to http://www.coreboot.org/Flag_Days
The main difference to the existing documentation on that page is that
it is about changes that were implemented across the entire tree.
This change only affects a single board so far.

I'll do it this way:
A Flag_Days entry now, documenting the new function and how to migrate
boards.
Another Flag_Days entry once all upstream boards are migrated, while
making smp_write_bus (the "plumbing" function used for this) static (ie.
private)


Patrick

Patch

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