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

From: Dave Jiang
Date: Thu Feb 20 2025 - 12:18:00 EST




On 2/11/25 2:53 AM, Robert Richter wrote:
> 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@xxxxxxx>
> Reviewed-by: Gregory Price <gourry@xxxxxxxxxx>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> Tested-by: Gregory Price <gourry@xxxxxxxxxx>

Hi Robert,

While some cleanup patches are good to send ahead, some like these would be good to go right before they get used to allow the reviewer to see how the new code is utilized. Otherwise the changes doesn't make a lot of sense stand alone.

If it's not too much of a pain, I'd like to this series only have cleanups/refactorings that would make sense without the address translation needs. And move the other changes near the address translation changes for a smoother review.

Thanks!

Reviewed-by: Dave Jiang <dave.jiang@xxxxxxxxx>


> ---
> 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,