1b553d2c4SCédric Le Goater /* 2b553d2c4SCédric Le Goater * VFIO migration 3b553d2c4SCédric Le Goater * 4b553d2c4SCédric Le Goater * Copyright Red Hat, Inc. 2025 5b553d2c4SCédric Le Goater * 6b553d2c4SCédric Le Goater * SPDX-License-Identifier: GPL-2.0-or-later 7b553d2c4SCédric Le Goater */ 8b553d2c4SCédric Le Goater 9b553d2c4SCédric Le Goater #ifndef HW_VFIO_VFIO_MIGRATION_INTERNAL_H 10b553d2c4SCédric Le Goater #define HW_VFIO_VFIO_MIGRATION_INTERNAL_H 11b553d2c4SCédric Le Goater 12b553d2c4SCédric Le Goater #ifdef CONFIG_LINUX 13b553d2c4SCédric Le Goater #include <linux/vfio.h> 14b553d2c4SCédric Le Goater #endif 15b553d2c4SCédric Le Goater 16b553d2c4SCédric Le Goater #include "qemu/notify.h" 17b553d2c4SCédric Le Goater 18b553d2c4SCédric Le Goater /* 19b553d2c4SCédric Le Goater * Flags to be used as unique delimiters for VFIO devices in the migration 20b553d2c4SCédric Le Goater * stream. These flags are composed as: 21b553d2c4SCédric Le Goater * 0xffffffff => MSB 32-bit all 1s 22b553d2c4SCédric Le Goater * 0xef10 => Magic ID, represents emulated (virtual) function IO 23b553d2c4SCédric Le Goater * 0x0000 => 16-bits reserved for flags 24b553d2c4SCédric Le Goater * 25b553d2c4SCédric Le Goater * The beginning of state information is marked by _DEV_CONFIG_STATE, 26b553d2c4SCédric Le Goater * _DEV_SETUP_STATE, or _DEV_DATA_STATE, respectively. The end of a 27b553d2c4SCédric Le Goater * certain state information is marked by _END_OF_STATE. 28b553d2c4SCédric Le Goater */ 29b553d2c4SCédric Le Goater #define VFIO_MIG_FLAG_END_OF_STATE (0xffffffffef100001ULL) 30b553d2c4SCédric Le Goater #define VFIO_MIG_FLAG_DEV_CONFIG_STATE (0xffffffffef100002ULL) 31b553d2c4SCédric Le Goater #define VFIO_MIG_FLAG_DEV_SETUP_STATE (0xffffffffef100003ULL) 32b553d2c4SCédric Le Goater #define VFIO_MIG_FLAG_DEV_DATA_STATE (0xffffffffef100004ULL) 33b553d2c4SCédric Le Goater #define VFIO_MIG_FLAG_DEV_INIT_DATA_SENT (0xffffffffef100005ULL) 34*6380b0a0SMaciej S. Szmigiero #define VFIO_MIG_FLAG_DEV_CONFIG_LOAD_READY (0xffffffffef100006ULL) 35b553d2c4SCédric Le Goater 36b553d2c4SCédric Le Goater typedef struct VFIODevice VFIODevice; 37b553d2c4SCédric Le Goater typedef struct VFIOMultifd VFIOMultifd; 38b553d2c4SCédric Le Goater 39b553d2c4SCédric Le Goater typedef struct VFIOMigration { 40b553d2c4SCédric Le Goater struct VFIODevice *vbasedev; 41b553d2c4SCédric Le Goater VMChangeStateEntry *vm_state; 42b553d2c4SCédric Le Goater NotifierWithReturn migration_state; 43b553d2c4SCédric Le Goater uint32_t device_state; 44b553d2c4SCédric Le Goater int data_fd; 45b553d2c4SCédric Le Goater void *data_buffer; 46b553d2c4SCédric Le Goater size_t data_buffer_size; 47b553d2c4SCédric Le Goater uint64_t mig_flags; 48b553d2c4SCédric Le Goater uint64_t precopy_init_size; 49b553d2c4SCédric Le Goater uint64_t precopy_dirty_size; 50b553d2c4SCédric Le Goater bool multifd_transfer; 51b553d2c4SCédric Le Goater VFIOMultifd *multifd; 52b553d2c4SCédric Le Goater bool initial_data_sent; 53b553d2c4SCédric Le Goater 54b553d2c4SCédric Le Goater bool event_save_iterate_started; 55b553d2c4SCédric Le Goater bool event_precopy_empty_hit; 56b553d2c4SCédric Le Goater } VFIOMigration; 57b553d2c4SCédric Le Goater 58b553d2c4SCédric Le Goater bool vfio_migration_realize(VFIODevice *vbasedev, Error **errp); 59b553d2c4SCédric Le Goater void vfio_migration_exit(VFIODevice *vbasedev); 60eb6caa79SCédric Le Goater bool vfio_device_state_is_running(VFIODevice *vbasedev); 61eb6caa79SCédric Le Goater bool vfio_device_state_is_precopy(VFIODevice *vbasedev); 62b553d2c4SCédric Le Goater int vfio_save_device_config_state(QEMUFile *f, void *opaque, Error **errp); 63b553d2c4SCédric Le Goater int vfio_load_device_config_state(QEMUFile *f, void *opaque); 64b553d2c4SCédric Le Goater 65b553d2c4SCédric Le Goater #ifdef CONFIG_LINUX 66b553d2c4SCédric Le Goater int vfio_migration_set_state(VFIODevice *vbasedev, 67b553d2c4SCédric Le Goater enum vfio_device_mig_state new_state, 68b553d2c4SCédric Le Goater enum vfio_device_mig_state recover_state, 69b553d2c4SCédric Le Goater Error **errp); 70b553d2c4SCédric Le Goater #endif 71b553d2c4SCédric Le Goater 72b553d2c4SCédric Le Goater void vfio_migration_add_bytes_transferred(unsigned long val); 73b553d2c4SCédric Le Goater 74b553d2c4SCédric Le Goater #endif /* HW_VFIO_VFIO_MIGRATION_INTERNAL_H */ 75