Message ID | 20241118164434.7551-27-alejandro.lucero-palau@amd.com |
---|---|
State | Superseded |
Headers | show |
Series | cxl: add type2 device basic support | expand |
On Mon, 18 Nov 2024 16:44:33 +0000 <alejandro.lucero-palau@amd.com> wrote: LGTM. Reviewed-by: Zhi Wang <zhiw@nvidia.com> > From: Alejandro Lucero <alucerop@amd.com> > > A CXL region struct contains the physical address to work with. > > Add a function for given a opaque cxl region struct returns the params > to be used for mapping such memory range. > > Signed-off-by: Alejandro Lucero <alucerop@amd.com> > --- > drivers/cxl/core/region.c | 16 ++++++++++++++++ > drivers/cxl/cxl.h | 2 ++ > include/cxl/cxl.h | 2 ++ > 3 files changed, 20 insertions(+) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index eff3ad788077..fa44a60549f7 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, > return ERR_PTR(rc); > } > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end) > +{ > + if (!region) > + return -ENODEV; > + > + if (!region->params.res) > + return -ENOSPC; > + > + *start = region->params.res->start; > + *end = region->params.res->end; > + > + return 0; > +} > +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); > + > static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) > { > return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); > diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h > index ee3385db5663..7b46d313e581 100644 > --- a/drivers/cxl/cxl.h > +++ b/drivers/cxl/cxl.h > @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, > > bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > /* > * Unit test builds overrides this to __weak, find the 'strong' version > * of these symbols in tools/testing/cxl/. > diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h > index 2a8ebabfc1dd..f14a3f292ad8 100644 > --- a/include/cxl/cxl.h > +++ b/include/cxl/cxl.h > @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, > bool avoid_dax); > > int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > #endif
On Mon, Nov 18, 2024 at 04:44:33PM +0000, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alucerop@amd.com> > > A CXL region struct contains the physical address to work with. > > Add a function for given a opaque cxl region struct returns the params > to be used for mapping such memory range. I may not be understanding what needs to be opaque here. Why not just 'add function to get a region resource' and then add 'cxl_get_region_resource(). Region params usually refers to the member of struct cxl_region that is called 'params' and that includes more than the resource. --Alison > > Signed-off-by: Alejandro Lucero <alucerop@amd.com> > --- > drivers/cxl/core/region.c | 16 ++++++++++++++++ > drivers/cxl/cxl.h | 2 ++ > include/cxl/cxl.h | 2 ++ > 3 files changed, 20 insertions(+) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index eff3ad788077..fa44a60549f7 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, > return ERR_PTR(rc); > } > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end) > +{ > + if (!region) > + return -ENODEV; > + > + if (!region->params.res) > + return -ENOSPC; > + > + *start = region->params.res->start; > + *end = region->params.res->end; > + > + return 0; > +} > +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); > + > static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) > { > return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); > diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h > index ee3385db5663..7b46d313e581 100644 > --- a/drivers/cxl/cxl.h > +++ b/drivers/cxl/cxl.h > @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, > > bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > /* > * Unit test builds overrides this to __weak, find the 'strong' version > * of these symbols in tools/testing/cxl/. > diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h > index 2a8ebabfc1dd..f14a3f292ad8 100644 > --- a/include/cxl/cxl.h > +++ b/include/cxl/cxl.h > @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, > bool avoid_dax); > > int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > #endif > -- > 2.17.1 > >
On 11/18/24 9:44 AM, alejandro.lucero-palau@amd.com wrote: > From: Alejandro Lucero <alucerop@amd.com> > > A CXL region struct contains the physical address to work with. > > Add a function for given a opaque cxl region struct returns the params > to be used for mapping such memory range. > > Signed-off-by: Alejandro Lucero <alucerop@amd.com> > --- > drivers/cxl/core/region.c | 16 ++++++++++++++++ > drivers/cxl/cxl.h | 2 ++ > include/cxl/cxl.h | 2 ++ > 3 files changed, 20 insertions(+) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index eff3ad788077..fa44a60549f7 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, > return ERR_PTR(rc); > } > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end) Maybe just pass in a 'struct range' ptr and call it cxl_get_region_range()? DJ > +{ > + if (!region) > + return -ENODEV; > + > + if (!region->params.res) > + return -ENOSPC; > + > + *start = region->params.res->start; > + *end = region->params.res->end; > + > + return 0; > +} > +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); > + > static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) > { > return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); > diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h > index ee3385db5663..7b46d313e581 100644 > --- a/drivers/cxl/cxl.h > +++ b/drivers/cxl/cxl.h > @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, > > bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); > > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > /* > * Unit test builds overrides this to __weak, find the 'strong' version > * of these symbols in tools/testing/cxl/. > diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h > index 2a8ebabfc1dd..f14a3f292ad8 100644 > --- a/include/cxl/cxl.h > +++ b/include/cxl/cxl.h > @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, > bool avoid_dax); > > int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); > +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, > + resource_size_t *end); > #endif
On 11/21/24 16:31, Dave Jiang wrote: > > On 11/18/24 9:44 AM, alejandro.lucero-palau@amd.com wrote: >> From: Alejandro Lucero <alucerop@amd.com> >> >> A CXL region struct contains the physical address to work with. >> >> Add a function for given a opaque cxl region struct returns the params >> to be used for mapping such memory range. >> >> Signed-off-by: Alejandro Lucero <alucerop@amd.com> >> --- >> drivers/cxl/core/region.c | 16 ++++++++++++++++ >> drivers/cxl/cxl.h | 2 ++ >> include/cxl/cxl.h | 2 ++ >> 3 files changed, 20 insertions(+) >> >> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c >> index eff3ad788077..fa44a60549f7 100644 >> --- a/drivers/cxl/core/region.c >> +++ b/drivers/cxl/core/region.c >> @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, >> return ERR_PTR(rc); >> } >> >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end) > Maybe just pass in a 'struct range' ptr and call it cxl_get_region_range()? That makes sense, and that solves the problem raised by Allison. Thanks > DJ > >> +{ >> + if (!region) >> + return -ENODEV; >> + >> + if (!region->params.res) >> + return -ENOSPC; >> + >> + *start = region->params.res->start; >> + *end = region->params.res->end; >> + >> + return 0; >> +} >> +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); >> + >> static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) >> { >> return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); >> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h >> index ee3385db5663..7b46d313e581 100644 >> --- a/drivers/cxl/cxl.h >> +++ b/drivers/cxl/cxl.h >> @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, >> >> bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); >> >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end); >> /* >> * Unit test builds overrides this to __weak, find the 'strong' version >> * of these symbols in tools/testing/cxl/. >> diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h >> index 2a8ebabfc1dd..f14a3f292ad8 100644 >> --- a/include/cxl/cxl.h >> +++ b/include/cxl/cxl.h >> @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, >> bool avoid_dax); >> >> int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end); >> #endif
On 11/21/24 02:56, Alison Schofield wrote: > On Mon, Nov 18, 2024 at 04:44:33PM +0000, alejandro.lucero-palau@amd.com wrote: >> From: Alejandro Lucero <alucerop@amd.com> >> >> A CXL region struct contains the physical address to work with. >> >> Add a function for given a opaque cxl region struct returns the params >> to be used for mapping such memory range. > I may not be understanding what needs to be opaque here. The driver can not access cxl_region struct just using it in calls, what requires this patch as other in this patchset as an API for accel drivers. Apologies if mentioning that here creates confusion. > Why not just 'add function to get a region resource' > and then add 'cxl_get_region_resource(). > > Region params usually refers to the member of struct cxl_region > that is called 'params' and that includes more than the resource. I did not realize using params could be problematic, but I agree it is not how we should refer to what we are returning to the caller. I think using Dave suggestion for using range instead should solve the problem. Thanks > --Alison > >> Signed-off-by: Alejandro Lucero <alucerop@amd.com> >> --- >> drivers/cxl/core/region.c | 16 ++++++++++++++++ >> drivers/cxl/cxl.h | 2 ++ >> include/cxl/cxl.h | 2 ++ >> 3 files changed, 20 insertions(+) >> >> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c >> index eff3ad788077..fa44a60549f7 100644 >> --- a/drivers/cxl/core/region.c >> +++ b/drivers/cxl/core/region.c >> @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, >> return ERR_PTR(rc); >> } >> >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end) >> +{ >> + if (!region) >> + return -ENODEV; >> + >> + if (!region->params.res) >> + return -ENOSPC; >> + >> + *start = region->params.res->start; >> + *end = region->params.res->end; >> + >> + return 0; >> +} >> +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); >> + >> static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) >> { >> return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); >> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h >> index ee3385db5663..7b46d313e581 100644 >> --- a/drivers/cxl/cxl.h >> +++ b/drivers/cxl/cxl.h >> @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, >> >> bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); >> >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end); >> /* >> * Unit test builds overrides this to __weak, find the 'strong' version >> * of these symbols in tools/testing/cxl/. >> diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h >> index 2a8ebabfc1dd..f14a3f292ad8 100644 >> --- a/include/cxl/cxl.h >> +++ b/include/cxl/cxl.h >> @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, >> bool avoid_dax); >> >> int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); >> +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, >> + resource_size_t *end); >> #endif >> -- >> 2.17.1 >> >>
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index eff3ad788077..fa44a60549f7 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -2663,6 +2663,22 @@ static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, return ERR_PTR(rc); } +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, + resource_size_t *end) +{ + if (!region) + return -ENODEV; + + if (!region->params.res) + return -ENOSPC; + + *start = region->params.res->start; + *end = region->params.res->end; + + return 0; +} +EXPORT_SYMBOL_NS_GPL(cxl_get_region_params, CXL); + static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) { return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h index ee3385db5663..7b46d313e581 100644 --- a/drivers/cxl/cxl.h +++ b/drivers/cxl/cxl.h @@ -913,6 +913,8 @@ void cxl_coordinates_combine(struct access_coordinate *out, bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port); +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, + resource_size_t *end); /* * Unit test builds overrides this to __weak, find the 'strong' version * of these symbols in tools/testing/cxl/. diff --git a/include/cxl/cxl.h b/include/cxl/cxl.h index 2a8ebabfc1dd..f14a3f292ad8 100644 --- a/include/cxl/cxl.h +++ b/include/cxl/cxl.h @@ -77,4 +77,6 @@ struct cxl_region *cxl_create_region(struct cxl_root_decoder *cxlrd, bool avoid_dax); int cxl_accel_region_detach(struct cxl_endpoint_decoder *cxled); +int cxl_get_region_params(struct cxl_region *region, resource_size_t *start, + resource_size_t *end); #endif