[Intel-gfx] [PATCH 2/2] drm/i915: Move ringbuffer WAs to engine workaround list
Chris Wilson
chris at chris-wilson.co.uk
Thu Jan 30 00:16:22 UTC 2020
Quoting Daniele Ceraolo Spurio (2020-01-29 23:59:00)
> Now that intel_engine_apply_workarounds is called on all gens, we can
> use the engine workaround lists for pre-gen8 workarounds as well to be
> consistent in the way we handle and dump the WAs.
>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
If you go looking, you'll find plenty more gen2-7 w/a scattered about
the place.
> +static void
> +wa_masked_dis(struct i915_wa_list *wal, i915_reg_t reg, u32 val)
> +{
> + wa_write_masked_or(wal, reg, val, _MASKED_BIT_DISABLE(val));
> +}
> +
> static void
> wa_write(struct i915_wa_list *wal, i915_reg_t reg, u32 val)
> {
> @@ -1457,6 +1463,51 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
> GEN8_L3SQCREG4,
> GEN8_LQSC_FLUSH_COHERENT_LINES);
> }
> +
> + if (IS_GEN(i915, 7))
> + /* WaBCSVCSTlbInvalidationMode:ivb,vlv,hsw */
> + wa_masked_en(wal,
> + GFX_MODE_GEN7,
> + GFX_TLB_INVALIDATE_EXPLICIT | GFX_REPLAY_MODE);
> +
> + if (IS_GEN_RANGE(i915, 6, 7))
> + /*
> + * We need to disable the AsyncFlip performance optimisations in
> + * order to use MI_WAIT_FOR_EVENT within the CS. It should
> + * already be programmed to '1' on all products.
> + *
> + * WaDisableAsyncFlipPerfMode:snb,ivb,hsw,vlv
> + */
> + wa_masked_en(wal,
> + MI_MODE,
> + ASYNC_FLIP_PERF_DISABLE);
> +
> + if (IS_GEN(i915, 6)) {
> + /*
> + * Required for the hardware to program scanline values for
> + * waiting
> + * WaEnableFlushTlbInvalidationMode:snb
> + */
> + wa_masked_en(wal,
> + GFX_MODE,
> + GFX_TLB_INVALIDATE_EXPLICIT);
> +
> + /*
> + * From the Sandybridge PRM, volume 1 part 3, page 24:
> + * "If this bit is set, STCunit will have LRA as replacement
> + * policy. [...] This bit must be reset. LRA replacement
> + * policy is not supported."
> + */
> + wa_masked_dis(wal,
> + CACHE_MODE_0,
> + CM0_STC_EVICT_DISABLE_LRA_SNB);
> + }
> +
> + if (IS_GEN_RANGE(i915, 4, 6))
> + /* WaTimedSingleVertexDispatch:cl,bw,ctg,elk,ilk,snb */
> + wa_masked_en(wal,
> + MI_MODE,
> + VS_TIMER_DISPATCH);
> }
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
Let's hope this holds up in testing, now that we expose it to the tests!
> static void
> @@ -1475,7 +1526,7 @@ xcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
> static void
> engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal)
> {
> - if (I915_SELFTEST_ONLY(INTEL_GEN(engine->i915) < 8))
> + if (I915_SELFTEST_ONLY(INTEL_GEN(engine->i915) < 4))
> return;
>
> if (engine->class == RENDER_CLASS)
> @@ -1488,7 +1539,7 @@ void intel_engine_init_workarounds(struct intel_engine_cs *engine)
> {
> struct i915_wa_list *wal = &engine->wa_list;
>
> - if (INTEL_GEN(engine->i915) < 8)
> + if (INTEL_GEN(engine->i915) < 4)
> return;
Can we drop this yet? It's easy to overlook when extending the list of
w/a, so quite surprising.
-Chris
More information about the Intel-gfx
mailing list