From bba113ec073f744cfaf53a59f2712319dae181ec Mon Sep 17 00:00:00 2001 From: Carl-Daniel Hailfinger Date: Thu, 5 Mar 2009 19:33:12 +0000 Subject: If get_pbus() is called for a device which has no parent/ancestor bus with nonzero PCI bus operations, get_pbus() will get stuck in a silent endless loop. Detect the endless loop and break out with an error message. Such a situation can happen if the device tree is not yet initialized/walked completely. This fixes the unexplainable hang if pci_{read,write}_config{8,16,32}was used in early mainboard code for the AMD DBM690T. Instead, the code will now die() with a meaningful error message. Thanks to Ward Vandewege for testing my patches to track down that bug. Signed-off-by: Carl-Daniel Hailfinger Acked-by: Marc Jones git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3972 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/devices/pci_ops.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/devices') diff --git a/src/devices/pci_ops.c b/src/devices/pci_ops.c index a8f09e229d..412b0c5b4b 100644 --- a/src/devices/pci_ops.c +++ b/src/devices/pci_ops.c @@ -28,6 +28,12 @@ static struct bus *get_pbus(device_t dev) { struct bus *pbus = dev->bus; while(pbus && pbus->dev && !ops_pci_bus(pbus)) { + if (pbus == pbus->dev->bus) { + printk_alert("%s in endless loop looking for a parent " + "bus with ops_pci_bus for %s, breaking out\n", + __func__, dev_path(dev)); + break; + } pbus = pbus->dev->bus; } if (!pbus || !pbus->dev || !pbus->dev->ops || !pbus->dev->ops->ops_pci_bus) { -- cgit v1.2.3