diff options
author | Patrick Rudolph <siro@das-labor.org> | 2015-12-28 12:59:47 +0100 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2016-02-04 01:44:40 +0100 |
commit | 0e06f5bd70b45fd330d8dfb1dc77cce043caf841 (patch) | |
tree | 05ab7ad973378360c541da424b48eb64c16ef06e | |
parent | a1c3beddbb197b3b8b92c7e236f72fd4425518ce (diff) |
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>
-rw-r--r-- | src/northbridge/intel/gm45/northbridge.c | 14 | ||||
-rw-r--r-- | 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 ce75aea442..84df62dd32 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 && 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 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; } |