]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/pf: Split VF FLR processing function
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 30 Sep 2025 23:35:23 +0000 (01:35 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 2 Oct 2025 21:58:33 +0000 (23:58 +0200)
On multi-GT platforms (like PTL) we may want to run VF FLR on each
GuC (render and media) in parallel. Split our FLR function to allow
to wait for GT VF FLR completion separately.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: MichaƂ Winiarski <michal.winiarski@intel.com>
Link: https://lore.kernel.org/r/20250930233525.201263-6-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c
drivers/gpu/drm/xe/xe_gt_sriov_pf_control.h
drivers/gpu/drm/xe/xe_sriov_pf_control.c

index 90fb69b0e041b0db1c295b08291f3b95d852bf00..491918d6b93b119e8ac0fb7d32b41130cae07740 100644 (file)
@@ -1172,11 +1172,31 @@ static void pf_enter_vf_flr_guc_done(struct xe_gt *gt, unsigned int vfid)
  * Return: 0 on success or a negative error code on failure.
  */
 int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid)
+{
+       pf_enter_vf_flr_wip(gt, vfid);
+
+       return 0;
+}
+
+/**
+ * xe_gt_sriov_pf_control_wait_flr() - Wait for a VF FLR to complete.
+ * @gt: the &xe_gt
+ * @vfid: the VF identifier
+ *
+ * This function is for PF only.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_gt_sriov_pf_control_wait_flr(struct xe_gt *gt, unsigned int vfid)
 {
        unsigned long timeout = pf_get_default_timeout(XE_GT_SRIOV_STATE_FLR_WIP);
        int err;
 
-       pf_enter_vf_flr_wip(gt, vfid);
+       if (pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_FAILED))
+               return -EIO;
+
+       if (!pf_check_vf_state(gt, vfid, XE_GT_SRIOV_STATE_FLR_WIP))
+               return 0;
 
        err = pf_wait_vf_wip_done(gt, vfid, timeout);
        if (err) {
index c85e64f099cc843d85640738f5a2e53aa25f8a74..fd256866f6280c076161a5bc3b0c1d8280b88f20 100644 (file)
@@ -18,6 +18,7 @@ int xe_gt_sriov_pf_control_pause_vf(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_control_resume_vf(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_control_stop_vf(struct xe_gt *gt, unsigned int vfid);
 int xe_gt_sriov_pf_control_trigger_flr(struct xe_gt *gt, unsigned int vfid);
+int xe_gt_sriov_pf_control_wait_flr(struct xe_gt *gt, unsigned int vfid);
 
 #ifdef CONFIG_PCI_IOV
 int xe_gt_sriov_pf_control_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32 len);
index fdadd4fbe98561f805c1ecb9bd2b60c6d81fbd78..e1c54a8feb07bd66f20add30583dc4c206b56f58 100644 (file)
@@ -113,5 +113,10 @@ int xe_sriov_pf_control_reset_vf(struct xe_device *xe, unsigned int vfid)
                result = result ? -EUCLEAN : err;
        }
 
+       for_each_gt(gt, xe, id) {
+               err = xe_gt_sriov_pf_control_wait_flr(gt, vfid);
+               result = result ? -EUCLEAN : err;
+       }
+
        return result;
 }