[coreboot] r3972 - trunk/coreboot-v2/src/devices

svn at coreboot.org svn at coreboot.org
Thu Mar 5 20:33:12 CET 2009


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 at gmx.net>
Acked-by: Marc Jones <marcj303 at 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) {





More information about the coreboot mailing list