cxl/hdm: Require all decoders to be enumerated
authorBen Widawsky <bwidawsk@kernel.org>
Wed, 13 Apr 2022 05:18:09 +0000 (22:18 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 10 Jul 2022 02:45:32 +0000 (19:45 -0700)
In preparation for region provisioning all device decoders need to be
enumerated since DPA allocations are calculated by summing the
capacities of all decoders in a set. I.e. the programming for decoder[N]
depends on the state of decoder[N-1], so skipping over decoders that
fail to initialize prevents accurate DPA accounting.

Signed-off-by: Ben Widawsky <bwidawsk@kernel.org>
[djbw: reword changelog]
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/165603879664.551046.6863805202478861026.stgit@dwillia2-xfh
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/hdm.c

index 46635105a1f1bb0b4e64944ee2b1d27b0c403869..ee5dfad94adac714a377a46fbee94816fb7ff3dc 100644 (file)
@@ -199,7 +199,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
 {
        void __iomem *hdm = cxlhdm->regs.hdm_decoder;
        struct cxl_port *port = cxlhdm->port;
-       int i, committed, failed;
+       int i, committed;
        u32 ctrl;
 
        /*
@@ -219,7 +219,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
        if (committed != cxlhdm->decoder_count)
                msleep(20);
 
-       for (i = 0, failed = 0; i < cxlhdm->decoder_count; i++) {
+       for (i = 0; i < cxlhdm->decoder_count; i++) {
                int target_map[CXL_DECODER_MAX_INTERLEAVE] = { 0 };
                int rc, target_count = cxlhdm->target_count;
                struct cxl_decoder *cxld;
@@ -237,8 +237,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
                rc = init_hdm_decoder(port, cxld, target_map, hdm, i);
                if (rc) {
                        put_device(&cxld->dev);
-                       failed++;
-                       continue;
+                       return rc;
                }
                rc = add_hdm_decoder(port, cxld, target_map);
                if (rc) {
@@ -248,11 +247,6 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
                }
        }
 
-       if (failed == cxlhdm->decoder_count) {
-               dev_err(&port->dev, "No valid decoders found\n");
-               return -ENXIO;
-       }
-
        return 0;
 }
 EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_decoders, CXL);