Arrange for util_cxl_decoder_filter_by_region() to consider that root
decoders host multiple regions, unlike switch and endpoint decoders that
have a 1:1 relationship.

Before: (list the root decoders hosting region4 and region9)
    # cxl list -Du -d root -r 4,9
      Warning: no matching devices found

    [
    ]

After:
    # cxl list -Du -d root -r 4,9
    [
      {
        "decoder":"decoder3.0",
        "resource":"0xf010000000",
        "size":"1024.00 MiB (1073.74 MB)",
        "interleave_ways":1,
        "max_available_extent":"512.00 MiB (536.87 MB)",
        "volatile_capable":true,
        "nr_targets":1
      },
      {
        "decoder":"decoder3.5",
        "resource":"0xf1d0000000",
        "size":"256.00 MiB (268.44 MB)",
        "interleave_ways":1,
        "accelmem_capable":true,
        "nr_targets":1
      }
    ]

Signed-off-by: Dan Williams <[email protected]>
---
 cxl/filter.c |    6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/cxl/filter.c b/cxl/filter.c
index 90b13be79d9c..6e8d42165205 100644
--- a/cxl/filter.c
+++ b/cxl/filter.c
@@ -661,6 +661,12 @@ util_cxl_decoder_filter_by_region(struct cxl_decoder 
*decoder,
        if (!__ident)
                return decoder;
 
+       /* root decoders filter by children */
+       cxl_region_foreach(decoder, region)
+               if (util_cxl_region_filter(region, __ident))
+                       return decoder;
+
+       /* switch and endpoint decoders have a 1:1 association with a region */
        region = cxl_decoder_get_region(decoder);
        if (!region)
                return NULL;


Reply via email to