From: Manish Honap <[email protected]> devm_cxl_probe_mem() maps the component registers through the CXL core. By default the core claims each HDM/RAS sub-block, which then collides with the full-BAR request that vfio-pci makes when the guest opens the device.
Discover the component registers into the device reg_map and pass bar_owned to cxl_pci_setup_regs(), so the core maps the sub-blocks without claiming them and vfio-pci owns the whole BAR. Signed-off-by: Manish Honap <[email protected]> --- drivers/vfio/pci/cxl/vfio_cxl_core.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/vfio/pci/cxl/vfio_cxl_core.c b/drivers/vfio/pci/cxl/vfio_cxl_core.c index 7edc53b25576..966b7c22a6ac 100644 --- a/drivers/vfio/pci/cxl/vfio_cxl_core.c +++ b/drivers/vfio/pci/cxl/vfio_cxl_core.c @@ -10,6 +10,7 @@ #include <linux/range.h> #include <linux/vfio_pci_core.h> #include <cxl/cxl.h> +#include <cxl/pci.h> /** * struct vfio_cxl_state - per-device state for a vfio-cxl device @@ -70,6 +71,16 @@ static int vfio_cxl_init_device(struct vfio_pci_core_device *vdev) if (!cxl) return -ENOMEM; + /* + * vfio-pci requests the whole component BAR when the guest opens the + * device. Declare the BAR owned so the CXL core maps the HDM/RAS + * sub-blocks without claiming them and that request does not collide. + */ + ret = cxl_pci_setup_regs(pdev, CXL_REGLOC_RBI_COMPONENT, + &cxl->cxlds.reg_map, true); + if (ret) + return ret; + ret = cxl_set_capacity(&cxl->cxlds, hdm_size); if (ret) return ret; -- 2.25.1

