10bbc82e4SYishai Hadas /* SPDX-License-Identifier: GPL-2.0 */ 20bbc82e4SYishai Hadas 30bbc82e4SYishai Hadas #ifndef VIRTIO_VFIO_COMMON_H 40bbc82e4SYishai Hadas #define VIRTIO_VFIO_COMMON_H 50bbc82e4SYishai Hadas 60bbc82e4SYishai Hadas #include <linux/kernel.h> 70bbc82e4SYishai Hadas #include <linux/virtio.h> 80bbc82e4SYishai Hadas #include <linux/vfio_pci_core.h> 90bbc82e4SYishai Hadas #include <linux/virtio_pci.h> 100bbc82e4SYishai Hadas 110bbc82e4SYishai Hadas enum virtiovf_migf_state { 120bbc82e4SYishai Hadas VIRTIOVF_MIGF_STATE_ERROR = 1, 136cea64b1SYishai Hadas VIRTIOVF_MIGF_STATE_PRECOPY = 2, 146cea64b1SYishai Hadas VIRTIOVF_MIGF_STATE_COMPLETE = 3, 150bbc82e4SYishai Hadas }; 160bbc82e4SYishai Hadas 170bbc82e4SYishai Hadas enum virtiovf_load_state { 180bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_READ_HEADER, 190bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_PREP_HEADER_DATA, 200bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_READ_HEADER_DATA, 210bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_PREP_CHUNK, 220bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_READ_CHUNK, 230bbc82e4SYishai Hadas VIRTIOVF_LOAD_STATE_LOAD_CHUNK, 240bbc82e4SYishai Hadas }; 250bbc82e4SYishai Hadas 260bbc82e4SYishai Hadas struct virtiovf_data_buffer { 270bbc82e4SYishai Hadas struct sg_append_table table; 280bbc82e4SYishai Hadas loff_t start_pos; 290bbc82e4SYishai Hadas u64 length; 300bbc82e4SYishai Hadas u64 allocated_length; 310bbc82e4SYishai Hadas struct list_head buf_elm; 320bbc82e4SYishai Hadas u8 include_header_object:1; 330bbc82e4SYishai Hadas struct virtiovf_migration_file *migf; 340bbc82e4SYishai Hadas /* Optimize virtiovf_get_migration_page() for sequential access */ 350bbc82e4SYishai Hadas struct scatterlist *last_offset_sg; 360bbc82e4SYishai Hadas unsigned int sg_last_entry; 370bbc82e4SYishai Hadas unsigned long last_offset; 380bbc82e4SYishai Hadas }; 390bbc82e4SYishai Hadas 400bbc82e4SYishai Hadas enum virtiovf_migf_header_flags { 410bbc82e4SYishai Hadas VIRTIOVF_MIGF_HEADER_FLAGS_TAG_MANDATORY = 0, 420bbc82e4SYishai Hadas VIRTIOVF_MIGF_HEADER_FLAGS_TAG_OPTIONAL = 1 << 0, 430bbc82e4SYishai Hadas }; 440bbc82e4SYishai Hadas 450bbc82e4SYishai Hadas enum virtiovf_migf_header_tag { 460bbc82e4SYishai Hadas VIRTIOVF_MIGF_HEADER_TAG_DEVICE_DATA = 0, 470bbc82e4SYishai Hadas }; 480bbc82e4SYishai Hadas 490bbc82e4SYishai Hadas struct virtiovf_migration_header { 500bbc82e4SYishai Hadas __le64 record_size; 510bbc82e4SYishai Hadas /* For future use in case we may need to change the kernel protocol */ 520bbc82e4SYishai Hadas __le32 flags; /* Use virtiovf_migf_header_flags */ 530bbc82e4SYishai Hadas __le32 tag; /* Use virtiovf_migf_header_tag */ 540bbc82e4SYishai Hadas __u8 data[]; /* Its size is given in the record_size */ 550bbc82e4SYishai Hadas }; 560bbc82e4SYishai Hadas 570bbc82e4SYishai Hadas struct virtiovf_migration_file { 580bbc82e4SYishai Hadas struct file *filp; 590bbc82e4SYishai Hadas /* synchronize access to the file state */ 600bbc82e4SYishai Hadas struct mutex lock; 610bbc82e4SYishai Hadas loff_t max_pos; 626cea64b1SYishai Hadas u64 pre_copy_initial_bytes; 636cea64b1SYishai Hadas struct ratelimit_state pre_copy_rl_state; 640bbc82e4SYishai Hadas u64 record_size; 650bbc82e4SYishai Hadas u32 record_tag; 660bbc82e4SYishai Hadas u8 has_obj_id:1; 670bbc82e4SYishai Hadas u32 obj_id; 680bbc82e4SYishai Hadas enum virtiovf_migf_state state; 690bbc82e4SYishai Hadas enum virtiovf_load_state load_state; 700bbc82e4SYishai Hadas /* synchronize access to the lists */ 710bbc82e4SYishai Hadas spinlock_t list_lock; 720bbc82e4SYishai Hadas struct list_head buf_list; 730bbc82e4SYishai Hadas struct list_head avail_list; 740bbc82e4SYishai Hadas struct virtiovf_data_buffer *buf; 750bbc82e4SYishai Hadas struct virtiovf_data_buffer *buf_header; 760bbc82e4SYishai Hadas struct virtiovf_pci_core_device *virtvdev; 770bbc82e4SYishai Hadas }; 780bbc82e4SYishai Hadas 790bbc82e4SYishai Hadas struct virtiovf_pci_core_device { 800bbc82e4SYishai Hadas struct vfio_pci_core_device core_device; 81*40bcdb12SYishai Hadas #ifdef CONFIG_VIRTIO_VFIO_PCI_ADMIN_LEGACY 820bbc82e4SYishai Hadas u8 *bar0_virtual_buf; 830bbc82e4SYishai Hadas /* synchronize access to the virtual buf */ 840bbc82e4SYishai Hadas struct mutex bar_mutex; 850bbc82e4SYishai Hadas void __iomem *notify_addr; 860bbc82e4SYishai Hadas u64 notify_offset; 870bbc82e4SYishai Hadas __le32 pci_base_addr_0; 880bbc82e4SYishai Hadas __le16 pci_cmd; 890bbc82e4SYishai Hadas u8 bar0_virtual_buf_size; 900bbc82e4SYishai Hadas u8 notify_bar; 91*40bcdb12SYishai Hadas #endif 920bbc82e4SYishai Hadas 930bbc82e4SYishai Hadas /* LM related */ 940bbc82e4SYishai Hadas u8 migrate_cap:1; 950bbc82e4SYishai Hadas u8 deferred_reset:1; 960bbc82e4SYishai Hadas /* protect migration state */ 970bbc82e4SYishai Hadas struct mutex state_mutex; 980bbc82e4SYishai Hadas enum vfio_device_mig_state mig_state; 990bbc82e4SYishai Hadas /* protect the reset_done flow */ 1000bbc82e4SYishai Hadas spinlock_t reset_lock; 1010bbc82e4SYishai Hadas struct virtiovf_migration_file *resuming_migf; 1020bbc82e4SYishai Hadas struct virtiovf_migration_file *saving_migf; 1030bbc82e4SYishai Hadas }; 1040bbc82e4SYishai Hadas 1050bbc82e4SYishai Hadas void virtiovf_set_migratable(struct virtiovf_pci_core_device *virtvdev); 1060bbc82e4SYishai Hadas void virtiovf_open_migration(struct virtiovf_pci_core_device *virtvdev); 1070bbc82e4SYishai Hadas void virtiovf_close_migration(struct virtiovf_pci_core_device *virtvdev); 1080bbc82e4SYishai Hadas void virtiovf_migration_reset_done(struct pci_dev *pdev); 1090bbc82e4SYishai Hadas 110*40bcdb12SYishai Hadas #ifdef CONFIG_VIRTIO_VFIO_PCI_ADMIN_LEGACY 111*40bcdb12SYishai Hadas int virtiovf_open_legacy_io(struct virtiovf_pci_core_device *virtvdev); 112*40bcdb12SYishai Hadas long virtiovf_vfio_pci_core_ioctl(struct vfio_device *core_vdev, 113*40bcdb12SYishai Hadas unsigned int cmd, unsigned long arg); 114*40bcdb12SYishai Hadas int virtiovf_pci_ioctl_get_region_info(struct vfio_device *core_vdev, 115*40bcdb12SYishai Hadas unsigned int cmd, unsigned long arg); 116*40bcdb12SYishai Hadas ssize_t virtiovf_pci_core_write(struct vfio_device *core_vdev, 117*40bcdb12SYishai Hadas const char __user *buf, size_t count, 118*40bcdb12SYishai Hadas loff_t *ppos); 119*40bcdb12SYishai Hadas ssize_t virtiovf_pci_core_read(struct vfio_device *core_vdev, char __user *buf, 120*40bcdb12SYishai Hadas size_t count, loff_t *ppos); 121*40bcdb12SYishai Hadas bool virtiovf_support_legacy_io(struct pci_dev *pdev); 122*40bcdb12SYishai Hadas int virtiovf_init_legacy_io(struct virtiovf_pci_core_device *virtvdev); 123*40bcdb12SYishai Hadas void virtiovf_release_legacy_io(struct virtiovf_pci_core_device *virtvdev); 124*40bcdb12SYishai Hadas void virtiovf_legacy_io_reset_done(struct pci_dev *pdev); 125*40bcdb12SYishai Hadas #endif 126*40bcdb12SYishai Hadas 1270bbc82e4SYishai Hadas #endif /* VIRTIO_VFIO_COMMON_H */ 128