On Mon, Oct 07, 2024 at 06:16:26PM -0500, Ira Weiny wrote: > cxl_dpa_to_region() finds the region from a <DPA, device> tuple. > The search involves finding the device endpoint decoder as well. > > Dynamic capacity extent processing uses the endpoint decoder HPA > information to calculate the HPA offset. In addition, well behaved > extents should be contained within an endpoint decoder. > > Return the endpoint decoder found to be used in subsequent DCD code. > > Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx> Reviewed-by: Fan Ni <fan.ni@xxxxxxxxxxx> > --- > drivers/cxl/core/core.h | 6 ++++-- > drivers/cxl/core/mbox.c | 2 +- > drivers/cxl/core/memdev.c | 4 ++-- > drivers/cxl/core/region.c | 8 +++++++- > 4 files changed, 14 insertions(+), 6 deletions(-) > > diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h > index 5d6fe7ab0a78..94ee06cfbdca 100644 > --- a/drivers/cxl/core/core.h > +++ b/drivers/cxl/core/core.h > @@ -39,7 +39,8 @@ 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); > +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa, > + struct cxl_endpoint_decoder **cxled); > u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, > u64 dpa); > > @@ -50,7 +51,8 @@ static inline u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, > return ULLONG_MAX; > } > static inline > -struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) > +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa, > + struct cxl_endpoint_decoder **cxled) > { > return NULL; > } > diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c > index 3ba465823564..584d7d282a97 100644 > --- a/drivers/cxl/core/mbox.c > +++ b/drivers/cxl/core/mbox.c > @@ -916,7 +916,7 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, > guard(rwsem_read)(&cxl_dpa_rwsem); > > dpa = le64_to_cpu(evt->media_hdr.phys_addr) & CXL_DPA_MASK; > - cxlr = cxl_dpa_to_region(cxlmd, dpa); > + cxlr = cxl_dpa_to_region(cxlmd, dpa, NULL); > if (cxlr) > hpa = cxl_dpa_to_hpa(cxlr, cxlmd, dpa); > > diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c > index 2565b10a769c..31872c03006b 100644 > --- a/drivers/cxl/core/memdev.c > +++ b/drivers/cxl/core/memdev.c > @@ -313,7 +313,7 @@ int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa) > if (rc) > goto out; > > - cxlr = cxl_dpa_to_region(cxlmd, dpa); > + cxlr = cxl_dpa_to_region(cxlmd, dpa, NULL); > if (cxlr) > dev_warn_once(cxl_mbox->host, > "poison inject dpa:%#llx region: %s\n", dpa, > @@ -377,7 +377,7 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) > if (rc) > goto out; > > - cxlr = cxl_dpa_to_region(cxlmd, dpa); > + cxlr = cxl_dpa_to_region(cxlmd, dpa, NULL); > if (cxlr) > dev_warn_once(cxl_mbox->host, > "poison clear dpa:%#llx region: %s\n", dpa, > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 34a6f447e75b..a0c181cc33e4 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -2827,6 +2827,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port) > struct cxl_dpa_to_region_context { > struct cxl_region *cxlr; > u64 dpa; > + struct cxl_endpoint_decoder *cxled; > }; > > static int __cxl_dpa_to_region(struct device *dev, void *arg) > @@ -2860,11 +2861,13 @@ static int __cxl_dpa_to_region(struct device *dev, void *arg) > dev_name(dev)); > > ctx->cxlr = cxlr; > + ctx->cxled = cxled; > > return 1; > } > > -struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) > +struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa, > + struct cxl_endpoint_decoder **cxled) > { > struct cxl_dpa_to_region_context ctx; > struct cxl_port *port; > @@ -2876,6 +2879,9 @@ struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) > if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) > device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); > > + if (cxled) > + *cxled = ctx.cxled; > + > return ctx.cxlr; > } > > > -- > 2.46.0 > -- Fan Ni