From: Tvrtko Ursulin <[email protected]>

There is no point in doing several gen and static feature dependant
branches multiple times per interrupt handled. Do them once on
ring setup and use the cached values.

Signed-off-by: Tvrtko Ursulin <[email protected]>
---
 drivers/gpu/drm/i915/intel_lrc.c        | 34 +++++++++++++++++----------------
 drivers/gpu/drm/i915/intel_ringbuffer.h |  2 ++
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 06180dce954e..ea031bb46909 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -293,29 +293,15 @@ uint64_t intel_lr_context_descriptor(struct intel_context 
*ctx,
                                     struct intel_engine_cs *ring)
 {
        struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state;
-       uint64_t desc;
+       uint64_t desc = ring->ctx_desc_template;
        uint64_t lrca = i915_gem_obj_ggtt_offset(ctx_obj) +
                        LRC_PPHWSP_PN * PAGE_SIZE;
 
        WARN_ON(lrca & 0xFFFFFFFF00000FFFULL);
 
-       desc = GEN8_CTX_VALID;
-       desc |= GEN8_CTX_ADDRESSING_MODE(dev) << GEN8_CTX_ADDRESSING_MODE_SHIFT;
-       if (IS_GEN8(ctx_obj->base.dev))
-               desc |= GEN8_CTX_L3LLC_COHERENT;
-       desc |= GEN8_CTX_PRIVILEGE;
        desc |= lrca;
        desc |= (u64)intel_execlists_ctx_id(ctx_obj) << GEN8_CTX_ID_SHIFT;
 
-       /* TODO: WaDisableLiteRestore when we start using semaphore
-        * signalling between Command Streamers */
-       /* desc |= GEN8_CTX_FORCE_RESTORE; */
-
-       /* WaEnableForceRestoreInCtxtDescForVCS:skl */
-       /* WaEnableForceRestoreInCtxtDescForVCS:bxt */
-       if (disable_lite_restore_wa(ring))
-               desc |= GEN8_CTX_FORCE_RESTORE;
-
        return desc;
 }
 
@@ -540,7 +526,7 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring)
                }
        }
 
-       if (disable_lite_restore_wa(ring)) {
+       if (ring->disable_lite_restore_wa) {
                /* Prevent a ctx to preempt itself */
                if ((status & GEN8_CTX_STATUS_ACTIVE_IDLE) &&
                    (submit_contexts != 0))
@@ -1948,6 +1934,22 @@ static int logical_ring_init(struct drm_device *dev, 
struct intel_engine_cs *rin
                return ret;
        }
 
+       ring->disable_lite_restore_wa = disable_lite_restore_wa(ring);
+
+       ring->ctx_desc_template = GEN8_CTX_VALID;
+       ring->ctx_desc_template |= GEN8_CTX_ADDRESSING_MODE(dev) <<
+                                  GEN8_CTX_ADDRESSING_MODE_SHIFT;
+       if (IS_GEN8(dev))
+               ring->ctx_desc_template |= GEN8_CTX_L3LLC_COHERENT;
+       ring->ctx_desc_template |= GEN8_CTX_PRIVILEGE;
+
+       /* TODO: WaDisableLiteRestore when we start using semaphore
+        * signalling between Command Streamers */
+       /* WaEnableForceRestoreInCtxtDescForVCS:skl */
+       /* WaEnableForceRestoreInCtxtDescForVCS:bxt */
+       if (ring->disable_lite_restore_wa)
+               ring->ctx_desc_template |= GEN8_CTX_FORCE_RESTORE;
+
        return ret;
 }
 
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 58b1976a7d0a..ad9cd6d73ab5 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -268,6 +268,8 @@ struct  intel_engine_cs {
        struct list_head execlist_queue;
        struct list_head execlist_retired_req_list;
        u8 next_context_status_buffer;
+       bool disable_lite_restore_wa;
+       u32 ctx_desc_template;
        u32             irq_keep_mask; /* bitmask for interrupts that should 
not be masked */
        int             (*emit_request)(struct drm_i915_gem_request *request);
        int             (*emit_flush)(struct drm_i915_gem_request *request,
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to