Skip to content

Commit 1fd6c38

Browse files
Robert Richterdavejiang
authored andcommitted
cxl/region: Add @hpa_range argument to function cxl_calc_interleave_pos()
cxl_calc_interleave_pos() uses the endpoint decoder's HPA range to determine its interleaving position. This requires the endpoint decoders to be an SPA, which is not the case for systems that need address translation. Add a separate @hpa_range argument to function cxl_calc_interleave_pos() to specify the address range. Now it is possible to pass the SPA translated address range of an endpoint decoder to function cxl_calc_interleave_pos(). Refactor only, no functional changes. Patch is a prerequisite to implement address translation. Reviewed-by: Gregory Price <gourry@gourry.net> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Tested-by: Gregory Price <gourry@gourry.net> Signed-off-by: Robert Richter <rrichter@amd.com> Link: https://patch.msgid.link/20260114164837.1076338-7-rrichter@amd.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
1 parent bc01fd5 commit 1fd6c38

1 file changed

Lines changed: 8 additions & 6 deletions

File tree

drivers/cxl/core/region.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,6 +1878,7 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range,
18781878
/**
18791879
* cxl_calc_interleave_pos() - calculate an endpoint position in a region
18801880
* @cxled: endpoint decoder member of given region
1881+
* @hpa_range: translated HPA range of the endpoint
18811882
*
18821883
* The endpoint position is calculated by traversing the topology from
18831884
* the endpoint to the root decoder and iteratively applying this
@@ -1890,11 +1891,11 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range,
18901891
* Return: position >= 0 on success
18911892
* -ENXIO on failure
18921893
*/
1893-
static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled)
1894+
static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled,
1895+
struct range *hpa_range)
18941896
{
18951897
struct cxl_port *iter, *port = cxled_to_port(cxled);
18961898
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
1897-
struct range *range = &cxled->cxld.hpa_range;
18981899
int parent_ways = 0, parent_pos = 0, pos = 0;
18991900
int rc;
19001901

@@ -1932,7 +1933,8 @@ static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled)
19321933
if (is_cxl_root(iter))
19331934
break;
19341935

1935-
rc = find_pos_and_ways(iter, range, &parent_pos, &parent_ways);
1936+
rc = find_pos_and_ways(iter, hpa_range, &parent_pos,
1937+
&parent_ways);
19361938
if (rc)
19371939
return rc;
19381940

@@ -1942,7 +1944,7 @@ static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled)
19421944
dev_dbg(&cxlmd->dev,
19431945
"decoder:%s parent:%s port:%s range:%#llx-%#llx pos:%d\n",
19441946
dev_name(&cxled->cxld.dev), dev_name(cxlmd->dev.parent),
1945-
dev_name(&port->dev), range->start, range->end, pos);
1947+
dev_name(&port->dev), hpa_range->start, hpa_range->end, pos);
19461948

19471949
return pos;
19481950
}
@@ -1955,7 +1957,7 @@ static int cxl_region_sort_targets(struct cxl_region *cxlr)
19551957
for (i = 0; i < p->nr_targets; i++) {
19561958
struct cxl_endpoint_decoder *cxled = p->targets[i];
19571959

1958-
cxled->pos = cxl_calc_interleave_pos(cxled);
1960+
cxled->pos = cxl_calc_interleave_pos(cxled, &cxlr->hpa_range);
19591961
/*
19601962
* Record that sorting failed, but still continue to calc
19611963
* cxled->pos so that follow-on code paths can reliably
@@ -2139,7 +2141,7 @@ static int cxl_region_attach(struct cxl_region *cxlr,
21392141
struct cxl_endpoint_decoder *cxled = p->targets[i];
21402142
int test_pos;
21412143

2142-
test_pos = cxl_calc_interleave_pos(cxled);
2144+
test_pos = cxl_calc_interleave_pos(cxled, &cxlr->hpa_range);
21432145
dev_dbg(&cxled->cxld.dev,
21442146
"Test cxl_calc_interleave_pos(): %s test_pos:%d cxled->pos:%d\n",
21452147
(test_pos == cxled->pos) ? "success" : "fail",

0 commit comments

Comments
 (0)