Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Verify GT workaround state after GPU init

Since we now have all the GT workarounds in a table, by adding a simple
shared helper function we can now verify that their values are still
applied after some interesting events in the lifetime of the driver.

Initially we only do this after GPU initialization.

v2:
Chris Wilson:
* Simplify verification by realizing it's a simple xor and and.
* Remove verification from engine reset path.
* Return bool straight away from the verify API.

v3:
* API rename. (Chris Wilson)

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20181203125014.3219-4-tvrtko.ursulin@linux.intel.com

+40
+1
drivers/gpu/drm/i915/i915_drv.c
··· 53 53 #include "i915_vgpu.h" 54 54 #include "intel_drv.h" 55 55 #include "intel_uc.h" 56 + #include "intel_workarounds.h" 56 57 57 58 static struct drm_driver driver; 58 59
+3
drivers/gpu/drm/i915/i915_gem.c
··· 5300 5300 I915_WRITE(MI_PREDICATE_RESULT_2, IS_HSW_GT3(dev_priv) ? 5301 5301 LOWER_SLICE_ENABLED : LOWER_SLICE_DISABLED); 5302 5302 5303 + /* Apply the GT workarounds... */ 5303 5304 intel_gt_apply_workarounds(dev_priv); 5305 + /* ...and determine whether they are sticking. */ 5306 + intel_gt_verify_workarounds(dev_priv, "init"); 5304 5307 5305 5308 i915_gem_init_swizzling(dev_priv); 5306 5309
+34
drivers/gpu/drm/i915/intel_workarounds.c
··· 977 977 wa_list_apply(dev_priv, &dev_priv->gt_wa_list); 978 978 } 979 979 980 + static bool 981 + wa_verify(const struct i915_wa *wa, u32 cur, const char *name, const char *from) 982 + { 983 + if ((cur ^ wa->val) & wa->mask) { 984 + DRM_ERROR("%s workaround lost on %s! (%x=%x/%x, expected %x, mask=%x)\n", 985 + name, from, i915_mmio_reg_offset(wa->reg), cur, 986 + cur & wa->mask, wa->val, wa->mask); 987 + 988 + return false; 989 + } 990 + 991 + return true; 992 + } 993 + 994 + static bool wa_list_verify(struct drm_i915_private *dev_priv, 995 + const struct i915_wa_list *wal, 996 + const char *from) 997 + { 998 + struct i915_wa *wa; 999 + unsigned int i; 1000 + bool ok = true; 1001 + 1002 + for (i = 0, wa = wal->list; i < wal->count; i++, wa++) 1003 + ok &= wa_verify(wa, I915_READ(wa->reg), wal->name, from); 1004 + 1005 + return ok; 1006 + } 1007 + 1008 + bool intel_gt_verify_workarounds(struct drm_i915_private *dev_priv, 1009 + const char *from) 1010 + { 1011 + return wa_list_verify(dev_priv, &dev_priv->gt_wa_list, from); 1012 + } 1013 + 980 1014 struct whitelist { 981 1015 i915_reg_t reg[RING_MAX_NONPRIV_SLOTS]; 982 1016 unsigned int count;
+2
drivers/gpu/drm/i915/intel_workarounds.h
··· 32 32 33 33 void intel_gt_init_workarounds(struct drm_i915_private *dev_priv); 34 34 void intel_gt_apply_workarounds(struct drm_i915_private *dev_priv); 35 + bool intel_gt_verify_workarounds(struct drm_i915_private *dev_priv, 36 + const char *from); 35 37 36 38 void intel_whitelist_workarounds_apply(struct intel_engine_cs *engine); 37 39