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