[PATCH 00/26] vfio/xe: Add driver variant for Xe VF migration

Michał Winiarski
2025-10-11T19:39:58Z

Xe is a DRM driver supporting Intel GPUs and for SR-IOV capable
devices, it enables the creation of SR-IOV VFs.
This series adds xe-vfio-pci driver variant that interacts with Xe
driver to control VF device state and read/write migration data,
allowing it to extend regular vfio-pci functionality with VFIO migration
capability.
The driver doesn't expose PRE_COPY support, as currently supported
hardware lacks the capability to track dirty pages.

While Xe driver already had the capability to manage VF device state,
management of migration data was something that needed to be implemented
and constitutes the majority of the series.

The migration data is processed asynchronously by the Xe driver, and is
organized into multiple migration data packet types representing the
hardware interfaces of the device (GGTT / MMIO / GuC FW / VRAM).
Since the VRAM can potentially be larger than available system memory,
it is copied in multiple chunks. The metadata needed for migration
compatibility decisions is added as part of descriptor packet (currently
limited to PCI device ID / revision).
Xe driver abstracts away the internals of packet processing and takes
care of tracking the position within individual packets.
The API exported to VFIO is similar to API exported by VFIO to
userspace, a simple .read()/.write().

Note that some of the VF resources are not virtualized (e.g. GGTT - the
GFX device global virtual address space). This means that the VF driver
needs to be aware that migration has occured in order to properly
relocate (patching or reemiting data that contains references to GGTT
addresses) before resuming operation.
The code to handle that is already present in upstream Linux and in
production VF drivers for other OSes.

Lukasz Laguna (2):
drm/xe/pf: Add helper to retrieve VF's LMEM object
drm/xe/migrate: Add function for raw copy of VRAM and CCS

Michał Winiarski (24):
drm/xe/pf: Remove GuC version check for migration support
drm/xe: Move migration support to device-level struct
drm/xe/pf: Add save/restore control state stubs and connect to debugfs
drm/xe/pf: Extract migration mutex out of its struct
drm/xe/pf: Add data structures and handlers for migration rings
drm/xe/pf: Add helpers for migration data allocation / free
drm/xe/pf: Add support for encap/decap of bitstream to/from packet
drm/xe/pf: Add minimalistic migration descriptor
drm/xe/pf: Expose VF migration data size over debugfs
drm/xe: Add sa/guc_buf_cache sync interface
drm/xe: Allow the caller to pass guc_buf_cache size
drm/xe/pf: Increase PF GuC Buffer Cache size and use it for VF
migration
drm/xe/pf: Remove GuC migration data save/restore from GT debugfs
drm/xe/pf: Don't save GuC VF migration data on pause
drm/xe/pf: Switch VF migration GuC save/restore to struct migration
data
drm/xe/pf: Handle GuC migration data as part of PF control
drm/xe/pf: Add helpers for VF GGTT migration data handling
drm/xe/pf: Handle GGTT migration data as part of PF control
drm/xe/pf: Add helpers for VF MMIO migration data handling
drm/xe/pf: Handle MMIO migration data as part of PF control
drm/xe/pf: Handle VRAM migration data as part of PF control
drm/xe/pf: Add wait helper for VF FLR
drm/xe/pf: Export helpers for VFIO
vfio/xe: Add vendor-specific vfio_pci driver for Intel graphics

MAINTAINERS | 7 +
drivers/gpu/drm/xe/Makefile | 4 +
drivers/gpu/drm/xe/tests/xe_guc_buf_kunit.c | 2 +-
drivers/gpu/drm/xe/xe_ggtt.c | 92 ++
drivers/gpu/drm/xe/xe_ggtt.h | 2 +
drivers/gpu/drm/xe/xe_ggtt_types.h | 2 +
drivers/gpu/drm/xe/xe_gt_sriov_pf.c | 88 ++
drivers/gpu/drm/xe/xe_gt_sriov_pf.h | 19 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 94 ++
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 6 +
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 436 ++++++++-
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h | 7 +
.../gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 23 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c | 47 -
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 901 ++++++++++++++----
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h | 34 +-
.../drm/xe/xe_gt_sriov_pf_migration_types.h | 27 +-
drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h | 6 +-
drivers/gpu/drm/xe/xe_guc.c | 4 +-
drivers/gpu/drm/xe/xe_guc_buf.c | 15 +-
drivers/gpu/drm/xe/xe_guc_buf.h | 3 +-
drivers/gpu/drm/xe/xe_migrate.c | 214 ++++-
drivers/gpu/drm/xe/xe_migrate.h | 4 +
drivers/gpu/drm/xe/xe_sa.c | 21 +
drivers/gpu/drm/xe/xe_sa.h | 1 +
drivers/gpu/drm/xe/xe_sriov_pf.c | 6 +
drivers/gpu/drm/xe/xe_sriov_pf_control.c | 125 +++
drivers/gpu/drm/xe/xe_sriov_pf_control.h | 5 +
drivers/gpu/drm/xe/xe_sriov_pf_debugfs.c | 117 +++
drivers/gpu/drm/xe/xe_sriov_pf_migration.c | 281 ++++++
drivers/gpu/drm/xe/xe_sriov_pf_migration.h | 48 +
.../gpu/drm/xe/xe_sriov_pf_migration_data.c | 566 +++++++++++
.../gpu/drm/xe/xe_sriov_pf_migration_data.h | 39 +
.../gpu/drm/xe/xe_sriov_pf_migration_types.h | 46 +
drivers/gpu/drm/xe/xe_sriov_pf_types.h | 8 +
drivers/gpu/drm/xe/xe_sriov_vfio.c | 252 +++++
drivers/vfio/pci/Kconfig | 2 +
drivers/vfio/pci/Makefile | 2 +
drivers/vfio/pci/xe/Kconfig | 12 +
drivers/vfio/pci/xe/Makefile | 3 +
drivers/vfio/pci/xe/main.c | 470 +++++++++
include/drm/intel/xe_sriov_vfio.h | 28 +
42 files changed, 3747 insertions(+), 322 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration_data.c
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration_data.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_pf_migration_types.h
create mode 100644 drivers/gpu/drm/xe/xe_sriov_vfio.c
create mode 100644 drivers/vfio/pci/xe/Kconfig
create mode 100644 drivers/vfio/pci/xe/Makefile
create mode 100644 drivers/vfio/pci/xe/main.c
create mode 100644 include/drm/intel/xe_sriov_vfio.h

--
2.50.1