Skip to content

Commit a7bfaad

Browse files
AlisonSchofielddjbw
authored andcommitted
cxl/acpi: Do not add DSDT disabled ACPI0016 host bridge ports
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 <[email protected]> Signed-off-by: Alison Schofield <[email protected]> Fixes: 7d4b5ca ("cxl/acpi: Add downstream port data to cxl_port instances") Cc: <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]> Link: https://lore.kernel.org/r/163072203957.2250120.2178685721061002124.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <[email protected]>
1 parent a6e6d72 commit a7bfaad

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

drivers/cxl/acpi.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ static struct acpi_device *to_cxl_host_bridge(struct device *dev)
243243
{
244244
struct acpi_device *adev = to_acpi_device(dev);
245245

246+
if (!acpi_pci_find_root(adev->handle))
247+
return NULL;
248+
246249
if (strcmp(acpi_device_hid(adev), "ACPI0016") == 0)
247250
return adev;
248251
return NULL;
@@ -266,10 +269,6 @@ static int add_host_bridge_uport(struct device *match, void *arg)
266269
if (!bridge)
267270
return 0;
268271

269-
pci_root = acpi_pci_find_root(bridge->handle);
270-
if (!pci_root)
271-
return -ENXIO;
272-
273272
dport = find_dport_by_dev(root_port, match);
274273
if (!dport) {
275274
dev_dbg(host, "host bridge expected and not found\n");
@@ -282,6 +281,11 @@ static int add_host_bridge_uport(struct device *match, void *arg)
282281
return PTR_ERR(port);
283282
dev_dbg(host, "%s: add: %s\n", dev_name(match), dev_name(&port->dev));
284283

284+
/*
285+
* Note that this lookup already succeeded in
286+
* to_cxl_host_bridge(), so no need to check for failure here
287+
*/
288+
pci_root = acpi_pci_find_root(bridge->handle);
285289
ctx = (struct cxl_walk_context){
286290
.dev = host,
287291
.root = pci_root->bus,

0 commit comments

Comments
 (0)