[PATCH] drm/i915: Real golden context
Oscar Mateo
oscar.mateo at intel.com
Thu Oct 26 23:01:57 UTC 2017
Signed-off-by: Oscar Mateo <oscar.mateo at intel.com>
---
drivers/gpu/drm/i915/intel_lrc.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index e821c1e..75d7cb6 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1838,6 +1838,13 @@ static int gen8_init_rcs_context(struct drm_i915_gem_request *req)
{
int ret;
+ /*
+ * Non-default contexts will already inherit everything they need
+ * from the Golden Context image.
+ */
+ if (!i915_gem_context_is_default(req->ctx))
+ return 0;
+
ret = intel_ring_workarounds_emit(req);
if (ret)
return ret;
@@ -2109,9 +2116,10 @@ static void execlists_init_reg_state(u32 *regs,
CTX_REG(regs, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(engine),
_MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH |
- CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
+ (i915_gem_context_is_default(ctx) ?
+ CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT : 0) |
(HAS_RESOURCE_STREAMER(dev_priv) ?
- CTX_CTRL_RS_CTX_ENABLE : 0)));
+ CTX_CTRL_RS_CTX_ENABLE : 0)));
CTX_REG(regs, CTX_RING_HEAD, RING_HEAD(base), 0);
CTX_REG(regs, CTX_RING_TAIL, RING_TAIL(base), 0);
CTX_REG(regs, CTX_RING_BUFFER_START, RING_START(base), 0);
@@ -2183,7 +2191,8 @@ static void execlists_init_reg_state(u32 *regs,
populate_lr_context(struct i915_gem_context *ctx,
struct drm_i915_gem_object *ctx_obj,
struct intel_engine_cs *engine,
- struct intel_ring *ring)
+ struct intel_ring *ring,
+ uint32_t context_size)
{
void *vaddr;
int ret;
@@ -2202,6 +2211,18 @@ static void execlists_init_reg_state(u32 *regs,
}
ctx_obj->mm.dirty = true;
+ /* Golden context copy */
+ if (!i915_gem_context_is_default(ctx)) {
+ struct drm_i915_private *i915 = engine->i915;
+ struct i915_gem_context *golden_ctx = i915->kernel_context;
+ struct intel_context *golden_ce =
+ &golden_ctx->engine[engine->id];
+
+ memcpy(vaddr + LRC_STATE_PN * PAGE_SIZE,
+ golden_ce->lrc_reg_state,
+ context_size - LRC_STATE_PN * PAGE_SIZE);
+ }
+
/* The second page of the context object contains some fields which must
* be set up prior to the first execution. */
@@ -2251,7 +2272,7 @@ static int execlists_context_deferred_alloc(struct i915_gem_context *ctx,
goto error_deref_obj;
}
- ret = populate_lr_context(ctx, ctx_obj, engine, ring);
+ ret = populate_lr_context(ctx, ctx_obj, engine, ring, context_size);
if (ret) {
DRM_DEBUG_DRIVER("Failed to populate LRC: %d\n", ret);
goto error_ring_free;
--
1.9.1
More information about the Intel-gfx-trybot
mailing list