[coreboot] New patch to review for coreboot: a61b7e4 libpayload: Handle multifunction bridge devices better.

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Tue Feb 26 01:26:39 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2517

-gerrit

commit a61b7e41c6cbdf01a8e459e3715520de27d2b720
Author: Gabe Black <gabeblack at google.com>
Date:   Thu Nov 8 19:31:23 2012 -0800

    libpayload: Handle multifunction bridge devices better.
    
    This change modifies the code in libpayload that scans the PCI hierarchy for
    USB controllers. Previously, if a devices primary function (function 0) was a
    bridge, then none of the other functions, if any, would be looked at. If one
    of the other functions was a bridge, that wouldn't be handled either. The new
    version looks at each function that's present no matter what, and if it
    discovers that it's a bridge it scans the other side.
    
    Change-Id: I37f269a4fe505fd32d9594e2daf17ddd78609c15
    Signed-off-by: Gabe Black <gabeblack at google.com>
---
 payloads/libpayload/drivers/usb/usbinit.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/usbinit.c b/payloads/libpayload/drivers/usb/usbinit.c
index 2e466d3..36cf5e4 100644
--- a/payloads/libpayload/drivers/usb/usbinit.c
+++ b/payloads/libpayload/drivers/usb/usbinit.c
@@ -126,14 +126,6 @@ static void usb_scan_pci_bus(int bus)
 		if (pci_read_config32(addr, REG_VENDOR_ID) == 0xffff)
 			continue;
 		header_type = pci_read_config8(addr, REG_HEADER_TYPE);
-		/* If this is a bridge, scan the bus on the other side. */
-		if ((header_type & ~HEADER_TYPE_MULTIFUNCTION) ==
-				HEADER_TYPE_BRIDGE) {
-			int sub_bus =
-				pci_read_config8(addr, REG_SECONDARY_BUS);
-			usb_scan_pci_bus(sub_bus);
-			continue;
-		}
 		/*
 		 * EHCI is defined by standards to be at a higher function
 		 * than the USB1 controllers. We don't want to init USB1 +
@@ -141,11 +133,22 @@ static void usb_scan_pci_bus(int bus)
 		 * comes first.
 		 */
 		/* Check for a multifunction device. */
+		int top_func = 0;
 		if (header_type & HEADER_TYPE_MULTIFUNCTION)
-			for (func = 7; func > 0; func--)
+			top_func = 7;
+		for (func = top_func; func >= 0; func--) {
+			addr = PCI_DEV(bus, dev, func);
+			header_type = pci_read_config8(addr, REG_HEADER_TYPE);
+			/* If this is a bridge, scan the other side. */
+			if ((header_type & ~HEADER_TYPE_MULTIFUNCTION) ==
+					HEADER_TYPE_BRIDGE) {
+				int sub_bus = pci_read_config8(addr,
+					REG_SECONDARY_BUS);
+				usb_scan_pci_bus(sub_bus);
+			} else {
 				usb_controller_initialize(bus, dev, func);
-		/* Initialize function 0. */
-		usb_controller_initialize(bus, dev, 0);
+			}
+		}
 	}
 }
 



More information about the coreboot mailing list