Message ID | 20250314113708.759808-2-fabio.m.de.francesco@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | cxl/core: Enable Region creation on x86 with Low Mem Hole | expand |
On 3/14/25 4:36 AM, Fabio M. De Francesco wrote: > Replace struct range parameter with struct cxl_endpoint_decoder of > which range is a member in the match_*_by_range() functions. > > This is in preparation for expanding these helpers to perform arch > specific region matching that requires a cxl_endpoint_decoder. > > No functional changes. > > Cc: Alison Schofield <alison.schofield@intel.com> > Cc: Dan Williams <dan.j.williams@intel.com> > Cc: Ira Weiny <ira.weiny@intel.com> > Reviewed-by: Alison Schofield <alison.schofield@intel.com> > Reviewed-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Fabio M. De Francesco <fabio.m.de.francesco@linux.intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > drivers/cxl/core/region.c | 26 ++++++++++++++++---------- > 1 file changed, 16 insertions(+), 10 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index b3260d433ec7..97122d645cc1 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -1758,24 +1758,27 @@ static struct cxl_port *next_port(struct cxl_port *port) > static int match_switch_decoder_by_range(struct device *dev, > const void *data) > { > + const struct cxl_endpoint_decoder *cxled = data; > struct cxl_switch_decoder *cxlsd; > - const struct range *r1, *r2 = data; > - > + const struct range *r1, *r2; > > if (!is_switch_decoder(dev)) > return 0; > > cxlsd = to_cxl_switch_decoder(dev); > r1 = &cxlsd->cxld.hpa_range; > + r2 = &cxled->cxld.hpa_range; > > if (is_root_decoder(dev)) > return range_contains(r1, r2); > return (r1->start == r2->start && r1->end == r2->end); > } > > -static int find_pos_and_ways(struct cxl_port *port, struct range *range, > +static int find_pos_and_ways(struct cxl_port *port, > + struct cxl_endpoint_decoder *cxled, > int *pos, int *ways) > { > + struct range *range = &cxled->cxld.hpa_range; > struct cxl_switch_decoder *cxlsd; > struct cxl_port *parent; > struct device *dev; > @@ -1785,7 +1788,7 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range, > if (!parent) > return rc; > > - dev = device_find_child(&parent->dev, range, > + dev = device_find_child(&parent->dev, cxled, > match_switch_decoder_by_range); > if (!dev) { > dev_err(port->uport_dev, > @@ -1865,7 +1868,7 @@ static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled) > if (is_cxl_root(iter)) > break; > > - rc = find_pos_and_ways(iter, range, &parent_pos, &parent_ways); > + rc = find_pos_and_ways(iter, cxled, &parent_pos, &parent_ways); > if (rc) > return rc; > > @@ -3199,22 +3202,26 @@ static int devm_cxl_add_dax_region(struct cxl_region *cxlr) > static int match_root_decoder_by_range(struct device *dev, > const void *data) > { > - const struct range *r1, *r2 = data; > + const struct cxl_endpoint_decoder *cxled = data; > struct cxl_root_decoder *cxlrd; > + const struct range *r1, *r2; > > if (!is_root_decoder(dev)) > return 0; > > cxlrd = to_cxl_root_decoder(dev); > r1 = &cxlrd->cxlsd.cxld.hpa_range; > + r2 = &cxled->cxld.hpa_range; > + > return range_contains(r1, r2); > } > > static int match_region_by_range(struct device *dev, const void *data) > { > + const struct cxl_endpoint_decoder *cxled = data; > + const struct range *r = &cxled->cxld.hpa_range; > struct cxl_region_params *p; > struct cxl_region *cxlr; > - const struct range *r = data; > > if (!is_cxl_region(dev)) > return 0; > @@ -3382,7 +3389,6 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd, > int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) > { > struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); > - struct range *hpa = &cxled->cxld.hpa_range; > struct cxl_decoder *cxld = &cxled->cxld; > struct device *cxlrd_dev, *region_dev; > struct cxl_root_decoder *cxlrd; > @@ -3391,7 +3397,7 @@ int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) > bool attach = false; > int rc; > > - cxlrd_dev = device_find_child(&root->dev, &cxld->hpa_range, > + cxlrd_dev = device_find_child(&root->dev, cxled, > match_root_decoder_by_range); > if (!cxlrd_dev) { > dev_err(cxlmd->dev.parent, > @@ -3408,7 +3414,7 @@ int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) > * one does the construction and the others add to that. > */ > mutex_lock(&cxlrd->range_lock); > - region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, > + region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, cxled, > match_region_by_range); > if (!region_dev) { > cxlr = construct_region(cxlrd, cxled);
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index b3260d433ec7..97122d645cc1 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1758,24 +1758,27 @@ static struct cxl_port *next_port(struct cxl_port *port) static int match_switch_decoder_by_range(struct device *dev, const void *data) { + const struct cxl_endpoint_decoder *cxled = data; struct cxl_switch_decoder *cxlsd; - const struct range *r1, *r2 = data; - + const struct range *r1, *r2; if (!is_switch_decoder(dev)) return 0; cxlsd = to_cxl_switch_decoder(dev); r1 = &cxlsd->cxld.hpa_range; + r2 = &cxled->cxld.hpa_range; if (is_root_decoder(dev)) return range_contains(r1, r2); return (r1->start == r2->start && r1->end == r2->end); } -static int find_pos_and_ways(struct cxl_port *port, struct range *range, +static int find_pos_and_ways(struct cxl_port *port, + struct cxl_endpoint_decoder *cxled, int *pos, int *ways) { + struct range *range = &cxled->cxld.hpa_range; struct cxl_switch_decoder *cxlsd; struct cxl_port *parent; struct device *dev; @@ -1785,7 +1788,7 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range, if (!parent) return rc; - dev = device_find_child(&parent->dev, range, + dev = device_find_child(&parent->dev, cxled, match_switch_decoder_by_range); if (!dev) { dev_err(port->uport_dev, @@ -1865,7 +1868,7 @@ static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled) if (is_cxl_root(iter)) break; - rc = find_pos_and_ways(iter, range, &parent_pos, &parent_ways); + rc = find_pos_and_ways(iter, cxled, &parent_pos, &parent_ways); if (rc) return rc; @@ -3199,22 +3202,26 @@ static int devm_cxl_add_dax_region(struct cxl_region *cxlr) static int match_root_decoder_by_range(struct device *dev, const void *data) { - const struct range *r1, *r2 = data; + const struct cxl_endpoint_decoder *cxled = data; struct cxl_root_decoder *cxlrd; + const struct range *r1, *r2; if (!is_root_decoder(dev)) return 0; cxlrd = to_cxl_root_decoder(dev); r1 = &cxlrd->cxlsd.cxld.hpa_range; + r2 = &cxled->cxld.hpa_range; + return range_contains(r1, r2); } static int match_region_by_range(struct device *dev, const void *data) { + const struct cxl_endpoint_decoder *cxled = data; + const struct range *r = &cxled->cxld.hpa_range; struct cxl_region_params *p; struct cxl_region *cxlr; - const struct range *r = data; if (!is_cxl_region(dev)) return 0; @@ -3382,7 +3389,6 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd, int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) { struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); - struct range *hpa = &cxled->cxld.hpa_range; struct cxl_decoder *cxld = &cxled->cxld; struct device *cxlrd_dev, *region_dev; struct cxl_root_decoder *cxlrd; @@ -3391,7 +3397,7 @@ int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) bool attach = false; int rc; - cxlrd_dev = device_find_child(&root->dev, &cxld->hpa_range, + cxlrd_dev = device_find_child(&root->dev, cxled, match_root_decoder_by_range); if (!cxlrd_dev) { dev_err(cxlmd->dev.parent, @@ -3408,7 +3414,7 @@ int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) * one does the construction and the others add to that. */ mutex_lock(&cxlrd->range_lock); - region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, + region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, cxled, match_region_by_range); if (!region_dev) { cxlr = construct_region(cxlrd, cxled);