cxl/acpi: Do not fail cxl_acpi_probe() based on a missing CHBS
authorAlison Schofield <alison.schofield@intel.com>
Thu, 7 Oct 2021 21:34:26 +0000 (14:34 -0700)
committerDan Williams <dan.j.williams@intel.com>
Fri, 8 Oct 2021 08:05:31 +0000 (01:05 -0700)
When an ACPI0016 Host Bridge device is present yet no corresponding
CEDT Host Bridge Structure (CHBS) exists, the ACPI probe method
fails.

Rather than fail, emit this warning and continue:
cxl_acpi ACPI0017:00: No CHBS found for Host Bridge: ACPI0016:02

This error may occur on systems that are not compliant with the
ACPI specification. Compliant systems include a CHBS entry for
every CXL host bridge that is present at boot.

Suggested-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Tested-by: Vishal Verma <vishal.l.verma@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/20211007213426.392644-1-alison.schofield@intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/acpi.c

index af1c6c1..dadc7f6 100644 (file)
@@ -288,7 +288,7 @@ static int add_host_bridge_uport(struct device *match, void *arg)
        dport = find_dport_by_dev(root_port, match);
        if (!dport) {
                dev_dbg(host, "host bridge expected and not found\n");
-               return -ENODEV;
+               return 0;
        }
 
        port = devm_cxl_add_port(host, match, dport->component_reg_phys,
@@ -377,9 +377,11 @@ static int add_host_bridge_dport(struct device *match, void *arg)
        }
 
        chbs = cxl_acpi_match_chbs(host, uid);
-       if (IS_ERR(chbs))
-               dev_dbg(host, "No CHBS found for Host Bridge: %s\n",
-                       dev_name(match));
+       if (IS_ERR(chbs)) {
+               dev_warn(host, "No CHBS found for Host Bridge: %s\n",
+                        dev_name(match));
+               return 0;
+       }
 
        rc = cxl_add_dport(root_port, match, uid, get_chbcr(chbs));
        if (rc) {