diff options
author | Arun Siluvery <arun.siluvery@linux.intel.com> | 2015-06-19 13:37:13 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-06-23 08:01:41 -0400 |
commit | c82435bbe5aca62fc54615ff8ba78134bfa33866 (patch) | |
tree | a15b8966a3f960af551c7c80128e043997fe949f | |
parent | 7ad00d1ac12bf461d0f0b69bf4e0e883b9e23c53 (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.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 23 |
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); |