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 <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38863
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Patrick Rudolph 2020-02-13 13:00:41 +01:00 committed by Felix Held
parent 2f55726609
commit 1ac2cc253b
1 changed files with 21 additions and 0 deletions

View File

@ -162,12 +162,33 @@ static const char *name_from_hid(const char *hid)
void superio_common_fill_ssdt_generator(struct device *dev) 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 *scope = acpi_device_scope(dev);
const char *name = acpi_device_name(dev); const char *name = acpi_device_name(dev);
const u8 ldn = dev->path.pnp.device & 0xff; const u8 ldn = dev->path.pnp.device & 0xff;
const u8 vldn = (dev->path.pnp.device >> 8) & 0x7; const u8 vldn = (dev->path.pnp.device >> 8) & 0x7;
const char *hid; 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) { if (!scope || !name) {
printk(BIOS_ERR, "%s: Missing ACPI path/scope\n", dev_path(dev)); printk(BIOS_ERR, "%s: Missing ACPI path/scope\n", dev_path(dev));
return; return;