From 1ac2cc253b120e5fcd8d3cb477724c36b5f35cb5 Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Thu, 13 Feb 2020 13:00:41 +0100 Subject: superio/common: Validate devicetree As the SSDT generator for LDNs expects a "parent" PNP device for proper ACPI code generation, validate that it is present. Make sure the devicetree looks as expected and print a BUG message if that's not the case. Tested on HP Z220: No BUG message was printed. Change-Id: I6cbcba8ac86a2a837e23055fdd7e529f9b3277a2 Signed-off-by: Patrick Rudolph Reviewed-on: https://review.coreboot.org/c/coreboot/+/38863 Tested-by: build bot (Jenkins) Reviewed-by: Felix Held Reviewed-by: Angel Pons --- src/superio/common/ssdt.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/superio') diff --git a/src/superio/common/ssdt.c b/src/superio/common/ssdt.c index 7aa24ea794..e31660fad1 100644 --- a/src/superio/common/ssdt.c +++ b/src/superio/common/ssdt.c @@ -162,12 +162,33 @@ static const char *name_from_hid(const char *hid) void superio_common_fill_ssdt_generator(struct device *dev) { + if (!dev || !dev->bus || !dev->bus->dev) { + printk(BIOS_CRIT, "BUG: Invalid argument in %s!\n", __func__); + return; + } + const char *scope = acpi_device_scope(dev); const char *name = acpi_device_name(dev); const u8 ldn = dev->path.pnp.device & 0xff; const u8 vldn = (dev->path.pnp.device >> 8) & 0x7; const char *hid; + /* Validate devicetree settings */ + bool bug = false; + if (dev->bus->dev->path.type != DEVICE_PATH_PNP) { + bug = true; + printk(BIOS_CRIT, "BUG: Parent of device %s is not a PNP device\n", + dev_path(dev)); + } else if (dev->bus->dev->path.pnp.port != dev->path.pnp.port) { + bug = true; + printk(BIOS_CRIT, "BUG: Parent of device %s has wrong I/O port\n", + dev_path(dev)); + } + if (bug) { + printk(BIOS_CRIT, "BUG: Check your devicetree!\n"); + return; + } + if (!scope || !name) { printk(BIOS_ERR, "%s: Missing ACPI path/scope\n", dev_path(dev)); return; -- cgit v1.2.3