mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-13 04:39:36 +02:00
cxl/region: Move cxl_dpa_to_region() work to the region driver
[ Upstream commitb98d042698
] 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:285f2a0884
("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);
|
int cxl_region_init(void);
|
||||||
void cxl_region_exit(void);
|
void cxl_region_exit(void);
|
||||||
int cxl_get_poison_by_endpoint(struct cxl_port *port);
|
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
|
#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)
|
static inline int cxl_get_poison_by_endpoint(struct cxl_port *port)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -251,50 +251,6 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS_GPL(cxl_trigger_poison_list, CXL);
|
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)
|
static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa)
|
||||||
{
|
{
|
||||||
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
||||||
|
|
|
@ -2509,6 +2509,50 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port)
|
||||||
return rc;
|
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 lock_class_key cxl_pmem_region_key;
|
||||||
|
|
||||||
static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
|
static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user