]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cxl/region: Factor out code into cxl_region_setup_poison()
authorRobert Richter <rrichter@amd.com>
Wed, 14 Jan 2026 16:48:28 +0000 (17:48 +0100)
committerDave Jiang <dave.jiang@intel.com>
Wed, 4 Feb 2026 16:17:31 +0000 (09:17 -0700)
Poison injection setup code is embedded in cxl_region_probe(). For
improved encapsulation, readability, and maintainability, factor out
code into function cxl_region_setup_poison().

This patch is a prerequisite to disable poison by region offset for
Normalized Addressing.

No functional changes.

Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Signed-off-by: Robert Richter <rrichter@amd.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Link: https://patch.msgid.link/20260114164837.1076338-13-rrichter@amd.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/region.c

index ed8469fa55a906922b0d3ed21d5e69892ab5ea69..80cd77f0842ebb4719552634d5897b6584e5d41f 100644 (file)
@@ -3916,6 +3916,31 @@ static int cxl_region_debugfs_poison_clear(void *data, u64 offset)
 DEFINE_DEBUGFS_ATTRIBUTE(cxl_poison_clear_fops, NULL,
                         cxl_region_debugfs_poison_clear, "%llx\n");
 
+static int cxl_region_setup_poison(struct cxl_region *cxlr)
+{
+       struct device *dev = &cxlr->dev;
+       struct cxl_region_params *p = &cxlr->params;
+       struct dentry *dentry;
+
+       /* Create poison attributes if all memdevs support the capabilities */
+       for (int i = 0; i < p->nr_targets; i++) {
+               struct cxl_endpoint_decoder *cxled = p->targets[i];
+               struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
+
+               if (!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_INJECT) ||
+                   !cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_CLEAR))
+                       return 0;
+       }
+
+       dentry = cxl_debugfs_create_dir(dev_name(dev));
+       debugfs_create_file("inject_poison", 0200, dentry, cxlr,
+                           &cxl_poison_inject_fops);
+       debugfs_create_file("clear_poison", 0200, dentry, cxlr,
+                           &cxl_poison_clear_fops);
+
+       return devm_add_action_or_reset(dev, remove_debugfs, dentry);
+}
+
 static int cxl_region_can_probe(struct cxl_region *cxlr)
 {
        struct cxl_region_params *p = &cxlr->params;
@@ -3945,7 +3970,6 @@ static int cxl_region_probe(struct device *dev)
 {
        struct cxl_region *cxlr = to_cxl_region(dev);
        struct cxl_region_params *p = &cxlr->params;
-       bool poison_supported = true;
        int rc;
 
        rc = cxl_region_can_probe(cxlr);
@@ -3969,30 +3993,9 @@ static int cxl_region_probe(struct device *dev)
        if (rc)
                return rc;
 
-       /* Create poison attributes if all memdevs support the capabilities */
-       for (int i = 0; i < p->nr_targets; i++) {
-               struct cxl_endpoint_decoder *cxled = p->targets[i];
-               struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
-
-               if (!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_INJECT) ||
-                   !cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_CLEAR)) {
-                       poison_supported = false;
-                       break;
-               }
-       }
-
-       if (poison_supported) {
-               struct dentry *dentry;
-
-               dentry = cxl_debugfs_create_dir(dev_name(dev));
-               debugfs_create_file("inject_poison", 0200, dentry, cxlr,
-                                   &cxl_poison_inject_fops);
-               debugfs_create_file("clear_poison", 0200, dentry, cxlr,
-                                   &cxl_poison_clear_fops);
-               rc = devm_add_action_or_reset(dev, remove_debugfs, dentry);
-               if (rc)
-                       return rc;
-       }
+       rc = cxl_region_setup_poison(cxlr);
+       if (rc)
+               return rc;
 
        switch (cxlr->mode) {
        case CXL_PARTMODE_PMEM: