nb/intel/nehalem: Disable PEG and IGD based on devicetree

Tested on Thinkpad X201: PEG device hidden.

Change-Id: Ib378458a55e18cc02fc49b3e6d6939d31dd4aa65
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/35744
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Arthur Heymans 2019-10-01 21:20:33 +02:00
parent 6d13a0a78a
commit 28bca0546b
4 changed files with 26 additions and 3 deletions

View File

@ -48,6 +48,7 @@ chip northbridge/intel/nehalem
device pci 00.0 on # Host bridge device pci 00.0 on # Host bridge
subsystemid 0x17aa 0x2193 subsystemid 0x17aa 0x2193
end end
device pci 01.0 off end # PEG
device pci 02.0 on # VGA controller device pci 02.0 on # VGA controller
subsystemid 0x17aa 0x215a subsystemid 0x17aa 0x215a
end end

View File

@ -48,6 +48,7 @@ chip northbridge/intel/nehalem
device pci 00.0 on # Host bridge device pci 00.0 on # Host bridge
subsystemid 0x1025 0x0379 subsystemid 0x1025 0x0379
end end
device pci 01.0 off end # PEG
device pci 02.0 on # VGA controller device pci 02.0 on # VGA controller
subsystemid 0x1025 0x0379 subsystemid 0x1025 0x0379
end end

View File

@ -67,8 +67,6 @@ typedef struct {
#define D0F0_MCHBAR_HI 0x4c #define D0F0_MCHBAR_HI 0x4c
#define D0F0_GGC 0x52 #define D0F0_GGC 0x52
#define D0F0_DEVEN 0x54 #define D0F0_DEVEN 0x54
/* Note: Intel's datasheet is broken. Assume the following values are correct */
#define DEVEN_PEG60 (1 << 13)
#define DEVEN_IGD (1 << 3) #define DEVEN_IGD (1 << 3)
#define DEVEN_PEG10 (1 << 1) #define DEVEN_PEG10 (1 << 1)
#define DEVEN_HOST (1 << 0) #define DEVEN_HOST (1 << 0)

View File

@ -229,6 +229,28 @@ static void northbridge_init(struct device *dev)
northbridge_dmi_init(dev); northbridge_dmi_init(dev);
} }
/* Disable unused PEG devices based on devicetree before PCI enumeration */
static void nehalem_init(void *const chip_info)
{
u32 deven_mask = UINT32_MAX;
const struct device *dev;
dev = pcidev_on_root(1, 0);
if (!dev || !dev->enabled) {
printk(BIOS_DEBUG, "Disabling PEG10.\n");
deven_mask &= ~DEVEN_PEG10;
}
dev = pcidev_on_root(2, 0);
if (!dev || !dev->enabled) {
printk(BIOS_DEBUG, "Disabling IGD.\n");
deven_mask &= ~DEVEN_IGD;
}
const struct device *const d0f0 = pcidev_on_root(0, 0);
if (d0f0)
pci_update_config32(d0f0, D0F0_DEVEN, deven_mask, 0);
}
static struct pci_operations intel_pci_ops = { static struct pci_operations intel_pci_ops = {
.set_subsystem = pci_dev_set_subsystem, .set_subsystem = pci_dev_set_subsystem,
}; };
@ -269,5 +291,6 @@ static void enable_dev(struct device *dev)
struct chip_operations northbridge_intel_nehalem_ops = { struct chip_operations northbridge_intel_nehalem_ops = {
CHIP_NAME("Intel i7 (Nehalem) integrated Northbridge") CHIP_NAME("Intel i7 (Nehalem) integrated Northbridge")
.enable_dev = enable_dev, .enable_dev = enable_dev,
.init = nehalem_init,
}; };