[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