[PATCH 3/6] gt wa verify on init

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Nov 28 09:10:31 UTC 2018


From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
 drivers/gpu/drm/i915/intel_workarounds.c | 58 +++++++++++++++++++++---
 1 file changed, 52 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c
index 58ac7d393b05..321ac0da8f63 100644
--- a/drivers/gpu/drm/i915/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/intel_workarounds.c
@@ -580,18 +580,58 @@ int intel_ctx_workarounds_emit(struct i915_request *rq)
 	return 0;
 }
 
+static void
+wa_fail(i915_reg_t reg, u32 cur, u32 val, const char *verify, const char *func)
+{
+	DRM_ERROR("GT WA wrong value! reg=%x expected=%x current=%x (%s/%s)\n",
+		  i915_mmio_reg_offset(reg), val, cur, verify, func);
+}
+
+static void
+wa_verify_bits(i915_reg_t reg, u32 cur, u32 mask, u32 val, const char *verify,
+		 const char *func, bool all)
+{
+	u32 bits = all ? mask : val;
+	u32 cur_ = cur;
+	u32 val_ = val;
+
+	while (bits) {
+		if (((val_ & 1) && !(cur_ & 1)) ||
+		    (!(val_ & 1) && (cur_ & 1) && all)) {
+			wa_fail(reg, cur & mask, val, verify, func);
+			break;
+		}
+
+		bits >>= 1;
+		cur_ >>= 1;
+		val_ >>= 1;
+	}
+}
+
 static void
 wa_write(struct drm_i915_private *dev_priv, i915_reg_t reg, u32 val,
 	 const char *verify)
 {
-	I915_WRITE(reg, val);
+	if (verify) {
+		u32 mask = ~(~0 << fls(val));
+
+		wa_verify_bits(reg, I915_READ(reg), mask, val, verify,
+			       __func__, true);
+	} else {
+		I915_WRITE(reg, val);
+	}
 }
 
 static void
 wa_masked_en(struct drm_i915_private *dev_priv, i915_reg_t reg, u32 val,
 	     const char *verify)
 {
-	I915_WRITE(reg, _MASKED_BIT_ENABLE(val));
+	if (verify) {
+		wa_verify_bits(reg, I915_READ(reg), 0xffff, val, verify,
+			       __func__, false);
+	} else {
+		I915_WRITE(reg, _MASKED_BIT_ENABLE(val));
+	}
 }
 
 static void
@@ -600,7 +640,11 @@ wa_write_or(struct drm_i915_private *dev_priv, i915_reg_t reg, u32 val,
 {
 	u32 cur = I915_READ(reg);
 
-	I915_WRITE(reg, cur | val);
+	if (verify) {
+		wa_verify_bits(reg, cur, ~0, val, verify, __func__, false);
+	} else {
+		I915_WRITE(reg, cur | val);
+	}
 }
 
 static void
@@ -609,9 +653,11 @@ wa_write_masked_or(struct drm_i915_private *dev_priv, i915_reg_t reg, u32 mask,
 {
 	u32 cur = I915_READ(reg);
 
-	cur &= mask;
-
-	I915_WRITE(reg, cur | val);
+	if (verify) {
+		wa_verify_bits(reg, cur, ~mask, val, verify, __func__, true);
+	} else {
+		I915_WRITE(reg, (cur & mask) | val);
+	}
 }
 
 static void
-- 
2.19.1



More information about the Intel-gfx-trybot mailing list