[coreboot-gerrit] Patch set updated for coreboot: 8036e31 PCI subsystem: Use subordinate property to track bus enumeration

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Fri Feb 27 19:29:37 CET 2015


Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8537

-gerrit

commit 8036e319eea4a10729927eff53f4d99395547c10
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Mon Feb 23 06:58:26 2015 +0200

    PCI subsystem: Use subordinate property to track bus enumeration
    
    Parameter max is the cumulative number of PCI buses scanned on the
    system so far. Use the property subordinate from the parent PCI bridge
    device to keep track of the first available bus number instead of
    passing that on the stack.
    
    Change-Id: I1a884c98d50fa4f1eb2752e10b778aea8a7b090a
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 src/device/pci_device.c | 29 +++++++++--------------------
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index d3a7865..538ab4c 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -1179,11 +1179,16 @@ static void pci_bridge_route(struct bus *link, scan_state state)
 	struct bus *parent = dev->bus;
 	u32 reg, buses = 0;
 
+	if (state == PCI_ROUTE_SCAN) {
+		link->secondary = parent->subordinate + 1;
+		link->subordinate = link->secondary;
+	}
+
 	if (state == PCI_ROUTE_CLOSE) {
 		buses |= 0xfeff << 8;
 	} else if (state == PCI_ROUTE_SCAN) {
 		buses |= ((u32) link->secondary & 0xff) << 8;
-		buses |= ((u32) link->subordinate & 0xff) << 16;
+		buses |= 0xff << 16; /* MAX PCI_BUS number here */
 	} else if (state == PCI_ROUTE_FINAL) {
 		buses |= parent->secondary & 0xff;
 		buses |= ((u32) link->secondary & 0xff) << 8;
@@ -1210,10 +1215,10 @@ static void pci_bridge_route(struct bus *link, scan_state state)
 
 	if (state == PCI_ROUTE_FINAL) {
 		pci_write_config16(dev, PCI_COMMAND, link->bridge_cmd);
+		parent->subordinate = link->subordinate;
 	}
 }
 
-
 /**
  * Scan a PCI bridge and the buses behind the bridge.
  *
@@ -1249,29 +1254,13 @@ unsigned int do_pci_scan_bridge(struct device *dev, unsigned int max,
 
 	bus = dev->link_list;
 
-	/*
-	 * Set up the primary, secondary and subordinate bus numbers. We have
-	 * no idea how many buses are behind this bridge yet, so we set the
-	 * subordinate bus number to 0xff for the moment.
-	 */
-	bus->secondary = ++max;
-	bus->subordinate = 0xff;
-
 	pci_bridge_route(bus, PCI_ROUTE_SCAN);
 
-	/* Now we can scan all subordinate buses (those behind the bridge). */
-	max = do_scan_bus(bus, 0x00, 0xff, max);
-
-	/*
-	 * We know the number of buses behind this bridge. Set the subordinate
-	 * bus number to its real value.
-	 */
-	bus->subordinate = max;
+	bus->subordinate = do_scan_bus(bus, 0x00, 0xff, bus->secondary);
 
 	pci_bridge_route(bus, PCI_ROUTE_FINAL);
 
-	printk(BIOS_SPEW, "%s returns max %d\n", __func__, max);
-	return max;
+	return bus->subordinate;
 }
 
 /**



More information about the coreboot-gerrit mailing list