xref: /linux/drivers/gpu/drm/xe/xe_sriov_pf_control.c (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1c97cdf76SMichal Wajdeczko // SPDX-License-Identifier: MIT
2c97cdf76SMichal Wajdeczko /*
3c97cdf76SMichal Wajdeczko  * Copyright © 2025 Intel Corporation
4c97cdf76SMichal Wajdeczko  */
5c97cdf76SMichal Wajdeczko 
6c97cdf76SMichal Wajdeczko #include "xe_device.h"
7c97cdf76SMichal Wajdeczko #include "xe_gt_sriov_pf_control.h"
849cf1b9bSMichał Winiarski #include "xe_gt_sriov_pf_migration.h"
91ed30397SMichał Winiarski #include "xe_sriov_packet.h"
10c97cdf76SMichal Wajdeczko #include "xe_sriov_pf_control.h"
11ac43294eSMichal Wajdeczko #include "xe_sriov_printk.h"
12c97cdf76SMichal Wajdeczko 
13c97cdf76SMichal Wajdeczko /**
14c97cdf76SMichal Wajdeczko  * xe_sriov_pf_control_pause_vf() - Pause a VF on all GTs.
15c97cdf76SMichal Wajdeczko  * @xe: the &xe_device
16c97cdf76SMichal Wajdeczko  * @vfid: the VF identifier (can't be 0 == PFID)
17c97cdf76SMichal Wajdeczko  *
18c97cdf76SMichal Wajdeczko  * This function is for PF only.
19c97cdf76SMichal Wajdeczko  *
20c97cdf76SMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
21c97cdf76SMichal Wajdeczko  */
22c97cdf76SMichal Wajdeczko int xe_sriov_pf_control_pause_vf(struct xe_device *xe, unsigned int vfid)
23c97cdf76SMichal Wajdeczko {
24c97cdf76SMichal Wajdeczko 	struct xe_gt *gt;
25c97cdf76SMichal Wajdeczko 	unsigned int id;
26c97cdf76SMichal Wajdeczko 	int result = 0;
27c97cdf76SMichal Wajdeczko 	int err;
28c97cdf76SMichal Wajdeczko 
29c97cdf76SMichal Wajdeczko 	for_each_gt(gt, xe, id) {
30c97cdf76SMichal Wajdeczko 		err = xe_gt_sriov_pf_control_pause_vf(gt, vfid);
31c97cdf76SMichal Wajdeczko 		result = result ? -EUCLEAN : err;
32c97cdf76SMichal Wajdeczko 	}
33c97cdf76SMichal Wajdeczko 
34ac43294eSMichal Wajdeczko 	if (result)
35c97cdf76SMichal Wajdeczko 		return result;
36ac43294eSMichal Wajdeczko 
37ac43294eSMichal Wajdeczko 	xe_sriov_info(xe, "VF%u paused!\n", vfid);
38ac43294eSMichal Wajdeczko 	return 0;
39c97cdf76SMichal Wajdeczko }
40c97cdf76SMichal Wajdeczko 
41c97cdf76SMichal Wajdeczko /**
42c97cdf76SMichal Wajdeczko  * xe_sriov_pf_control_resume_vf() - Resume a VF on all GTs.
43c97cdf76SMichal Wajdeczko  * @xe: the &xe_device
44c97cdf76SMichal Wajdeczko  * @vfid: the VF identifier
45c97cdf76SMichal Wajdeczko  *
46c97cdf76SMichal Wajdeczko  * This function is for PF only.
47c97cdf76SMichal Wajdeczko  *
48c97cdf76SMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
49c97cdf76SMichal Wajdeczko  */
50c97cdf76SMichal Wajdeczko int xe_sriov_pf_control_resume_vf(struct xe_device *xe, unsigned int vfid)
51c97cdf76SMichal Wajdeczko {
52c97cdf76SMichal Wajdeczko 	struct xe_gt *gt;
53c97cdf76SMichal Wajdeczko 	unsigned int id;
54c97cdf76SMichal Wajdeczko 	int result = 0;
55c97cdf76SMichal Wajdeczko 	int err;
56c97cdf76SMichal Wajdeczko 
57c97cdf76SMichal Wajdeczko 	for_each_gt(gt, xe, id) {
58c97cdf76SMichal Wajdeczko 		err = xe_gt_sriov_pf_control_resume_vf(gt, vfid);
59c97cdf76SMichal Wajdeczko 		result = result ? -EUCLEAN : err;
60c97cdf76SMichal Wajdeczko 	}
61c97cdf76SMichal Wajdeczko 
62ac43294eSMichal Wajdeczko 	if (result)
63c97cdf76SMichal Wajdeczko 		return result;
64ac43294eSMichal Wajdeczko 
65ac43294eSMichal Wajdeczko 	xe_sriov_info(xe, "VF%u resumed!\n", vfid);
66ac43294eSMichal Wajdeczko 	return 0;
67c97cdf76SMichal Wajdeczko }
68c97cdf76SMichal Wajdeczko 
69c97cdf76SMichal Wajdeczko /**
70c97cdf76SMichal Wajdeczko  * xe_sriov_pf_control_stop_vf - Stop a VF on all GTs.
71c97cdf76SMichal Wajdeczko  * @xe: the &xe_device
72c97cdf76SMichal Wajdeczko  * @vfid: the VF identifier
73c97cdf76SMichal Wajdeczko  *
74c97cdf76SMichal Wajdeczko  * This function is for PF only.
75c97cdf76SMichal Wajdeczko  *
76c97cdf76SMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
77c97cdf76SMichal Wajdeczko  */
78c97cdf76SMichal Wajdeczko int xe_sriov_pf_control_stop_vf(struct xe_device *xe, unsigned int vfid)
79c97cdf76SMichal Wajdeczko {
80c97cdf76SMichal Wajdeczko 	struct xe_gt *gt;
81c97cdf76SMichal Wajdeczko 	unsigned int id;
82c97cdf76SMichal Wajdeczko 	int result = 0;
83c97cdf76SMichal Wajdeczko 	int err;
84c97cdf76SMichal Wajdeczko 
85c97cdf76SMichal Wajdeczko 	for_each_gt(gt, xe, id) {
86c97cdf76SMichal Wajdeczko 		err = xe_gt_sriov_pf_control_stop_vf(gt, vfid);
87c97cdf76SMichal Wajdeczko 		result = result ? -EUCLEAN : err;
88c97cdf76SMichal Wajdeczko 	}
89c97cdf76SMichal Wajdeczko 
90ac43294eSMichal Wajdeczko 	if (result)
91c97cdf76SMichal Wajdeczko 		return result;
92ac43294eSMichal Wajdeczko 
93ac43294eSMichal Wajdeczko 	xe_sriov_info(xe, "VF%u stopped!\n", vfid);
94ac43294eSMichal Wajdeczko 	return 0;
95c97cdf76SMichal Wajdeczko }
96c97cdf76SMichal Wajdeczko 
97c97cdf76SMichal Wajdeczko /**
98c97cdf76SMichal Wajdeczko  * xe_sriov_pf_control_reset_vf() - Perform a VF reset (FLR).
99c97cdf76SMichal Wajdeczko  * @xe: the &xe_device
100c97cdf76SMichal Wajdeczko  * @vfid: the VF identifier
101c97cdf76SMichal Wajdeczko  *
102c97cdf76SMichal Wajdeczko  * This function is for PF only.
103c97cdf76SMichal Wajdeczko  *
104c97cdf76SMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
105c97cdf76SMichal Wajdeczko  */
106c97cdf76SMichal Wajdeczko int xe_sriov_pf_control_reset_vf(struct xe_device *xe, unsigned int vfid)
107c97cdf76SMichal Wajdeczko {
108c97cdf76SMichal Wajdeczko 	struct xe_gt *gt;
109c97cdf76SMichal Wajdeczko 	unsigned int id;
110c97cdf76SMichal Wajdeczko 	int result = 0;
111c97cdf76SMichal Wajdeczko 	int err;
112c97cdf76SMichal Wajdeczko 
113c97cdf76SMichal Wajdeczko 	for_each_gt(gt, xe, id) {
114c97cdf76SMichal Wajdeczko 		err = xe_gt_sriov_pf_control_trigger_flr(gt, vfid);
115c97cdf76SMichal Wajdeczko 		result = result ? -EUCLEAN : err;
116c97cdf76SMichal Wajdeczko 	}
117c97cdf76SMichal Wajdeczko 
11803dc00c7SMichal Wajdeczko 	for_each_gt(gt, xe, id) {
11903dc00c7SMichal Wajdeczko 		err = xe_gt_sriov_pf_control_wait_flr(gt, vfid);
12003dc00c7SMichal Wajdeczko 		result = result ? -EUCLEAN : err;
12103dc00c7SMichal Wajdeczko 	}
12203dc00c7SMichal Wajdeczko 
123c97cdf76SMichal Wajdeczko 	return result;
124c97cdf76SMichal Wajdeczko }
1252a8fcf7cSMichal Wajdeczko 
1262a8fcf7cSMichal Wajdeczko /**
127*3b358c21SMichał Winiarski  * xe_sriov_pf_control_wait_flr() - Wait for a VF reset (FLR) to complete.
128*3b358c21SMichał Winiarski  * @xe: the &xe_device
129*3b358c21SMichał Winiarski  * @vfid: the VF identifier
130*3b358c21SMichał Winiarski  *
131*3b358c21SMichał Winiarski  * This function is for PF only.
132*3b358c21SMichał Winiarski  *
133*3b358c21SMichał Winiarski  * Return: 0 on success or a negative error code on failure.
134*3b358c21SMichał Winiarski  */
135*3b358c21SMichał Winiarski int xe_sriov_pf_control_wait_flr(struct xe_device *xe, unsigned int vfid)
136*3b358c21SMichał Winiarski {
137*3b358c21SMichał Winiarski 	struct xe_gt *gt;
138*3b358c21SMichał Winiarski 	unsigned int id;
139*3b358c21SMichał Winiarski 	int result = 0;
140*3b358c21SMichał Winiarski 	int err;
141*3b358c21SMichał Winiarski 
142*3b358c21SMichał Winiarski 	for_each_gt(gt, xe, id) {
143*3b358c21SMichał Winiarski 		err = xe_gt_sriov_pf_control_wait_flr(gt, vfid);
144*3b358c21SMichał Winiarski 		result = result ? -EUCLEAN : err;
145*3b358c21SMichał Winiarski 	}
146*3b358c21SMichał Winiarski 
147*3b358c21SMichał Winiarski 	return result;
148*3b358c21SMichał Winiarski }
149*3b358c21SMichał Winiarski 
150*3b358c21SMichał Winiarski /**
1512a8fcf7cSMichal Wajdeczko  * xe_sriov_pf_control_sync_flr() - Synchronize a VF FLR between all GTs.
1522a8fcf7cSMichal Wajdeczko  * @xe: the &xe_device
1532a8fcf7cSMichal Wajdeczko  * @vfid: the VF identifier
1542a8fcf7cSMichal Wajdeczko  *
1552a8fcf7cSMichal Wajdeczko  * This function is for PF only.
1562a8fcf7cSMichal Wajdeczko  *
1572a8fcf7cSMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
1582a8fcf7cSMichal Wajdeczko  */
1592a8fcf7cSMichal Wajdeczko int xe_sriov_pf_control_sync_flr(struct xe_device *xe, unsigned int vfid)
1602a8fcf7cSMichal Wajdeczko {
1612a8fcf7cSMichal Wajdeczko 	struct xe_gt *gt;
1622a8fcf7cSMichal Wajdeczko 	unsigned int id;
1632a8fcf7cSMichal Wajdeczko 	int ret;
1642a8fcf7cSMichal Wajdeczko 
1652a8fcf7cSMichal Wajdeczko 	for_each_gt(gt, xe, id) {
1662a8fcf7cSMichal Wajdeczko 		ret = xe_gt_sriov_pf_control_sync_flr(gt, vfid, false);
1672a8fcf7cSMichal Wajdeczko 		if (ret < 0)
1682a8fcf7cSMichal Wajdeczko 			return ret;
1692a8fcf7cSMichal Wajdeczko 	}
1702a8fcf7cSMichal Wajdeczko 	for_each_gt(gt, xe, id) {
1712a8fcf7cSMichal Wajdeczko 		ret = xe_gt_sriov_pf_control_sync_flr(gt, vfid, true);
1722a8fcf7cSMichal Wajdeczko 		if (ret < 0)
1732a8fcf7cSMichal Wajdeczko 			return ret;
1742a8fcf7cSMichal Wajdeczko 	}
1752a8fcf7cSMichal Wajdeczko 
1762a8fcf7cSMichal Wajdeczko 	return 0;
1772a8fcf7cSMichal Wajdeczko }
178ed46ff0dSMichał Winiarski 
179ed46ff0dSMichał Winiarski /**
180ed46ff0dSMichał Winiarski  * xe_sriov_pf_control_trigger_save_vf() - Start VF migration data SAVE sequence on all GTs.
181ed46ff0dSMichał Winiarski  * @xe: the &xe_device
182ed46ff0dSMichał Winiarski  * @vfid: the VF identifier
183ed46ff0dSMichał Winiarski  *
184ed46ff0dSMichał Winiarski  * This function is for PF only.
185ed46ff0dSMichał Winiarski  *
186ed46ff0dSMichał Winiarski  * Return: 0 on success or a negative error code on failure.
187ed46ff0dSMichał Winiarski  */
188ed46ff0dSMichał Winiarski int xe_sriov_pf_control_trigger_save_vf(struct xe_device *xe, unsigned int vfid)
189ed46ff0dSMichał Winiarski {
190ed46ff0dSMichał Winiarski 	struct xe_gt *gt;
191ed46ff0dSMichał Winiarski 	unsigned int id;
192ed46ff0dSMichał Winiarski 	int ret;
193ed46ff0dSMichał Winiarski 
1941ed30397SMichał Winiarski 	ret = xe_sriov_packet_save_init(xe, vfid);
1951ed30397SMichał Winiarski 	if (ret)
1961ed30397SMichał Winiarski 		return ret;
1971ed30397SMichał Winiarski 
198ed46ff0dSMichał Winiarski 	for_each_gt(gt, xe, id) {
19949cf1b9bSMichał Winiarski 		xe_gt_sriov_pf_migration_save_init(gt, vfid);
20049cf1b9bSMichał Winiarski 
201ed46ff0dSMichał Winiarski 		ret = xe_gt_sriov_pf_control_trigger_save_vf(gt, vfid);
202ed46ff0dSMichał Winiarski 		if (ret)
203ed46ff0dSMichał Winiarski 			return ret;
204ed46ff0dSMichał Winiarski 	}
205ed46ff0dSMichał Winiarski 
206ed46ff0dSMichał Winiarski 	return 0;
207ed46ff0dSMichał Winiarski }
208ed46ff0dSMichał Winiarski 
209ed46ff0dSMichał Winiarski /**
210ed46ff0dSMichał Winiarski  * xe_sriov_pf_control_finish_save_vf() - Complete VF migration data SAVE sequence on all GTs.
211ed46ff0dSMichał Winiarski  * @xe: the &xe_device
212ed46ff0dSMichał Winiarski  * @vfid: the VF identifier
213ed46ff0dSMichał Winiarski  *
214ed46ff0dSMichał Winiarski  * This function is for PF only.
215ed46ff0dSMichał Winiarski  *
216ed46ff0dSMichał Winiarski  * Return: 0 on success or a negative error code on failure.
217ed46ff0dSMichał Winiarski  */
218ed46ff0dSMichał Winiarski int xe_sriov_pf_control_finish_save_vf(struct xe_device *xe, unsigned int vfid)
219ed46ff0dSMichał Winiarski {
220ed46ff0dSMichał Winiarski 	struct xe_gt *gt;
221ed46ff0dSMichał Winiarski 	unsigned int id;
222ed46ff0dSMichał Winiarski 	int ret;
223ed46ff0dSMichał Winiarski 
224ed46ff0dSMichał Winiarski 	for_each_gt(gt, xe, id) {
225ed46ff0dSMichał Winiarski 		ret = xe_gt_sriov_pf_control_finish_save_vf(gt, vfid);
226ed46ff0dSMichał Winiarski 		if (ret)
227ed46ff0dSMichał Winiarski 			break;
228ed46ff0dSMichał Winiarski 	}
229ed46ff0dSMichał Winiarski 
230ed46ff0dSMichał Winiarski 	return ret;
231ed46ff0dSMichał Winiarski }
232ed46ff0dSMichał Winiarski 
233ed46ff0dSMichał Winiarski /**
234ed46ff0dSMichał Winiarski  * xe_sriov_pf_control_trigger_restore_vf() - Start VF migration data RESTORE sequence on all GTs.
235ed46ff0dSMichał Winiarski  * @xe: the &xe_device
236ed46ff0dSMichał Winiarski  * @vfid: the VF identifier
237ed46ff0dSMichał Winiarski  *
238ed46ff0dSMichał Winiarski  * This function is for PF only.
239ed46ff0dSMichał Winiarski  *
240ed46ff0dSMichał Winiarski  * Return: 0 on success or a negative error code on failure.
241ed46ff0dSMichał Winiarski  */
242ed46ff0dSMichał Winiarski int xe_sriov_pf_control_trigger_restore_vf(struct xe_device *xe, unsigned int vfid)
243ed46ff0dSMichał Winiarski {
244ed46ff0dSMichał Winiarski 	struct xe_gt *gt;
245ed46ff0dSMichał Winiarski 	unsigned int id;
246ed46ff0dSMichał Winiarski 	int ret;
247ed46ff0dSMichał Winiarski 
248ed46ff0dSMichał Winiarski 	for_each_gt(gt, xe, id) {
249ed46ff0dSMichał Winiarski 		ret = xe_gt_sriov_pf_control_trigger_restore_vf(gt, vfid);
250ed46ff0dSMichał Winiarski 		if (ret)
251ed46ff0dSMichał Winiarski 			return ret;
252ed46ff0dSMichał Winiarski 	}
253ed46ff0dSMichał Winiarski 
254ed46ff0dSMichał Winiarski 	return ret;
255ed46ff0dSMichał Winiarski }
256ed46ff0dSMichał Winiarski 
257ed46ff0dSMichał Winiarski /**
258ed46ff0dSMichał Winiarski  * xe_sriov_pf_control_finish_restore_vf() - Complete VF migration data RESTORE sequence on all GTs.
259ed46ff0dSMichał Winiarski  * @xe: the &xe_device
260ed46ff0dSMichał Winiarski  * @vfid: the VF identifier
261ed46ff0dSMichał Winiarski  *
262ed46ff0dSMichał Winiarski  * This function is for PF only.
263ed46ff0dSMichał Winiarski  *
264ed46ff0dSMichał Winiarski  * Return: 0 on success or a negative error code on failure.
265ed46ff0dSMichał Winiarski  */
266ed46ff0dSMichał Winiarski int xe_sriov_pf_control_finish_restore_vf(struct xe_device *xe, unsigned int vfid)
267ed46ff0dSMichał Winiarski {
268ed46ff0dSMichał Winiarski 	struct xe_gt *gt;
269ed46ff0dSMichał Winiarski 	unsigned int id;
270ed46ff0dSMichał Winiarski 	int ret;
271ed46ff0dSMichał Winiarski 
272ed46ff0dSMichał Winiarski 	for_each_gt(gt, xe, id) {
273ed46ff0dSMichał Winiarski 		ret = xe_gt_sriov_pf_control_finish_restore_vf(gt, vfid);
274ed46ff0dSMichał Winiarski 		if (ret)
275ed46ff0dSMichał Winiarski 			break;
276ed46ff0dSMichał Winiarski 	}
277ed46ff0dSMichał Winiarski 
278ed46ff0dSMichał Winiarski 	return ret;
279ed46ff0dSMichał Winiarski }
280