On Thu, 17 Sep 2026 00:05:15 +0530 <[email protected]> wrote: > From: Manish Honap <[email protected]> > > cxl_map_component_regs() claims each mapped sub-block with > devm_request_mem_region(). A driver that already requested the whole > component register BAR, such as vfio-cxl, would then collide with that > claim and fail to map the HDM decoder and RAS blocks. > > Add cxl_reg_map_add_owned_resource() so such a driver records the > resource it already owns on the register map, and skip the sub-block > request when the block falls within an owned resource.
This seems a slightly odd intermediate point. The assumption is that if owned the whole bar is owned - hence only handle one owned region (no check if there is already one set?) yet the code will try to map it if we get a request for something outside of the region mapped (which can't exist). This all makes me a little nervous. > > Assisted-by: LLM > Signed-off-by: Manish Honap <[email protected]> > --- > drivers/cxl/core/regs.c | 17 +++++++++++++++-- > include/cxl/cxl.h | 2 ++ > include/cxl/pci.h | 3 +++ > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/drivers/cxl/core/regs.c b/drivers/cxl/core/regs.c > index d79550dbb484..58a7c5cafb45 100644 > --- a/drivers/cxl/core/regs.c > +++ b/drivers/cxl/core/regs.c > @@ -216,6 +216,13 @@ void __iomem *devm_cxl_iomap_block(struct device *dev, > resource_size_t addr, > } > EXPORT_SYMBOL_NS_GPL(devm_cxl_iomap_block, "CXL"); > > +void cxl_reg_map_add_owned_resource(struct cxl_register_map *map, > + struct resource *res) > +{ > + map->owned = res; As above, I think this needs a sanity check that a future driver author doesn't think they can just add lots of these. Absolute minimum is add some Docs. > +} > +EXPORT_SYMBOL_NS_GPL(cxl_reg_map_add_owned_resource, "CXL"); > + > int cxl_map_component_regs(const struct cxl_register_map *map, > struct cxl_component_regs *regs, > unsigned long map_mask) > @@ -234,6 +241,7 @@ int cxl_map_component_regs(const struct cxl_register_map > *map, > struct mapinfo *mi = &mapinfo[i]; > resource_size_t addr; > resource_size_t length; > + struct resource res; > > if (!mi->rmap->valid) > continue; > @@ -241,8 +249,13 @@ int cxl_map_component_regs(const struct cxl_register_map > *map, > continue; > addr = map->resource + mi->rmap->offset; > length = mi->rmap->size; > - *(mi->addr) = devm_cxl_iomap_block(host, addr, length); > - if (!*(mi->addr)) > + res = DEFINE_RES_MEM(addr, length); > + > + if (map->owned && resource_contains(map->owned, &res)) If assumption is whole bar or none, should we just fail if map->owned is true but the resource contains fails? > + *mi->addr = devm_cxl_ioremap_block(host, addr, length); > + else > + *mi->addr = devm_cxl_iomap_block(host, addr, length); > + if (!*mi->addr) > return -ENOMEM; > } >

