Re: [PATCH v4 10/27] vfio/cxl: Reject unsupported decoder topologies at bind

From: Alex Williamson

Date: Thu Aug 27 2026 - 16:58:57 EST


On Thu, 13 Aug 2026 15:06:14 +0530
<mhonap@xxxxxxxxxx> wrote:

> From: Manish Honap <mhonap@xxxxxxxxxx>
>
> The guest drives a single virtual decoder whose memory maps 1:1, so a
> device with more than one HDM decoder, or an interleaved one, cannot be
> represented. Turn that assumption into an explicit refusal at bind rather
> than a silent misprogramming later.
>
> Signed-off-by: Manish Honap <mhonap@xxxxxxxxxx>
> ---
> drivers/vfio/pci/cxl/vfio_cxl_core.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/vfio/pci/cxl/vfio_cxl_core.c b/drivers/vfio/pci/cxl/vfio_cxl_core.c
> index 125e11354a46..7edc53b25576 100644
> --- a/drivers/vfio/pci/cxl/vfio_cxl_core.c
> +++ b/drivers/vfio/pci/cxl/vfio_cxl_core.c
> @@ -36,10 +36,30 @@ static int vfio_cxl_init_device(struct vfio_pci_core_device *vdev)
> if (!pdev->hdm)
> return -EPROBE_DEFER;
>
> + /* The guest drives one virtual decoder; multiple are unsupported. */
> + if (pdev->hdm->decoder_count != 1)
> + return -EOPNOTSUPP;
> +
> hdm_size = range_len(&pdev->hdm->settings[0].hpa_range);
> if (!hdm_size)
> return -ENXIO;
>
> + /* Interleaved decoders are unsupported. */
> + if (pdev->hdm->settings[0].interleave_ways != 1)
> + return -EOPNOTSUPP;
> +
> + /*
> + * The guest drives resets through the CXL Device DVSEC and polls the
> + * shadow for completion. If the host cannot service a function-scoped
> + * CXL reset (no reset DVSEC, a multifunction device, or no HDM reset
> + * support), that guest request could never complete, so refuse the
> + * device rather than advertise a reset the guest would poll on forever.
> + */
> + if (!cxl_reset_capable(pdev)) {
> + pci_err(pdev, "vfio-cxl: Unsupported device: host cannot service a CXL reset request\n");
> + return -EOPNOTSUPP;
> + }

Why does this particular error deserve such a high priority log while
we silently fail the other two cases added here?

These don't seem particularly noteworthy to split into a separate patch
versus rolling them into the previous. I'd probably also group the
easily testable EOPNOTSUPP errors before we actually start evaluating
things like the hdm_size. Thanks,

Alex

> +
> dvsec = pci_find_dvsec_capability(pdev, PCI_VENDOR_ID_CXL,
> PCI_DVSEC_CXL_DEVICE);
> serial = pci_get_dsn(pdev);