Commit 65b98860 authored by Michal Wajdeczko's avatar Michal Wajdeczko
Browse files

drm/xe/guc: Allow second H2G retry on FLR



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: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260127193727.601-7-michal.wajdeczko@intel.com
parent e116fd5c
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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 @@ int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request,
			     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: