Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/intel_lrc.c | 56 +++++++++++++++++---------------- drivers/gpu/drm/i915/intel_ringbuffer.h | 3 +- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index f4535832cf53..98c0a76fc560 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -230,37 +230,13 @@ int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists return 0; } -static uint32_t execlists_ctx_descriptor(struct intel_engine_cs *engine, - uint32_t ggtt_offset) -{ - uint32_t desc; - - desc = GEN8_CTX_VALID; - desc |= LEGACY_CONTEXT << GEN8_CTX_MODE_SHIFT; - desc |= GEN8_CTX_L3LLC_COHERENT; - desc |= GEN8_CTX_PRIVILEGE; - desc |= ggtt_offset; - - /* TODO: WaDisableLiteRestore when we start using semaphore - * signalling between Command Streamers */ - /* desc |= GEN8_CTX_FORCE_RESTORE; */ - - /* WaEnableForceRestoreInCtxtDescForVCS:skl */ - if (IS_GEN9(engine->dev) && INTEL_REVID(engine->dev) <= SKL_REVID_B0 && - (engine->id == BCS || engine->id == VCS || - engine->id == VECS || engine->id == VCS2)) - desc |= GEN8_CTX_FORCE_RESTORE; - - return desc; -} - static uint32_t execlists_request_write_tail(struct intel_engine_cs *engine, struct drm_i915_gem_request *rq) { struct intel_ringbuffer *ring = rq->ctx->engine[engine->id].ringbuf; ring->regs[CTX_RING_TAIL+1] = rq->tail; - return execlists_ctx_descriptor(engine, ring->ggtt_offset); + return ring->descriptor; } static void execlists_submit_pair(struct intel_engine_cs *ring) @@ -702,6 +678,7 @@ static int intel_lr_context_pin(struct intel_engine_cs *ring, { struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state; struct intel_ringbuffer *ringbuf = ctx->engine[ring->id].ringbuf; + u32 ggtt_offset; int ret; WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex)); @@ -712,11 +689,12 @@ static int intel_lr_context_pin(struct intel_engine_cs *ring, if (ret) goto reset_pin_count; - ringbuf->ggtt_offset = i915_gem_obj_ggtt_offset(ctx_obj); - if (WARN_ON(ringbuf->ggtt_offset & 0xFFFFFFFF00000FFFULL)) { + ggtt_offset = i915_gem_obj_ggtt_offset(ctx_obj); + if (WARN_ON(ggtt_offset & 0xFFFFFFFF00000FFFULL)) { ret = -ENODEV; goto unpin_ctx_obj; } + ringbuf->descriptor = ggtt_offset | ring->execlist_ctx_descriptor; ret = intel_pin_and_map_ringbuffer_obj(ring->dev, ringbuf); if (ret) @@ -1232,6 +1210,28 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring) } } +static uint32_t base_ctx_descriptor(struct intel_engine_cs *engine) +{ + uint32_t desc; + + desc = GEN8_CTX_VALID; + desc |= LEGACY_CONTEXT << GEN8_CTX_MODE_SHIFT; + desc |= GEN8_CTX_L3LLC_COHERENT; + desc |= GEN8_CTX_PRIVILEGE; + + /* TODO: WaDisableLiteRestore when we start using semaphore + * signalling between Command Streamers */ + /* desc |= GEN8_CTX_FORCE_RESTORE; */ + + /* WaEnableForceRestoreInCtxtDescForVCS:skl */ + if (IS_GEN9(engine->dev) && INTEL_REVID(engine->dev) <= SKL_REVID_B0 && + (engine->id == BCS || engine->id == VCS || + engine->id == VECS || engine->id == VCS2)) + desc |= GEN8_CTX_FORCE_RESTORE; + + return desc; +} + static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *ring) { int ret; @@ -1253,6 +1253,8 @@ static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *rin if (ret) return ret; + ring->execlist_ctx_descriptor = base_ctx_descriptor(ring); + ret = intel_lr_context_deferred_create(ring->default_context, ring); return ret; diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 1f04b607fbcc..dc9f5ac21833 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -98,7 +98,7 @@ struct intel_ringbuffer { struct drm_i915_gem_object *obj; void __iomem *virtual_start; uint32_t *regs; - uint32_t ggtt_offset; + uint32_t descriptor; struct intel_engine_cs *ring; @@ -243,6 +243,7 @@ struct intel_engine_cs { struct drm_i915_gem_request *execlist_port[2]; struct list_head execlist_queue; struct list_head execlist_completed; + u32 execlist_ctx_descriptor; u8 next_context_status_buffer; u32 irq_keep_mask; /* bitmask for interrupts that should not be masked */ int (*emit_request)(struct intel_ringbuffer *ringbuf, -- 2.1.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx