Commit 516b300c authored by Dan Williams's avatar Dan Williams

cxl/memdev: Formalize endpoint port linkage

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: default avatarFan Ni <fan.ni@samsung.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/168679264292.3436160.3901392135863405807.stgit@dwillia2-xfh.jf.intel.comSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent f3c8a37a
...@@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd) ...@@ -149,7 +149,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd)
struct cxl_port *port; struct cxl_port *port;
int rc; int rc;
port = dev_get_drvdata(&cxlmd->dev); port = cxlmd->endpoint;
if (!port || !is_cxl_endpoint(port)) if (!port || !is_cxl_endpoint(port))
return -EINVAL; return -EINVAL;
...@@ -207,7 +207,7 @@ static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa) ...@@ -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) { ctx = (struct cxl_dpa_to_region_context) {
.dpa = dpa, .dpa = dpa,
}; };
port = dev_get_drvdata(&cxlmd->dev); port = cxlmd->endpoint;
if (port && is_cxl_endpoint(port) && port->commit_end != -1) if (port && is_cxl_endpoint(port) && port->commit_end != -1)
device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region);
......
...@@ -64,7 +64,7 @@ static int match_nvdimm_bridge(struct device *dev, void *data) ...@@ -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_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; struct device *dev;
if (!port) if (!port)
......
...@@ -1161,7 +1161,7 @@ static struct device *grandparent(struct device *dev) ...@@ -1161,7 +1161,7 @@ static struct device *grandparent(struct device *dev)
static void delete_endpoint(void *data) static void delete_endpoint(void *data)
{ {
struct cxl_memdev *cxlmd = 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 cxl_port *parent_port;
struct device *parent; struct device *parent;
...@@ -1176,6 +1176,7 @@ static void delete_endpoint(void *data) ...@@ -1176,6 +1176,7 @@ static void delete_endpoint(void *data)
devm_release_action(parent, cxl_unlink_uport, endpoint); devm_release_action(parent, cxl_unlink_uport, endpoint);
devm_release_action(parent, unregister_port, endpoint); devm_release_action(parent, unregister_port, endpoint);
} }
cxlmd->endpoint = NULL;
device_unlock(parent); device_unlock(parent);
put_device(parent); put_device(parent);
out: out:
...@@ -1187,7 +1188,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint) ...@@ -1187,7 +1188,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint)
struct device *dev = &cxlmd->dev; struct device *dev = &cxlmd->dev;
get_device(&endpoint->dev); get_device(&endpoint->dev);
dev_set_drvdata(dev, endpoint); cxlmd->endpoint = endpoint;
cxlmd->depth = endpoint->depth; cxlmd->depth = endpoint->depth;
return devm_add_action_or_reset(dev, delete_endpoint, cxlmd); return devm_add_action_or_reset(dev, delete_endpoint, cxlmd);
} }
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
* @detach_work: active memdev lost a port in its ancestry * @detach_work: active memdev lost a port in its ancestry
* @cxl_nvb: coordinate removal of @cxl_nvd if present * @cxl_nvb: coordinate removal of @cxl_nvd if present
* @cxl_nvd: optional bridge to an nvdimm if the device supports pmem * @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. * @id: id number of this memdev instance.
* @depth: endpoint port depth * @depth: endpoint port depth
*/ */
...@@ -48,6 +49,7 @@ struct cxl_memdev { ...@@ -48,6 +49,7 @@ struct cxl_memdev {
struct work_struct detach_work; struct work_struct detach_work;
struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_nvdimm_bridge *cxl_nvb;
struct cxl_nvdimm *cxl_nvd; struct cxl_nvdimm *cxl_nvd;
struct cxl_port *endpoint;
int id; int id;
int depth; int depth;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment