Message ID | 20240209115417.724638-5-ruansy.fnst@fujitsu.com |
---|---|
State | New, archived |
Headers | show |
Series | [RFC,1/5] cxl/core: correct length of DPA field masks | expand |
Shiyang Ruan wrote: > When a memdev is assigned to a region, its Device Physical Address will be > mapped to Host Physical Address. Introduce this helper function to > translate HPA from a given memdev and its DPA. > > Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> > --- > drivers/cxl/core/memdev.c | 12 ++++++++++++ > drivers/cxl/cxlmem.h | 1 + > 2 files changed, 13 insertions(+) > > diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c > index dae8802ecdb0..c304e709ef0e 100644 > --- a/drivers/cxl/core/memdev.c > +++ b/drivers/cxl/core/memdev.c > @@ -319,6 +319,18 @@ static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa) > return 0; > } > > +phys_addr_t cxl_memdev_dpa_to_hpa(struct cxl_memdev *cxlmd, u64 dpa) > +{ > + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); > + > + if (cxlr) > + return cxlr->params.res->start + dpa; > + else { > + dev_dbg(&cxlmd->dev, "device belongs to no region.\n"); > + return 0; > + } > +} Hmm no, I would not say memdevs are assigned to regions, *endpoint decoders* are assigned to regions. cxl_dpa_to_region() is only an internal helper when the endpoint decoder is unknown. Otherwise endpoint decoders have a direct-link to their region, if mapped. See usage of "cxled->cxld.region".
diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index dae8802ecdb0..c304e709ef0e 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -319,6 +319,18 @@ static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa) return 0; } +phys_addr_t cxl_memdev_dpa_to_hpa(struct cxl_memdev *cxlmd, u64 dpa) +{ + struct cxl_region *cxlr = cxl_dpa_to_region(cxlmd, dpa); + + if (cxlr) + return cxlr->params.res->start + dpa; + else { + dev_dbg(&cxlmd->dev, "device belongs to no region.\n"); + return 0; + } +} + int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) { struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h index 5303d6942b88..97ddab421e63 100644 --- a/drivers/cxl/cxlmem.h +++ b/drivers/cxl/cxlmem.h @@ -833,6 +833,7 @@ int cxl_poison_state_init(struct cxl_memdev_state *mds); int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, struct cxl_region *cxlr); int cxl_trigger_poison_list(struct cxl_memdev *cxlmd); +phys_addr_t cxl_memdev_dpa_to_hpa(struct cxl_memdev *cxlmd, u64 dpa); int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa); int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa);
When a memdev is assigned to a region, its Device Physical Address will be mapped to Host Physical Address. Introduce this helper function to translate HPA from a given memdev and its DPA. Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- drivers/cxl/core/memdev.c | 12 ++++++++++++ drivers/cxl/cxlmem.h | 1 + 2 files changed, 13 insertions(+)