cxl/hdm: Initialize decoder type for memory expander devices
authorDan Williams <dan.j.williams@intel.com>
Tue, 7 Jun 2022 18:21:40 +0000 (11:21 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 10 Jul 2022 20:41:49 +0000 (13:41 -0700)
Unless and until accelerator (type-2) drivers start registering for
CXL.mem mapping services from the CXL subsystem core, initialize idle
HDM decoders to the "expander" type. I.e. the only CXL devices using the
CXL core presently are those implementing the CXL 2.0 Type-3 memory
expander device class code that the cxl_pci driver claims.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20220624041950.559155-6-dan.j.williams@intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/hdm.c

index 62771e21e2d105ce6c5f4585707d71b6270e87ee..c524e772fdae68f7e478a258ed7f29988c9cfc5c 100644 (file)
@@ -186,6 +186,17 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
                cxld->flags |= CXL_DECODER_F_ENABLE;
                if (ctrl & CXL_HDM_DECODER0_CTRL_LOCK)
                        cxld->flags |= CXL_DECODER_F_LOCK;
+               if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl))
+                       cxld->target_type = CXL_DECODER_EXPANDER;
+               else
+                       cxld->target_type = CXL_DECODER_ACCELERATOR;
+       } else {
+               /* unless / until type-2 drivers arrive, assume type-3 */
+               if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl) == 0) {
+                       ctrl |= CXL_HDM_DECODER0_CTRL_TYPE;
+                       writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(which));
+               }
+               cxld->target_type = CXL_DECODER_EXPANDER;
        }
        rc = cxl_to_ways(FIELD_GET(CXL_HDM_DECODER0_CTRL_IW_MASK, ctrl),
                         &cxld->interleave_ways);
@@ -200,11 +211,6 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
        if (rc)
                return rc;
 
-       if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl))
-               cxld->target_type = CXL_DECODER_EXPANDER;
-       else
-               cxld->target_type = CXL_DECODER_ACCELERATOR;
-
        if (is_endpoint_decoder(&cxld->dev))
                return 0;