From 4323d262473a1ea09eb3f843c4e856eb5851146f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ky=C3=B6sti=20M=C3=A4lkki?= Date: Fri, 12 Jul 2019 16:20:14 +0300 Subject: devicetree: Add accessors for chip_info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply uniform style of error messages for missing device nodes and chip_info. Change-Id: I70def4599509b8193e44ea3f02c4906f865b4469 Signed-off-by: Kyösti Mälkki Reviewed-on: https://review.coreboot.org/c/coreboot/+/34298 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh --- src/device/device_const.c | 12 +++++++++++- src/include/device/device.h | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/device/device_const.c b/src/device/device_const.c index f2f0177f57..c472aeaa79 100644 --- a/src/device/device_const.c +++ b/src/device/device_const.c @@ -240,12 +240,22 @@ DEVTREE_CONST struct device *pcidev_path_on_root_debug(pci_devfn_t devfn, const if (dev) return dev; - printk(BIOS_ERR, "BUG: %s requests hidden 00:%02x.%u\n", func, devfn >> 3, devfn & 7); + devtree_bug(func, devfn); /* FIXME: This can return wrong device. */ return dev_find_slot(0, devfn); } +void devtree_bug(const char *func, pci_devfn_t devfn) +{ + printk(BIOS_ERR, "BUG: %s requests hidden 00:%02x.%u\n", func, devfn >> 3, devfn & 7); +} + +void __noreturn devtree_die(void) +{ + die("DEVTREE: dev or chip_info is NULL\n"); +} + /** * Given an SMBus bus and a device number, find the device structure. * diff --git a/src/include/device/device.h b/src/include/device/device.h index 4ffbff4ac9..8e1e62aa7c 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -294,6 +294,30 @@ DEVTREE_CONST struct bus *pci_root_bus(void); DEVTREE_CONST struct device *dev_find_slot(unsigned int bus, unsigned int devfn); DEVTREE_CONST struct device *pcidev_path_on_root_debug(pci_devfn_t devfn, const char *func); +/* Robust discovery of chip_info. */ +void devtree_bug(const char *func, pci_devfn_t devfn); +void __noreturn devtree_die(void); + +static inline DEVTREE_CONST void *config_of(const struct device *dev) +{ + if (dev && dev->chip_info) + return dev->chip_info; + + devtree_die(); +} + +static inline DEVTREE_CONST void *config_of_path(pci_devfn_t devfn) +{ + const struct device *dev = pcidev_path_on_root(devfn); + if (dev) + return config_of(dev); + + devtree_bug(__func__, devfn); + + dev = dev_find_slot(0, devfn); + return config_of(dev); +} + void scan_smbus(struct device *bus); void scan_generic_bus(struct device *bus); void scan_static_bus(struct device *bus); -- cgit v1.2.3