devicetree: Add accessors for chip_info

Apply uniform style of error messages for missing device
nodes and chip_info.

Change-Id: I70def4599509b8193e44ea3f02c4906f865b4469
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34298
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 4ffbff4..8e1e62a 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -294,6 +294,30 @@
 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);