cxl/region: Move cxl_dpa_to_region() work to the region driver
[ 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>
This commit is contained in:
parent
3b758696cc
commit
f12be1a1fd
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue