Author: hailfinger Date: 2009-03-05 20:33:12 +0100 (Thu, 05 Mar 2009) New Revision: 3972
Modified: trunk/coreboot-v2/src/devices/pci_ops.c Log: 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 c-d.hailfinger.devel.2006@gmx.net Acked-by: Marc Jones marcj303@gmail.com
Modified: trunk/coreboot-v2/src/devices/pci_ops.c =================================================================== --- trunk/coreboot-v2/src/devices/pci_ops.c 2009-03-05 19:24:22 UTC (rev 3971) +++ trunk/coreboot-v2/src/devices/pci_ops.c 2009-03-05 19:33:12 UTC (rev 3972) @@ -28,6 +28,12 @@ { 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) {