xref: /linux/include/drm/intel/xe_sriov_vfio.h (revision bd45d46ffc8fa96e8ee9fa078cef53e0c1221ff4)
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