Message ID | 20210817034908.149795-1-alison.schofield@intel.com |
---|---|
State | New, archived |
Headers | show |
Series | [v2] cxl/acpi: Do not add DSDT disabled ACPI0016 host bridge ports | expand |
On Mon, Aug 16, 2021 at 8:39 PM <alison.schofield@intel.com> wrote: > > From: Alison Schofield <alison.schofield@intel.com> > > During CXL ACPI probe, host bridge ports are discovered by scanning > the ACPI0017 root port for ACPI0016 host bridge devices. The scan > matches on the hardware id of "ACPI0016". An issue occurs when an > ACPI0016 device is defined in the DSDT yet disabled on the platform. > Attempts by the cxl_acpi driver to add host bridge ports using a > disabled device fails, and the entire cxl_acpi probe fails. > > The DSDT table includes an _STA method that sets the status and the > ACPI subsystem has checks available to examine it. One such check is > in the acpi_pci_find_root() path. Move the call to acpi_pci_find_root() > to the matching function to prevent this issue when adding either > upstream or downstream ports. > > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Signed-off-by: Alison Schofield <alison.schofield@intel.com> > --- > Changes v2: > - make subject line appear in mail header Nice, looks good. I'll fold this in before cxl_test since it's a fix we'll want to get into v5.14.
diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c index ab0ede9a526c..69c4bf18b449 100644 --- a/drivers/cxl/acpi.c +++ b/drivers/cxl/acpi.c @@ -249,6 +249,9 @@ __weak struct acpi_device *to_cxl_host_bridge(struct device *host, { struct acpi_device *adev = to_acpi_device(dev); + if (!acpi_pci_find_root(adev->handle)) + return NULL; + if (strcmp(acpi_device_hid(adev), "ACPI0016") == 0) { dev_dbg(host, "found host bridge %s\n", dev_name(&adev->dev)); return adev; @@ -274,10 +277,6 @@ static int add_host_bridge_uport(struct device *match, void *arg) if (!bridge) return 0; - pci_root = acpi_pci_find_root(bridge->handle); - if (!pci_root) - return -ENXIO; - dport = find_dport_by_dev(root_port, match); if (!dport) { dev_dbg(host, "host bridge expected and not found\n"); @@ -290,6 +289,7 @@ static int add_host_bridge_uport(struct device *match, void *arg) return PTR_ERR(port); dev_dbg(host, "%s: add: %s\n", dev_name(match), dev_name(&port->dev)); + pci_root = acpi_pci_find_root(bridge->handle); ctx = (struct cxl_walk_context){ .dev = host, .root = pci_root->bus,