On Thu, 13 Aug 2026 15:06:06 +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 owns the whole component
> register BAR, such as vfio-cxl, has already claimed the full BAR, so
> the per-sub-block claim collides and the mapping fails.
>
> Add a bar_owned parameter to cxl_pci_setup_regs() and record it in
> skip_sub_bar_request on the register map. When set, cxl-core maps the
> sub-block without requesting the region and leaves ownership with the
> upper driver. cxl_pci passes false and keeps its existing claim,
> preserving /dev/mem tooling access to the rest of the component space.
The bool arg itself is an undesirable shape, but then threading it
through @bar_owned to @skip_sub_bar_request to @request is difficult to
follow with limited utility.
What if instead cxl allowed drivers to register the resources they've
already requested into the reg_map, ex:
int cxl_reg_map_add_owned_resource(struct cxl_register_map *reg_map,
struct resource *res)
Then before cxl does any devm_request_mem_region() calls it creates a
temporary struct resource for the range it wants to request and
compares it to the resources the driver already reported as owned via
resource_contains()?
I'm picking reg_map vs cxlds because it seems easier to thread through
to where we need it. In this flow, devm_cxl_iomap_block() could be
split into devm_cxl_request_block() and devm_cxl_ioremap_block(), where
cxl_map_component_regs() would conditionally call the former when
resource_contains() finds no matches for driver owned resources, and
the latter is called unconditionally. devm_cxl_iomap_block() could
remain as the unconditional user of both. Thanks,
Alex