]> git.itanic.dy.fi Git - linux-stable/commitdiff
cxl/memdev: Formalize endpoint port linkage
authorDan Williams <dan.j.williams@intel.com>
Thu, 15 Jun 2023 01:30:43 +0000 (18:30 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 25 Jun 2023 21:31:33 +0000 (14:31 -0700)
Move the endpoint port that the cxl_mem driver establishes from drvdata
to a first class attribute. This is in preparation for device-memory
drivers reusing the CXL core for memory region management. Those drivers
need a type-safe method to retrieve their CXL port linkage. Leave
drvdata for private usage of the cxl_mem driver not external consumers
of a 'struct cxl_memdev' object.

Reviewed-by: Fan Ni <fan.ni@samsung.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/168679264292.3436160.3901392135863405807.stgit@dwillia2-xfh.jf.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/memdev.c
drivers/cxl/core/pmem.c
drivers/cxl/core/port.c
drivers/cxl/cxlmem.h

index 3f2d54f305489573f657647156364d53ddc09815..65a685e5616f78e0d52abc8d02ec9131ecbb4e27 100644 (file)
@@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd)
        struct cxl_port *port;
        int rc;
 
-       port = dev_get_drvdata(&cxlmd->dev);
+       port = cxlmd->endpoint;
        if (!port || !is_cxl_endpoint(port))
                return -EINVAL;
 
@@ -207,7 +207,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa)
        ctx = (struct cxl_dpa_to_region_context) {
                .dpa = dpa,
        };
-       port = dev_get_drvdata(&cxlmd->dev);
+       port = cxlmd->endpoint;
        if (port && is_cxl_endpoint(port) && port->commit_end != -1)
                device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region);
 
index f8c38d9972522a605e9bf94f436343f62df0e64f..fc94f5240327127743336b47e9228f8871deb67d 100644 (file)
@@ -64,7 +64,7 @@ static int match_nvdimm_bridge(struct device *dev, void *data)
 
 struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_memdev *cxlmd)
 {
-       struct cxl_port *port = find_cxl_root(dev_get_drvdata(&cxlmd->dev));
+       struct cxl_port *port = find_cxl_root(cxlmd->endpoint);
        struct device *dev;
 
        if (!port)
index 6d7811b26b5a9d6cf2bb25567133d5f89071d4cf..56be6410169cae3e4a508ed450906cb6d05cabb1 100644 (file)
@@ -1161,7 +1161,7 @@ static struct device *grandparent(struct device *dev)
 static void delete_endpoint(void *data)
 {
        struct cxl_memdev *cxlmd = data;
-       struct cxl_port *endpoint = dev_get_drvdata(&cxlmd->dev);
+       struct cxl_port *endpoint = cxlmd->endpoint;
        struct cxl_port *parent_port;
        struct device *parent;
 
@@ -1176,6 +1176,7 @@ static void delete_endpoint(void *data)
                devm_release_action(parent, cxl_unlink_uport, endpoint);
                devm_release_action(parent, unregister_port, endpoint);
        }
+       cxlmd->endpoint = NULL;
        device_unlock(parent);
        put_device(parent);
 out:
@@ -1187,7 +1188,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint)
        struct device *dev = &cxlmd->dev;
 
        get_device(&endpoint->dev);
-       dev_set_drvdata(dev, endpoint);
+       cxlmd->endpoint = endpoint;
        cxlmd->depth = endpoint->depth;
        return devm_add_action_or_reset(dev, delete_endpoint, cxlmd);
 }
index 1b39afeb369efae2b5050f9513ad7a79758e8190..9aa8876a4eeac8b563ed0a48e8fac984d2a08162 100644 (file)
@@ -38,6 +38,7 @@
  * @detach_work: active memdev lost a port in its ancestry
  * @cxl_nvb: coordinate removal of @cxl_nvd if present
  * @cxl_nvd: optional bridge to an nvdimm if the device supports pmem
+ * @endpoint: connection to the CXL port topology for this memory device
  * @id: id number of this memdev instance.
  * @depth: endpoint port depth
  */
@@ -48,6 +49,7 @@ struct cxl_memdev {
        struct work_struct detach_work;
        struct cxl_nvdimm_bridge *cxl_nvb;
        struct cxl_nvdimm *cxl_nvd;
+       struct cxl_port *endpoint;
        int id;
        int depth;
 };