|  | /* | 
|  | * VFIO migration | 
|  | * | 
|  | * Copyright Red Hat, Inc. 2025 | 
|  | * | 
|  | * SPDX-License-Identifier: GPL-2.0-or-later | 
|  | */ | 
|  |  | 
|  | #ifndef HW_VFIO_VFIO_MIGRATION_INTERNAL_H | 
|  | #define HW_VFIO_VFIO_MIGRATION_INTERNAL_H | 
|  |  | 
|  | #ifdef CONFIG_LINUX | 
|  | #include <linux/vfio.h> | 
|  | #endif | 
|  |  | 
|  | #include "qemu/notify.h" | 
|  |  | 
|  | /* | 
|  | * Flags to be used as unique delimiters for VFIO devices in the migration | 
|  | * stream. These flags are composed as: | 
|  | * 0xffffffff => MSB 32-bit all 1s | 
|  | * 0xef10     => Magic ID, represents emulated (virtual) function IO | 
|  | * 0x0000     => 16-bits reserved for flags | 
|  | * | 
|  | * The beginning of state information is marked by _DEV_CONFIG_STATE, | 
|  | * _DEV_SETUP_STATE, or _DEV_DATA_STATE, respectively. The end of a | 
|  | * certain state information is marked by _END_OF_STATE. | 
|  | */ | 
|  | #define VFIO_MIG_FLAG_END_OF_STATE      (0xffffffffef100001ULL) | 
|  | #define VFIO_MIG_FLAG_DEV_CONFIG_STATE  (0xffffffffef100002ULL) | 
|  | #define VFIO_MIG_FLAG_DEV_SETUP_STATE   (0xffffffffef100003ULL) | 
|  | #define VFIO_MIG_FLAG_DEV_DATA_STATE    (0xffffffffef100004ULL) | 
|  | #define VFIO_MIG_FLAG_DEV_INIT_DATA_SENT (0xffffffffef100005ULL) | 
|  | #define VFIO_MIG_FLAG_DEV_CONFIG_LOAD_READY (0xffffffffef100006ULL) | 
|  |  | 
|  | typedef struct VFIODevice VFIODevice; | 
|  | typedef struct VFIOMultifd VFIOMultifd; | 
|  |  | 
|  | typedef struct VFIOMigration { | 
|  | struct VFIODevice *vbasedev; | 
|  | VMChangeStateEntry *vm_state; | 
|  | NotifierWithReturn migration_state; | 
|  | uint32_t device_state; | 
|  | int data_fd; | 
|  | void *data_buffer; | 
|  | size_t data_buffer_size; | 
|  | uint64_t mig_flags; | 
|  | uint64_t precopy_init_size; | 
|  | uint64_t precopy_dirty_size; | 
|  | bool multifd_transfer; | 
|  | VFIOMultifd *multifd; | 
|  | bool initial_data_sent; | 
|  |  | 
|  | bool event_save_iterate_started; | 
|  | bool event_precopy_empty_hit; | 
|  | } VFIOMigration; | 
|  |  | 
|  | bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp); | 
|  | void vfio_migration_exit(VFIODevice *vbasedev); | 
|  | bool vfio_device_state_is_running(VFIODevice *vbasedev); | 
|  | bool vfio_device_state_is_precopy(VFIODevice *vbasedev); | 
|  | int vfio_save_device_config_state(QEMUFile *f, void *opaque, Error **errp); | 
|  | int vfio_load_device_config_state(QEMUFile *f, void *opaque); | 
|  |  | 
|  | #ifdef CONFIG_LINUX | 
|  | int vfio_migration_set_state(VFIODevice *vbasedev, | 
|  | enum vfio_device_mig_state new_state, | 
|  | enum vfio_device_mig_state recover_state, | 
|  | Error **errp); | 
|  | #endif | 
|  |  | 
|  | void vfio_migration_add_bytes_transferred(unsigned long val); | 
|  |  | 
|  | #endif /* HW_VFIO_VFIO_MIGRATION_INTERNAL_H */ |