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