All for trying to make b118 stick. Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/intel_lrc.c | 5 ++- drivers/gpu/drm/i915/intel_workarounds.c | 52 +++++++++++++++++++++++- drivers/gpu/drm/i915/intel_workarounds.h | 2 +- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 4e0a351bfbca..ceebbb423b6e 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -1789,7 +1789,6 @@ static bool unexpected_starting_state(struct intel_engine_cs *engine) static int gen8_init_common_ring(struct intel_engine_cs *engine) { - intel_engine_apply_workarounds(engine); intel_engine_apply_whitelist(engine); intel_mocs_init_engine(engine); @@ -2314,6 +2313,10 @@ static int gen8_init_rcs_context(struct i915_request *rq) { int ret; + ret = intel_engine_apply_workarounds(rq); + if (ret) + return ret; + ret = intel_engine_emit_ctx_wa(rq); if (ret) return ret; diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c index ccaf63679435..0b7f6fe36e37 100644 --- a/drivers/gpu/drm/i915/intel_workarounds.c +++ b/drivers/gpu/drm/i915/intel_workarounds.c @@ -1250,9 +1250,57 @@ void intel_engine_init_workarounds(struct intel_engine_cs *engine) wa_init_finish(wal); } -void intel_engine_apply_workarounds(struct intel_engine_cs *engine) +static int +wa_list_lri(struct i915_request *rq, const struct i915_wa_list *wal) { - wa_list_apply(engine->uncore, &engine->wa_list); + struct intel_uncore *uncore = rq->engine->uncore; + struct i915_wa *wa = wal->list; + unsigned int rem = wal->count; + enum forcewake_domains fw; + unsigned long flags; + + if (!rem) + return 0; + + fw = wal_get_fw_for_rmw(uncore, wal); + + intel_uncore_forcewake_get__locked(uncore, fw); + spin_lock_irqsave(&uncore->lock, flags); + + do { + unsigned int count; + u32 *cs; + + count = min(rem, 100u); + rem -= count; + + cs = intel_ring_begin(rq, 2 * count + 2); + if (IS_ERR(cs)) + return PTR_ERR(cs); + + *cs++ = MI_LOAD_REGISTER_IMM(count); + while (count--) { + u32 val = intel_uncore_read_fw(uncore, wa->reg); + + *cs++ = i915_mmio_reg_offset(wa->reg); + *cs++ = (val & ~wa->mask) | wa->val; + + wa++; + } + *cs++ = MI_NOOP; + + intel_ring_advance(rq, cs); + } while (rem); + + intel_uncore_forcewake_put__locked(uncore, fw); + spin_unlock_irqrestore(&uncore->lock, flags); + + return 0; +} + +int intel_engine_apply_workarounds(struct i915_request *rq) +{ + return wa_list_lri(rq, &rq->engine->wa_list); } #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) diff --git a/drivers/gpu/drm/i915/intel_workarounds.h b/drivers/gpu/drm/i915/intel_workarounds.h index 34eee5ec511e..bb6c628f0c65 100644 --- a/drivers/gpu/drm/i915/intel_workarounds.h +++ b/drivers/gpu/drm/i915/intel_workarounds.h @@ -29,6 +29,6 @@ void intel_engine_init_whitelist(struct intel_engine_cs *engine); void intel_engine_apply_whitelist(struct intel_engine_cs *engine); void intel_engine_init_workarounds(struct intel_engine_cs *engine); -void intel_engine_apply_workarounds(struct intel_engine_cs *engine); +int intel_engine_apply_workarounds(struct i915_request *rq); #endif -- 2.20.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx