cxl/region: Move cxl_dpa_to_region() work to the region driver
authorAlison Schofield <alison.schofield@intel.com>
Tue, 30 Apr 2024 17:28:04 +0000 (10:28 -0700)
committerDave Jiang <dave.jiang@intel.com>
Tue, 30 Apr 2024 19:24:42 +0000 (12:24 -0700)
This helper belongs in the region driver as it is only useful
with CONFIG_CXL_REGION. Add a stub in core.h for when the region
driver is not built.

Signed-off-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/05e30f788d62b3dd398aff2d2ea50a6aaa7c3313.1714496730.git.alison.schofield@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/core.h
drivers/cxl/core/memdev.c
drivers/cxl/core/region.c

index bc5a95665aa0af5490118e77e912dd2f6872fcde..87008505f8a9e1c5350ffafcb879832033974430 100644 (file)
@@ -27,7 +27,14 @@ void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled);
 int cxl_region_init(void);
 void cxl_region_exit(void);
 int cxl_get_poison_by_endpoint(struct cxl_port *port);
+struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa);
+
 #else
+static inline
+struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa)
+{
+       return NULL;
+}
 static inline int cxl_get_poison_by_endpoint(struct cxl_port *port)
 {
        return 0;
index d4e259f3a7e914b9e3f17330cbc57f691d1976c2..0277726afd049a63839b4c343d8fc06e6a4ffec8 100644 (file)
@@ -251,50 +251,6 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd)
 }
 EXPORT_SYMBOL_NS_GPL(cxl_trigger_poison_list, CXL);
 
-struct cxl_dpa_to_region_context {
-       struct cxl_region *cxlr;
-       u64 dpa;
-};
-
-static int __cxl_dpa_to_region(struct device *dev, void *arg)
-{
-       struct cxl_dpa_to_region_context *ctx = arg;
-       struct cxl_endpoint_decoder *cxled;
-       u64 dpa = ctx->dpa;
-
-       if (!is_endpoint_decoder(dev))
-               return 0;
-
-       cxled = to_cxl_endpoint_decoder(dev);
-       if (!cxled->dpa_res || !resource_size(cxled->dpa_res))
-               return 0;
-
-       if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start)
-               return 0;
-
-       dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa,
-               dev_name(&cxled->cxld.region->dev));
-
-       ctx->cxlr = cxled->cxld.region;
-
-       return 1;
-}
-
-static struct cxl_region *cxl_dpa_to_region(struct cxl_memdev *cxlmd, u64 dpa)
-{
-       struct cxl_dpa_to_region_context ctx;
-       struct cxl_port *port;
-
-       ctx = (struct cxl_dpa_to_region_context) {
-               .dpa = dpa,
-       };
-       port = cxlmd->endpoint;
-       if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port))
-               device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region);
-
-       return ctx.cxlr;
-}
-
 static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa)
 {
        struct cxl_dev_state *cxlds = cxlmd->cxlds;
index 5c186e0a39b965835bdd775aa3c841873b172633..4b227659e3f8b243e28af312afe52d3494a464a7 100644 (file)
@@ -2679,6 +2679,50 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port)
        return rc;
 }
 
+struct cxl_dpa_to_region_context {
+       struct cxl_region *cxlr;
+       u64 dpa;
+};
+
+static int __cxl_dpa_to_region(struct device *dev, void *arg)
+{
+       struct cxl_dpa_to_region_context *ctx = arg;
+       struct cxl_endpoint_decoder *cxled;
+       u64 dpa = ctx->dpa;
+
+       if (!is_endpoint_decoder(dev))
+               return 0;
+
+       cxled = to_cxl_endpoint_decoder(dev);
+       if (!cxled->dpa_res || !resource_size(cxled->dpa_res))
+               return 0;
+
+       if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start)
+               return 0;
+
+       dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa,
+               dev_name(&cxled->cxld.region->dev));
+
+       ctx->cxlr = cxled->cxld.region;
+
+       return 1;
+}
+
+struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa)
+{
+       struct cxl_dpa_to_region_context ctx;
+       struct cxl_port *port;
+
+       ctx = (struct cxl_dpa_to_region_context) {
+               .dpa = dpa,
+       };
+       port = cxlmd->endpoint;
+       if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port))
+               device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region);
+
+       return ctx.cxlr;
+}
+
 static struct lock_class_key cxl_pmem_region_key;
 
 static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)