drm/i915: Check for unreliable MMIO during forcewake
authorMatt Roper <matthew.d.roper@intel.com>
Mon, 27 Mar 2023 19:55:47 +0000 (21:55 +0200)
committerAndi Shyti <andi.shyti@linux.intel.com>
Tue, 28 Mar 2023 09:22:06 +0000 (11:22 +0200)
Although we now sanitycheck MMIO access during driver load to make sure
the MMIO BAR isn't returning all 0xFFFFFFFF, there have been a few cases
where (temporarily?) unreliable MMIO access has happened after GPU
resets or power events.  We'll often notice this on our next GT register
access since forcewake handling will fail; let's change our handling
slightly so that when this happens we print a more meaningful message
clarifying that the problem is the MMIO access, not forcewake
specifically.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230327195547.356584-3-andi.shyti@linux.intel.com
drivers/gpu/drm/i915/intel_uncore.c

index 67f57dde8672bb767a66821b637c66f5f15e2416..242a8508f36606b33d8aba0b7b4d4440f40b6f86 100644 (file)
@@ -178,12 +178,19 @@ wait_ack_set(const struct intel_uncore_forcewake_domain *d,
 static inline void
 fw_domain_wait_ack_clear(const struct intel_uncore_forcewake_domain *d)
 {
-       if (wait_ack_clear(d, FORCEWAKE_KERNEL)) {
+       if (!wait_ack_clear(d, FORCEWAKE_KERNEL))
+               return;
+
+       if (fw_ack(d) == ~0)
+               drm_err(&d->uncore->i915->drm,
+                       "%s: MMIO unreliable (forcewake register returns 0xFFFFFFFF)!\n",
+                       intel_uncore_forcewake_domain_to_str(d->id));
+       else
                drm_err(&d->uncore->i915->drm,
                        "%s: timed out waiting for forcewake ack to clear.\n",
                        intel_uncore_forcewake_domain_to_str(d->id));
-               add_taint_for_CI(d->uncore->i915, TAINT_WARN); /* CI now unreliable */
-       }
+
+       add_taint_for_CI(d->uncore->i915, TAINT_WARN); /* CI now unreliable */
 }
 
 enum ack_type {