[coreboot-gerrit] Patch set updated for coreboot: northbridge/intel/peg: disable unused ports

Patrick Rudolph (siro@das-labor.org) gerrit at coreboot.org
Fri Jan 15 10:53:44 CET 2016


Patrick Rudolph (siro at das-labor.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/12894

-gerrit

commit 5a645646c138b34f7561a8217e804400d0c864e8
Author: Patrick Rudolph <siro at das-labor.org>
Date:   Mon Dec 28 12:59:47 2015 +0100

    northbridge/intel/peg: disable unused ports
    
    Walk the bus and try to find enabled devices.
    Disable the PEG port if no devices are attached.
    
    Change-Id: I67fcc831fd78ecc6dba83f4e0662ec7549cc2591
    Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
 src/northbridge/intel/gm45/northbridge.c        | 14 ++++++++++++-
 src/northbridge/intel/sandybridge/northbridge.c | 26 ++++++++++++++++++++-----
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/northbridge/intel/gm45/northbridge.c b/src/northbridge/intel/gm45/northbridge.c
index ce75aea..fcaef0c 100644
--- a/src/northbridge/intel/gm45/northbridge.c
+++ b/src/northbridge/intel/gm45/northbridge.c
@@ -243,6 +243,17 @@ static void enable_dev(device_t dev)
 	}
 }
 
+static u8 scan_bus_unused(struct bus *link)
+{
+	struct device *dev;
+
+	for (dev = link->children; dev; dev = dev->sibling) {
+		if (dev->enabled)
+			return 0;
+	}
+	return 1;
+}
+
 static void gm45_init(void *const chip_info)
 {
 	int dev, fn, bit_base;
@@ -268,7 +279,8 @@ static void gm45_init(void *const chip_info)
 		for (; fn >= 0; --fn) {
 			const struct device *const d =
 				dev_find_slot(0, PCI_DEVFN(dev, fn));
-			if (!d || d->enabled) continue;
+			if (d->enabled && d->link_list && !scan_bus_unused(d->link_list))
+				continue;
 			const u32 deven = pci_read_config32(d0f0, D0F0_DEVEN);
 			pci_write_config32(d0f0, D0F0_DEVEN,
 					   deven & ~(1 << (bit_base + fn)));
diff --git a/src/northbridge/intel/sandybridge/northbridge.c b/src/northbridge/intel/sandybridge/northbridge.c
index 53d93a2..3974fe8 100644
--- a/src/northbridge/intel/sandybridge/northbridge.c
+++ b/src/northbridge/intel/sandybridge/northbridge.c
@@ -368,6 +368,17 @@ static void northbridge_dmi_init(struct device *dev)
 	DMIBAR32(0x88) = reg32;
 }
 
+static u8 scan_bus_unused(struct bus *link)
+{
+	struct device *dev;
+
+	for (dev = link->children; dev; dev = dev->sibling) {
+		if (dev->enabled)
+			return 0;
+	}
+	return 1;
+}
+
 /* Disable unused PEG devices based on devicetree */
 static void disable_peg(void)
 {
@@ -378,27 +389,32 @@ static void disable_peg(void)
 	reg = pci_read_config32(dev, DEVEN);
 
 	dev = dev_find_slot(0, PCI_DEVFN(1, 2));
-	if (!dev || !dev->enabled) {
+	if (!dev || !dev->enabled ||
+			(dev->link_list && scan_bus_unused(dev->link_list))) {
 		printk(BIOS_DEBUG, "Disabling PEG12.\n");
 		reg &= ~DEVEN_PEG12;
 	}
 	dev = dev_find_slot(0, PCI_DEVFN(1, 1));
-	if (!dev || !dev->enabled) {
+	if (!dev || !dev->enabled ||
+			(dev->link_list && scan_bus_unused(dev->link_list))) {
 		printk(BIOS_DEBUG, "Disabling PEG11.\n");
 		reg &= ~DEVEN_PEG11;
 	}
 	dev = dev_find_slot(0, PCI_DEVFN(1, 0));
-	if (!dev || !dev->enabled) {
+	if (!dev || !dev->enabled ||
+			(dev->link_list && scan_bus_unused(dev->link_list))) {
 		printk(BIOS_DEBUG, "Disabling PEG10.\n");
 		reg &= ~DEVEN_PEG10;
 	}
 	dev = dev_find_slot(0, PCI_DEVFN(2, 0));
-	if (!dev || !dev->enabled) {
+	if (!dev || !dev->enabled ||
+			(dev->link_list && scan_bus_unused(dev->link_list))) {
 		printk(BIOS_DEBUG, "Disabling IGD.\n");
 		reg &= ~DEVEN_IGD;
 	}
 	dev = dev_find_slot(0, PCI_DEVFN(6, 0));
-	if (!dev || !dev->enabled) {
+	if (!dev || !dev->enabled ||
+			(dev->link_list && scan_bus_unused(dev->link_list))) {
 		printk(BIOS_DEBUG, "Disabling PEG60.\n");
 		reg &= ~DEVEN_PEG60;
 	}



More information about the coreboot-gerrit mailing list