diff --git a/src/drivers/pcie/generic/chip.h b/src/drivers/pcie/generic/chip.h index 3be57de530..5d762ec250 100644 --- a/src/drivers/pcie/generic/chip.h +++ b/src/drivers/pcie/generic/chip.h @@ -7,6 +7,14 @@ struct drivers_pcie_generic_config { bool is_untrusted; + /* + * This needs to be pointed to the device instance in the device tree when + * there is already a device with the root port so that the ACPI code to be + * generated will be added to that existing device. + * By default, an ACPI device named 'DEV0' is created under the root port if + * this does not reference to a device. + */ + DEVTREE_CONST struct device *companion_dev; }; #endif /* _PCIE_GENERIC_H_ */ diff --git a/src/drivers/pcie/generic/generic.c b/src/drivers/pcie/generic/generic.c index c14628f65b..0a9a243518 100644 --- a/src/drivers/pcie/generic/generic.c +++ b/src/drivers/pcie/generic/generic.c @@ -9,6 +9,10 @@ static const char *pcie_generic_acpi_name(const struct device *dev) { + struct drivers_pcie_generic_config *config = dev->chip_info; + + if (config->companion_dev) + return acpi_device_name(config->companion_dev); return "DEV0"; } @@ -26,22 +30,29 @@ static void pcie_generic_fill_ssdt(const struct device *dev) if (!config || !config->is_untrusted || !dev->bus || !dev->bus->dev) return; - const char *scope = acpi_device_path(dev->bus->dev); - const char *name = acpi_device_name(dev); + const char *scope; + const char *name; + /* Code will be generated under companion device instead if present. */ + if (config->companion_dev) + scope = acpi_device_path(config->companion_dev); + else + scope = acpi_device_path(dev->bus->dev); + name = acpi_device_name(dev); acpigen_write_scope(scope); - acpigen_write_device(name); - acpigen_write_ADR_pci_device(dev); - + if (!config->companion_dev) { + acpigen_write_device(name); + acpigen_write_ADR_pci_device(dev); + } dsd = acpi_dp_new_table("_DSD"); acpi_dp_add_integer(dsd, "DmaProperty", 1); acpi_dp_write(dsd); - - acpigen_write_device_end(); + if (!config->companion_dev) + acpigen_write_device_end(); acpigen_write_scope_end(); printk(BIOS_INFO, "%s.%s: Enable ACPI properties for %s (%s)\n", scope, name, - dev_path(dev), dev->chip_ops->name); + dev_path(dev), dev->chip_ops->name); } struct device_operations pcie_generic_ops = {