aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge
diff options
context:
space:
mode:
authorAngel Pons <th3fanbus@gmail.com>2021-06-20 14:15:44 +0200
committerPatrick Georgi <pgeorgi@google.com>2021-06-22 04:47:20 +0000
commit6adbfa79aa4885f7d06cd07063db2c84de832629 (patch)
tree6494bb165a918f418e7db6ca459d8cd66575f578 /src/northbridge
parent6e0dd4e4ffd850d48849907c815fbef50092aa17 (diff)
nb/intel/haswell/pcie.c: Avoid needless death
Using `config_of(dev)` to access `dev->chip_info` will make coreboot die if the latter is NULL, which is the case for devices detected at runtime (i.e. not statically declared in the devicetree). Given that the code is designed to work when the PEG config is all-zeroes (devicetree default), dying because `dev->chip_info` is NULL is foolish and unwarranted. Introduce a helper function that returns a pointer to devicetree config when available, and otherwise returns a pointer to a zero-filled static struct. In addition, avoid an out-of-bounds access in the very unlikely case where the device's function is too large. Tested on Asrock B85M Pro4, can now boot when `device pci 01.0 on end` is commented out in its devicetree. Without this commit, it could not. Change-Id: Ia2d3a03da9eab601fb834b0c51a8a51c9ae14c33 Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/55690 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de>
Diffstat (limited to 'src/northbridge')
-rw-r--r--src/northbridge/intel/haswell/pcie.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/northbridge/intel/haswell/pcie.c b/src/northbridge/intel/haswell/pcie.c
index cea3f6ac84..95c0240ed3 100644
--- a/src/northbridge/intel/haswell/pcie.c
+++ b/src/northbridge/intel/haswell/pcie.c
@@ -46,15 +46,28 @@ static const char *pcie_acpi_name(const struct device *dev)
}
#endif
-static void peg_enable(struct device *dev)
+static const struct peg_config *get_peg_config(struct device *dev, const uint8_t func)
{
- const struct northbridge_intel_haswell_config *config = config_of(dev);
+ static const struct peg_config default_config = { 0 };
- const uint8_t func = PCI_FUNC(dev->path.pci.devfn);
+ if (!dev || !dev->chip_info)
+ return &default_config;
+
+ const struct northbridge_intel_haswell_config *config = dev->chip_info;
- assert(func < ARRAY_SIZE(config->peg_cfg));
+ if (func >= ARRAY_SIZE(config->peg_cfg)) {
+ printk(BIOS_ERR, "%s: Found PEG function %u, which doesn't exist on Haswell\n",
+ __func__, func);
+ return &default_config;
+ }
+ return &config->peg_cfg[func];
+}
+
+static void peg_enable(struct device *dev)
+{
+ const uint8_t func = PCI_FUNC(dev->path.pci.devfn);
- const struct peg_config *peg_cfg = &config->peg_cfg[func];
+ const struct peg_config *peg_cfg = get_peg_config(dev, func);
const bool slot_implemented = !peg_cfg->is_onboard;