summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/pcie/generic/chip.h8
-rw-r--r--src/drivers/pcie/generic/generic.c27
2 files changed, 27 insertions, 8 deletions
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 = {