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;