On Thu, 17 Sep 2026 00:05:26 +0530
<[email protected]> wrote:
> From: Manish Honap <[email protected]>
>
> A CXL Type-2 device must quiesce its coherent link before any reset and
> restore its HDM decoder state afterward, or a reset can leave the device
> mastering the bus over decoders that are no longer valid. This has to
> happen around every reset the PCI core drives for the device, not only
> the ones VFIO issues directly.
>
> Add reset_prepare and reset_done to the CXL ops and register the matching
> pci_error_handlers callbacks.
>
> Assisted-by: LLM
> Signed-off-by: Manish Honap <[email protected]>
> ---
> drivers/vfio/pci/vfio_pci_core.c | 18 ++++++++++++++++++
> include/linux/vfio_pci_core.h | 2 ++
> 2 files changed, 20 insertions(+)
>
> diff --git a/drivers/vfio/pci/vfio_pci_core.c
> b/drivers/vfio/pci/vfio_pci_core.c
> index 2f593b2721a1..a91e07181847 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -2794,8 +2794,26 @@ int vfio_pci_core_sriov_configure(struct
> vfio_pci_core_device *vdev,
> }
> EXPORT_SYMBOL_GPL(vfio_pci_core_sriov_configure);
>
> +static void vfio_pci_core_reset_prepare(struct pci_dev *pdev)
> +{
> + struct vfio_pci_core_device *vdev = dev_get_drvdata(&pdev->dev);
> +
> + if (vdev->cxl_ops)
> + vdev->cxl_ops->reset_prepare(vdev);
> +}
> +
> +static void vfio_pci_core_reset_done(struct pci_dev *pdev)
> +{
> + struct vfio_pci_core_device *vdev = dev_get_drvdata(&pdev->dev);
> +
> + if (vdev->cxl_ops)
> + vdev->cxl_ops->reset_done(vdev);
> +}
Flagging this because it's introducing one more vfio-pci-core use of
the convention of storing the vfio_pci_core_device in drvdata that's a
barrier for a Rust-based variant driver. Likely this needs to be added
to the per-variant boilerplate or macro so variants provide the
vfio_pci_core_device pointer rather than expecting it in drvdata.
Thanks,
Alex
> +
> const struct pci_error_handlers vfio_pci_core_err_handlers = {
> .error_detected = vfio_pci_core_aer_err_detected,
> + .reset_prepare = vfio_pci_core_reset_prepare,
> + .reset_done = vfio_pci_core_reset_done,
> };
> EXPORT_SYMBOL_GPL(vfio_pci_core_err_handlers);
>
> diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h
> index 643f32c2141f..6ebf9a26275e 100644
> --- a/include/linux/vfio_pci_core.h
> +++ b/include/linux/vfio_pci_core.h
> @@ -72,6 +72,8 @@ struct vfio_cxl_ops {
> void (*release)(struct vfio_pci_core_device *vdev);
> int (*open_device)(struct vfio_pci_core_device *vdev);
> void (*close_device)(struct vfio_pci_core_device *vdev);
> + void (*reset_prepare)(struct vfio_pci_core_device *vdev);
> + void (*reset_done)(struct vfio_pci_core_device *vdev);
> /* Pinned per bound CXL device so vfio-cxl cannot unload under usage */
> struct module *owner;
> };