summaryrefslogtreecommitdiff
path: root/src/northbridge/intel/sandybridge/northbridge.c
diff options
context:
space:
mode:
authorPatrick Rudolph <siro@das-labor.org>2015-12-28 12:59:47 +0100
committerMartin Roth <martinroth@google.com>2016-02-04 01:44:40 +0100
commit0e06f5bd70b45fd330d8dfb1dc77cce043caf841 (patch)
tree05ab7ad973378360c541da424b48eb64c16ef06e /src/northbridge/intel/sandybridge/northbridge.c
parenta1c3beddbb197b3b8b92c7e236f72fd4425518ce (diff)
downloadcoreboot-0e06f5bd70b45fd330d8dfb1dc77cce043caf841.tar.xz
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@das-labor.org> Reviewed-on: https://review.coreboot.org/12894 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src/northbridge/intel/sandybridge/northbridge.c')
-rw-r--r--src/northbridge/intel/sandybridge/northbridge.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/northbridge/intel/sandybridge/northbridge.c b/src/northbridge/intel/sandybridge/northbridge.c
index 53d93a2501..3974fe895c 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;
}