[PATCH 2/2] whitelist-once
Chris Wilson
chris at chris-wilson.co.uk
Thu Apr 12 14:46:42 UTC 2018
---
drivers/gpu/drm/i915/intel_lrc.c | 4 --
drivers/gpu/drm/i915/intel_ringbuffer.c | 2 -
drivers/gpu/drm/i915/intel_workarounds.c | 68 +++++++++++-------------
drivers/gpu/drm/i915/intel_workarounds.h | 2 -
4 files changed, 32 insertions(+), 44 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 4f728587a756..e8e9b730aad6 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1744,8 +1744,6 @@ static int gen8_init_render_ring(struct intel_engine_cs *engine)
if (ret)
return ret;
- intel_whitelist_workarounds_apply(engine);
-
/* 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.
@@ -1767,8 +1765,6 @@ static int gen9_init_render_ring(struct intel_engine_cs *engine)
if (ret)
return ret;
- intel_whitelist_workarounds_apply(engine);
-
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index c68ac605b8a9..d2ac4435c199 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -618,8 +618,6 @@ static int init_render_ring(struct intel_engine_cs *engine)
if (ret)
return ret;
- intel_whitelist_workarounds_apply(engine);
-
/* WaTimedSingleVertexDispatch:cl,bw,ctg,elk,ilk,snb */
if (IS_GEN(dev_priv, 4, 6))
I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH));
diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c
index ea0c68f77ea9..69125cb4c6d9 100644
--- a/drivers/gpu/drm/i915/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/intel_workarounds.c
@@ -475,37 +475,31 @@ int intel_ctx_workarounds_init(struct drm_i915_private *dev_priv)
return 0;
}
+static int intel_whitelist_workarounds_emit(struct i915_request *rq);
+
int intel_ctx_workarounds_emit(struct i915_request *rq)
{
struct i915_workarounds *w = &rq->i915->workarounds;
- u32 *cs;
- int ret, i;
- if (w->count == 0)
- return 0;
+ if (w->count) {
+ u32 *cs;
+ int i;
- ret = rq->engine->emit_flush(rq, EMIT_BARRIER);
- if (ret)
- return ret;
+ cs = intel_ring_begin(rq, (w->count * 2 + 2));
+ if (IS_ERR(cs))
+ return PTR_ERR(cs);
- cs = intel_ring_begin(rq, (w->count * 2 + 2));
- if (IS_ERR(cs))
- return PTR_ERR(cs);
+ *cs++ = MI_LOAD_REGISTER_IMM(w->count);
+ for (i = 0; i < w->count; i++) {
+ *cs++ = i915_mmio_reg_offset(w->reg[i].addr);
+ *cs++ = w->reg[i].value;
+ }
+ *cs++ = MI_NOOP;
- *cs++ = MI_LOAD_REGISTER_IMM(w->count);
- for (i = 0; i < w->count; i++) {
- *cs++ = i915_mmio_reg_offset(w->reg[i].addr);
- *cs++ = w->reg[i].value;
+ intel_ring_advance(rq, cs);
}
- *cs++ = MI_NOOP;
- intel_ring_advance(rq, cs);
-
- ret = rq->engine->emit_flush(rq, EMIT_BARRIER);
- if (ret)
- return ret;
-
- return 0;
+ return intel_whitelist_workarounds_emit(rq);
}
static void bdw_gt_workarounds_apply(struct drm_i915_private *dev_priv)
@@ -802,31 +796,33 @@ static struct whitelist *whitelist_build(struct intel_engine_cs *engine,
return wa;
}
-static void whitelist_apply(struct intel_engine_cs *engine,
- const struct whitelist *wa)
+static int whitelist_emit(struct i915_request *rq, const struct whitelist *wa)
{
- struct drm_i915_private *dev_priv = engine->i915;
- const u32 base = engine->mmio_base;
+ const u32 base = rq->engine->mmio_base;
unsigned int i;
+ u32 *cs;
- intel_uncore_forcewake_get(engine->i915, FORCEWAKE_ALL);
+ cs = intel_ring_begin(rq, wa->count * 2 + 2);
+ if (IS_ERR(cs))
+ return PTR_ERR(cs);
- for (i = 0; i < wa->count; i++)
- I915_WRITE_FW(RING_FORCE_TO_NONPRIV(base, i),
- i915_mmio_reg_offset(wa->reg[i]));
+ *cs++ = MI_LOAD_REGISTER_IMM(wa->count);
+ for (i = 0; i < wa->count; i++) {
+ *cs++ = i915_mmio_reg_offset(RING_FORCE_TO_NONPRIV(base, i));
+ *cs++ = i915_mmio_reg_offset(wa->reg[i]);
+ }
+ *cs++ = MI_NOOP;
- /* And clear the rest just in case of garbage */
- for (; i < RING_MAX_NONPRIV_SLOTS; i++)
- I915_WRITE_FW(RING_FORCE_TO_NONPRIV(base, i), 0);
+ intel_ring_advance(rq, cs);
- intel_uncore_forcewake_put(engine->i915, FORCEWAKE_ALL);
+ return 0;
}
-void intel_whitelist_workarounds_apply(struct intel_engine_cs *engine)
+static int intel_whitelist_workarounds_emit(struct i915_request *rq)
{
struct whitelist wa;
- whitelist_apply(engine, whitelist_build(engine, &wa));
+ return whitelist_emit(rq, whitelist_build(rq->engine, &wa));
}
#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 b11d0623e626..90503ad0c226 100644
--- a/drivers/gpu/drm/i915/intel_workarounds.h
+++ b/drivers/gpu/drm/i915/intel_workarounds.h
@@ -12,6 +12,4 @@ int intel_ctx_workarounds_emit(struct i915_request *rq);
void intel_gt_workarounds_apply(struct drm_i915_private *dev_priv);
-void intel_whitelist_workarounds_apply(struct intel_engine_cs *engine);
-
#endif
--
2.17.0
More information about the Intel-gfx-trybot
mailing list