]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/guc: Allow second H2G retry on FLR
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 27 Jan 2026 19:37:26 +0000 (20:37 +0100)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 2 Feb 2026 21:35:46 +0000 (22:35 +0100)
During VF FLR the scratch registers could be cleared both by the
GuC and by the PF driver. Allow to retry more times once we find
out that the HXG header was cleared and wait at least 256ms before
resending the same message again to the GuC.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260127193727.601-7-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_guc.c

index 6cc778e7cb575c3a0dd73cc88fd4f06b0f9fdbc4..d5910b0adbaacc2de0da20cca46fd85b9dc47b4a 100644 (file)
@@ -1400,6 +1400,9 @@ int xe_guc_auth_huc(struct xe_guc *guc, u32 rsa_addr)
        return xe_guc_ct_send_block(&guc->ct, action, ARRAY_SIZE(action));
 }
 
+#define MAX_RETRIES_ON_FLR     2
+#define MIN_SLEEP_MS_ON_FLR    256
+
 int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request,
                          u32 len, u32 *response_buf)
 {
@@ -1410,7 +1413,7 @@ int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request,
                MED_VF_SW_FLAG(0) : VF_SW_FLAG(0);
        const u32 LAST_INDEX = VF_SW_FLAG_COUNT - 1;
        unsigned int sleep_period_ms = 1;
-       bool lost = false;
+       unsigned int lost = 0;
        u32 header;
        int ret;
        int i;
@@ -1446,9 +1449,14 @@ retry:
                             50000, &header, false);
        if (ret) {
                /* scratch registers might be cleared during FLR, try once more */
-               if (!header && !lost) {
+               if (!header) {
+                       if (++lost > MAX_RETRIES_ON_FLR) {
+                               xe_gt_err(gt, "GuC mmio request %#x: lost, too many retries %u\n",
+                                         request[0], lost);
+                               return -ENOLINK;
+                       }
                        xe_gt_dbg(gt, "GuC mmio request %#x: lost, trying again\n", request[0]);
-                       lost = true;
+                       xe_sleep_relaxed_ms(MIN_SLEEP_MS_ON_FLR);
                        goto retry;
                }
 timeout: