]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:34:06 +0000 (09:34 +0200)
[ Upstream commit b98d042698a32518c93e47730e9ad86b387a9c21 ]

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>
Stable-dep-of: 285f2a088414 ("cxl/region: Avoid null pointer dereference in region lookup")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/cxl/core/core.h
drivers/cxl/core/memdev.c
drivers/cxl/core/region.c

index 8e5f3d84311e583a1ab408714548edaa697634cc..6444cc827c9ceb43dde54c5285e2a20174e12111 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 2f43d368ba07308c27a2aba69a3a3330f7413325..eb895c70043fdf23af6f86d42d32186670221c82 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 7a646fed172117dce962146bd6014914da096919..d2ce3094346544957f2354c35ffc91093b550560 100644 (file)
@@ -2509,6 +2509,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)