aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Siluvery <arun.siluvery@linux.intel.com>2015-06-19 13:37:13 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-06-23 08:01:41 -0400
commitc82435bbe5aca62fc54615ff8ba78134bfa33866 (patch)
treea15b8966a3f960af551c7c80128e043997fe949f
parent7ad00d1ac12bf461d0f0b69bf4e0e883b9e23c53 (diff)
drm/i915/gen8: Add WaFlushCoherentL3CacheLinesAtContextSwitch workaround
In Indirect context w/a batch buffer, +WaFlushCoherentL3CacheLinesAtContextSwitch:bdw v2: Add LRI commands to set/reset bit that invalidates coherent lines, update WA to include programming restrictions and exclude CHV as it is not required (Ville) v3: Avoid unnecessary read when it can be done by reading register once (Chris). Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Dave Gordon <david.s.gordon@intel.com> Signed-off-by: Rafael Barbalho <rafael.barbalho@intel.com> Signed-off-by: Arun Siluvery <arun.siluvery@linux.intel.com> Acked-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 64caa470f2c6..b8e2259fe9ee 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -431,6 +431,7 @@
431#define PIPE_CONTROL_INDIRECT_STATE_DISABLE (1<<9) 431#define PIPE_CONTROL_INDIRECT_STATE_DISABLE (1<<9)
432#define PIPE_CONTROL_NOTIFY (1<<8) 432#define PIPE_CONTROL_NOTIFY (1<<8)
433#define PIPE_CONTROL_FLUSH_ENABLE (1<<7) /* gen7+ */ 433#define PIPE_CONTROL_FLUSH_ENABLE (1<<7) /* gen7+ */
434#define PIPE_CONTROL_DC_FLUSH_ENABLE (1<<5)
434#define PIPE_CONTROL_VF_CACHE_INVALIDATE (1<<4) 435#define PIPE_CONTROL_VF_CACHE_INVALIDATE (1<<4)
435#define PIPE_CONTROL_CONST_CACHE_INVALIDATE (1<<3) 436#define PIPE_CONTROL_CONST_CACHE_INVALIDATE (1<<3)
436#define PIPE_CONTROL_STATE_CACHE_INVALIDATE (1<<2) 437#define PIPE_CONTROL_STATE_CACHE_INVALIDATE (1<<2)
@@ -5811,6 +5812,7 @@ enum skl_disp_power_wells {
5811 5812
5812#define GEN8_L3SQCREG4 0xb118 5813#define GEN8_L3SQCREG4 0xb118
5813#define GEN8_LQSC_RO_PERF_DIS (1<<27) 5814#define GEN8_LQSC_RO_PERF_DIS (1<<27)
5815#define GEN8_LQSC_FLUSH_COHERENT_LINES (1<<21)
5814 5816
5815/* GEN8 chicken */ 5817/* GEN8 chicken */
5816#define HDC_CHICKEN0 0x7300 5818#define HDC_CHICKEN0 0x7300
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index a1198baf34aa..2b65d29c4801 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1143,6 +1143,29 @@ static int gen8_init_indirectctx_bb(struct intel_engine_cs *ring,
1143 /* WaDisableCtxRestoreArbitration:bdw,chv */ 1143 /* WaDisableCtxRestoreArbitration:bdw,chv */
1144 wa_ctx_emit(batch, MI_ARB_ON_OFF | MI_ARB_DISABLE); 1144 wa_ctx_emit(batch, MI_ARB_ON_OFF | MI_ARB_DISABLE);
1145 1145
1146 /* WaFlushCoherentL3CacheLinesAtContextSwitch:bdw */
1147 if (IS_BROADWELL(ring->dev)) {
1148 struct drm_i915_private *dev_priv = to_i915(ring->dev);
1149 uint32_t l3sqc4_flush = (I915_READ(GEN8_L3SQCREG4) |
1150 GEN8_LQSC_FLUSH_COHERENT_LINES);
1151
1152 wa_ctx_emit(batch, MI_LOAD_REGISTER_IMM(1));
1153 wa_ctx_emit(batch, GEN8_L3SQCREG4);
1154 wa_ctx_emit(batch, l3sqc4_flush);
1155
1156 wa_ctx_emit(batch, GFX_OP_PIPE_CONTROL(6));
1157 wa_ctx_emit(batch, (PIPE_CONTROL_CS_STALL |
1158 PIPE_CONTROL_DC_FLUSH_ENABLE));
1159 wa_ctx_emit(batch, 0);
1160 wa_ctx_emit(batch, 0);
1161 wa_ctx_emit(batch, 0);
1162 wa_ctx_emit(batch, 0);
1163
1164 wa_ctx_emit(batch, MI_LOAD_REGISTER_IMM(1));
1165 wa_ctx_emit(batch, GEN8_L3SQCREG4);
1166 wa_ctx_emit(batch, l3sqc4_flush & ~GEN8_LQSC_FLUSH_COHERENT_LINES);
1167 }
1168
1146 /* Pad to end of cacheline */ 1169 /* Pad to end of cacheline */
1147 while (index % CACHELINE_DWORDS) 1170 while (index % CACHELINE_DWORDS)
1148 wa_ctx_emit(batch, MI_NOOP); 1171 wa_ctx_emit(batch, MI_NOOP);