cxl/pci: Add comments to cxl_hdm_decode_init()
authorRobert Richter <rrichter@amd.com>
Fri, 9 May 2025 15:06:48 +0000 (17:06 +0200)
committerDave Jiang <dave.jiang@intel.com>
Fri, 9 May 2025 16:48:25 +0000 (09:48 -0700)
There are various configuration cases of HDM decoder registers causing
different code paths. Add comments to cxl_hdm_decode_init() to better
explain them.

Signed-off-by: Robert Richter <rrichter@amd.com>
Reviewed-by: Gregory Price <gourry@gourry.net>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: "Fabio M. De Francesco" <fabio.m.de.francesco@linux.intel.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Tested-by: Gregory Price <gourry@gourry.net>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Link: https://patch.msgid.link/20250509150700.2817697-4-rrichter@amd.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/pci.c

index 159674c1c71f3dc686559121d2976ee401525f47..b50551601c2e46c2a60b281263e03c4a0cf0bfb8 100644 (file)
@@ -416,9 +416,19 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,
        if (global_ctrl & CXL_HDM_DECODER_ENABLE || (!hdm && info->mem_enabled))
                return devm_cxl_enable_mem(&port->dev, cxlds);
 
+       /*
+        * If the HDM Decoder Capability does not exist and DVSEC was
+        * not setup, the DVSEC based emulation cannot be used.
+        */
        if (!hdm)
                return -ENODEV;
 
+       /* The HDM Decoder Capability exists but is globally disabled. */
+
+       /*
+        * If the DVSEC CXL Range registers are not enabled, just
+        * enable and use the HDM Decoder Capability registers.
+        */
        if (!info->mem_enabled) {
                rc = devm_cxl_enable_hdm(&port->dev, cxlhdm);
                if (rc)
@@ -427,6 +437,18 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,
                return devm_cxl_enable_mem(&port->dev, cxlds);
        }
 
+       /*
+        * Per CXL 2.0 Section 8.1.3.8.3 and 8.1.3.8.4 DVSEC CXL Range 1 Base
+        * [High,Low] when HDM operation is enabled the range register values
+        * are ignored by the device, but the spec also recommends matching the
+        * DVSEC Range 1,2 to HDM Decoder Range 0,1. So, non-zero info->ranges
+        * are expected even though Linux does not require or maintain that
+        * match. Check if at least one DVSEC range is enabled and allowed by
+        * the platform. That is, the DVSEC range must be covered by a locked
+        * platform window (CFMWS). Fail otherwise as the endpoint's decoders
+        * cannot be used.
+        */
+
        root = to_cxl_port(port->dev.parent);
        while (!is_cxl_root(root) && is_cxl_port(root->dev.parent))
                root = to_cxl_port(root->dev.parent);
@@ -454,15 +476,6 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,
                return -ENXIO;
        }
 
-       /*
-        * Per CXL 2.0 Section 8.1.3.8.3 and 8.1.3.8.4 DVSEC CXL Range 1 Base
-        * [High,Low] when HDM operation is enabled the range register values
-        * are ignored by the device, but the spec also recommends matching the
-        * DVSEC Range 1,2 to HDM Decoder Range 0,1. So, non-zero info->ranges
-        * are expected even though Linux does not require or maintain that
-        * match. If at least one DVSEC range is enabled and allowed, skip HDM
-        * Decoder Capability Enable.
-        */
        return 0;
 }
 EXPORT_SYMBOL_NS_GPL(cxl_hdm_decode_init, "CXL");