[PATCH v3 12/18] cxl/region: Use iterator to find the root port in cxl_find_root_decoder()

Robert Richter
2025-02-11T09:55:06Z

cxl_find_root_decoder() uses find_cxl_root() to find the root port.
In order to support address translation, an iterator must traverse all
ports from endpoint to root port and filter based on system physical
address. Replace the call to find_cxl_root() with the required logic.

Signed-off-by: Robert Richter <rrichter@amd.com>
Reviewed-by: Gregory Price <gourry@gourry.net>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Tested-by: Gregory Price <gourry@gourry.net>
---
drivers/cxl/core/region.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index fb43e154c7b9..cfcd235f311e 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -3207,13 +3207,18 @@ static struct cxl_root_decoder *
cxl_find_root_decoder(struct cxl_endpoint_decoder *cxled)
{
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
- struct cxl_port *port = cxled_to_port(cxled);
- struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port);
+ struct cxl_port *iter = cxled_to_port(cxled);
struct cxl_decoder *cxld = &cxled->cxld;
struct range *hpa = &cxld->hpa_range;
struct device *cxlrd_dev;

- cxlrd_dev = device_find_child(&cxl_root->port.dev, hpa,
+ while (iter && !is_cxl_root(iter))
+ iter = to_cxl_port(iter->dev.parent);
+
+ if (!iter)
+ return NULL;
+
+ cxlrd_dev = device_find_child(&iter->dev, hpa,
match_root_decoder_by_range);
if (!cxlrd_dev) {
dev_err(cxlmd->dev.parent,
--
2.39.5