1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2025 Intel Corporation 4 */ 5 6 #ifndef _XE_SRIOV_VFIO_H_ 7 #define _XE_SRIOV_VFIO_H_ 8 9 #include <linux/types.h> 10 11 struct pci_dev; 12 struct xe_device; 13 14 /** 15 * xe_sriov_vfio_get_pf() - Get PF &xe_device. 16 * @pdev: the VF &pci_dev device 17 * 18 * Return: pointer to PF &xe_device, NULL otherwise. 19 */ 20 struct xe_device *xe_sriov_vfio_get_pf(struct pci_dev *pdev); 21 22 /** 23 * xe_sriov_vfio_migration_supported() - Check if migration is supported. 24 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 25 * 26 * Return: true if migration is supported, false otherwise. 27 */ 28 bool xe_sriov_vfio_migration_supported(struct xe_device *xe); 29 30 /** 31 * xe_sriov_vfio_wait_flr_done() - Wait for VF FLR completion. 32 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 33 * @vfid: the VF identifier (can't be 0) 34 * 35 * This function will wait until VF FLR is processed by PF on all tiles (or 36 * until timeout occurs). 37 * 38 * Return: 0 on success or a negative error code on failure. 39 */ 40 int xe_sriov_vfio_wait_flr_done(struct xe_device *xe, unsigned int vfid); 41 42 /** 43 * xe_sriov_vfio_suspend_device() - Suspend VF. 44 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 45 * @vfid: the VF identifier (can't be 0) 46 * 47 * This function will pause VF on all tiles/GTs. 48 * 49 * Return: 0 on success or a negative error code on failure. 50 */ 51 int xe_sriov_vfio_suspend_device(struct xe_device *xe, unsigned int vfid); 52 53 /** 54 * xe_sriov_vfio_resume_device() - Resume VF. 55 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 56 * @vfid: the VF identifier (can't be 0) 57 * 58 * This function will resume VF on all tiles. 59 * 60 * Return: 0 on success or a negative error code on failure. 61 */ 62 int xe_sriov_vfio_resume_device(struct xe_device *xe, unsigned int vfid); 63 64 /** 65 * xe_sriov_vfio_stop_copy_enter() - Initiate a VF device migration data save. 66 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 67 * @vfid: the VF identifier (can't be 0) 68 * 69 * Return: 0 on success or a negative error code on failure. 70 */ 71 int xe_sriov_vfio_stop_copy_enter(struct xe_device *xe, unsigned int vfid); 72 73 /** 74 * xe_sriov_vfio_stop_copy_exit() - Finish a VF device migration data save. 75 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 76 * @vfid: the VF identifier (can't be 0) 77 * 78 * Return: 0 on success or a negative error code on failure. 79 */ 80 int xe_sriov_vfio_stop_copy_exit(struct xe_device *xe, unsigned int vfid); 81 82 /** 83 * xe_sriov_vfio_resume_data_enter() - Initiate a VF device migration data restore. 84 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 85 * @vfid: the VF identifier (can't be 0) 86 * 87 * Return: 0 on success or a negative error code on failure. 88 */ 89 int xe_sriov_vfio_resume_data_enter(struct xe_device *xe, unsigned int vfid); 90 91 /** 92 * xe_sriov_vfio_resume_data_exit() - Finish a VF device migration data restore. 93 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 94 * @vfid: the VF identifier (can't be 0) 95 * 96 * Return: 0 on success or a negative error code on failure. 97 */ 98 int xe_sriov_vfio_resume_data_exit(struct xe_device *xe, unsigned int vfid); 99 100 /** 101 * xe_sriov_vfio_error() - Move VF device to error state. 102 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 103 * @vfid: the VF identifier (can't be 0) 104 * 105 * Reset is needed to move it out of error state. 106 * 107 * Return: 0 on success or a negative error code on failure. 108 */ 109 int xe_sriov_vfio_error(struct xe_device *xe, unsigned int vfid); 110 111 /** 112 * xe_sriov_vfio_data_read() - Read migration data from the VF device. 113 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 114 * @vfid: the VF identifier (can't be 0) 115 * @buf: start address of userspace buffer 116 * @len: requested read size from userspace 117 * 118 * Return: number of bytes that has been successfully read, 119 * 0 if no more migration data is available, -errno on failure. 120 */ 121 ssize_t xe_sriov_vfio_data_read(struct xe_device *xe, unsigned int vfid, 122 char __user *buf, size_t len); 123 /** 124 * xe_sriov_vfio_data_write() - Write migration data to the VF device. 125 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 126 * @vfid: the VF identifier (can't be 0) 127 * @buf: start address of userspace buffer 128 * @len: requested write size from userspace 129 * 130 * Return: number of bytes that has been successfully written, -errno on failure. 131 */ 132 ssize_t xe_sriov_vfio_data_write(struct xe_device *xe, unsigned int vfid, 133 const char __user *buf, size_t len); 134 /** 135 * xe_sriov_vfio_stop_copy_size() - Get a size estimate of VF device migration data. 136 * @xe: the PF &xe_device obtained by calling xe_sriov_vfio_get_pf() 137 * @vfid: the VF identifier (can't be 0) 138 * 139 * Return: migration data size in bytes or a negative error code on failure. 140 */ 141 ssize_t xe_sriov_vfio_stop_copy_size(struct xe_device *xe, unsigned int vfid); 142 143 #endif 144