Kyösti Mälkki (kyosti.malkki(a)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(a)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(a)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;
}
/**
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8542
-gerrit
commit 90f028606be63400f7710159d33eb845d906433a
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Fri Feb 27 17:24:00 2015 +0200
devicetree: Remove dev_find_slot() implementation in romstage
PCI tree has not been enumerated yet in romstage, so all bridge devices
found in the static devicetree have their secondary bus number initialized to 0.
Change-Id: Ib797210102c942bad3549b756ab0ebe5870b3ce4
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
src/device/device_romstage.c | 24 ------------------------
src/include/device/device.h | 2 --
2 files changed, 26 deletions(-)
diff --git a/src/device/device_romstage.c b/src/device/device_romstage.c
index df0df6a..b28dedf 100644
--- a/src/device/device_romstage.c
+++ b/src/device/device_romstage.c
@@ -31,30 +31,6 @@
ROMSTAGE_CONST struct device * ROMSTAGE_CONST all_devices = &dev_root;
/**
- * Given a PCI bus and a devfn number, find the device structure.
- *
- * @param bus The bus number.
- * @param devfn A device/function number.
- * @return Pointer to the device structure (if found), 0 otherwise.
- */
-ROMSTAGE_CONST struct device *dev_find_slot(unsigned int bus,
- unsigned int devfn)
-{
- ROMSTAGE_CONST struct device *dev, *result;
-
- result = 0;
- for (dev = all_devices; dev; dev = dev->next) {
- if ((dev->path.type == DEVICE_PATH_PCI) &&
- (dev->bus->secondary == bus) &&
- (dev->path.pci.devfn == devfn)) {
- result = dev;
- break;
- }
- }
- return result;
-}
-
-/**
* Given a device pointer, find the next PCI device.
*
* @param previous_dev A pointer to a PCI device structure.
diff --git a/src/include/device/device.h b/src/include/device/device.h
index a09413f..0ead7e2 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -258,8 +258,6 @@ u32 find_pci_tolm(struct bus *bus);
#else /* vv __SIMPLE_DEVICE__ vv */
-ROMSTAGE_CONST struct device * dev_find_slot (unsigned int bus,
- unsigned int devfn);
ROMSTAGE_CONST struct device *dev_find_next_pci_device(
ROMSTAGE_CONST struct device *previous_dev);
ROMSTAGE_CONST struct device * dev_find_slot_on_smbus (unsigned int bus,
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8544
-gerrit
commit e3fa743a4668ffb9fbb421109163326ab18071d7
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Fri Feb 20 20:19:16 2015 +0200
devicetree: Extend scans to all bridge devices
When PCI bridge or PCI-e rootport is disabled in devicetree, it
still must be configured if it cannot be hidden.
For purposes of power-management it may be necessary to enable
bridge to put devices on secondary side, before disabling the
bridge itself.
Change-Id: I710a95fd35543bc4e671c9ac18d7ce22c4df2476
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
src/device/device.c | 3 ---
src/device/pci_device.c | 3 +++
src/device/root_device.c | 8 ++++++++
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/device/device.c b/src/device/device.c
index 832b3a1..42c1080 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -913,9 +913,6 @@ static void scan_bus(struct device *busdev)
{
int do_scan_bus;
- if (!busdev->enabled)
- return;
-
printk(BIOS_SPEW, "%s scanning...\n", dev_path(busdev));
post_log_path(busdev);
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index c505517..86105e2 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -1224,6 +1224,9 @@ void do_pci_scan_bridge(struct device *dev,
{
struct bus *bus;
+ if (!dev->enabled)
+ return;
+
printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(dev));
if (dev->link_list == NULL) {
diff --git a/src/device/root_device.c b/src/device/root_device.c
index a5ecf0e..2620a6c 100644
--- a/src/device/root_device.c
+++ b/src/device/root_device.c
@@ -69,6 +69,11 @@ static void scan_static_bus(device_t bus)
void int scan_lpc_bus(device_t bus)
{
+ struct bus *link;
+
+ if (!bus->enabled)
+ return;
+
printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus));
scan_static_bus(bus);
@@ -81,6 +86,9 @@ void scan_smbus(device_t bus)
device_t child;
struct bus *link;
+ if (!bus->enabled)
+ return;
+
printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus));
max = scan_static_bus(bus, max);