diff options
author | Mika Kuoppala <mika.kuoppala@intel.com> | 2015-12-11 14:22:10 +0200 |
---|---|---|
committer | Mika Kuoppala <mika.kuoppala@intel.com> | 2015-12-11 15:13:17 +0200 |
commit | fc9660a048e8df703aa5ce842b494bfac12db734 (patch) | |
tree | edd785cb2e4af5a8250a30641b54643332f7c111 | |
parent | 73f3fbf0b4c745c119975573661c24c64e926dec (diff) |
drm/i915: Remove the special handling for lr default contextexeclists_no_special_default
Instead of having special casing the handling of default context,
pin it in init and unpin in cleanup. The rest of the code
becomes clear of all special casing for this context.
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 179 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.h | 2 |
3 files changed, 95 insertions, 95 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 8e2acdebc74a..97b8a72f47a6 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2625,10 +2625,8 @@ void i915_gem_request_free(struct kref *req_ref) i915_gem_request_remove_from_client(req); if (ctx) { - if (i915.enable_execlists) { - if (ctx != req->ring->default_context) - intel_lr_context_unpin(req); - } + if (i915.enable_execlists) + intel_lr_request_unpin(req); i915_gem_context_unreference(ctx); } @@ -2773,8 +2771,7 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv, execlist_link); list_del(&submit_req->execlist_link); - if (submit_req->ctx != ring->default_context) - intel_lr_context_unpin(submit_req); + intel_lr_request_unpin(submit_req); i915_gem_request_unreference(submit_req); } diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index b1063d056fda..881acb1f48b0 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -225,7 +225,6 @@ enum { #define GEN8_CTX_ID_SHIFT 32 #define CTX_RCS_INDIRECT_CTX_OFFSET_DEFAULT 0x17 -static int intel_lr_context_pin(struct drm_i915_gem_request *rq); static void lrc_setup_hardware_status_page(struct intel_engine_cs *ring, struct drm_i915_gem_object *default_ctx_obj); @@ -263,6 +262,87 @@ int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists return 0; } +static int intel_lr_context_do_pin(struct intel_engine_cs *ring, + struct drm_i915_gem_object *ctx_obj, + struct intel_ringbuffer *ringbuf) +{ + struct drm_device *dev = ring->dev; + struct drm_i915_private *dev_priv = dev->dev_private; + int ret = 0; + + WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex)); + ret = i915_gem_obj_ggtt_pin(ctx_obj, GEN8_LR_CONTEXT_ALIGN, + PIN_OFFSET_BIAS | GUC_WOPCM_TOP); + if (ret) + return ret; + + ret = intel_pin_and_map_ringbuffer_obj(ring->dev, ringbuf); + if (ret) + goto unpin_ctx_obj; + + ctx_obj->dirty = true; + + /* Invalidate GuC TLB. */ + if (i915.enable_guc_submission) + I915_WRITE(GEN8_GTCR, GEN8_GTCR_INVALIDATE); + + return ret; + +unpin_ctx_obj: + i915_gem_object_ggtt_unpin(ctx_obj); + + return ret; +} + +static int intel_lr_context_pin(struct intel_engine_cs *ring, + struct intel_context *ctx, + struct intel_ringbuffer *ringbuf) +{ + struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state; + int ret = 0; + + if (!ctx_obj) + return ret; + + if (ctx->engine[ring->id].pin_count++ == 0) { + ret = intel_lr_context_do_pin(ring, ctx_obj, ringbuf); + if (ret) + goto reset_pin_count; + } + + return ret; + +reset_pin_count: + ctx->engine[ring->id].pin_count = 0; + return ret; +} + +static void intel_lr_context_unpin(struct intel_engine_cs *ring, + struct intel_context *ctx, + struct intel_ringbuffer *ringbuf) +{ + struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state; + + if (!ctx_obj) + return; + + WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex)); + if (--ctx->engine[ring->id].pin_count == 0) { + intel_unpin_ringbuffer_obj(ringbuf); + i915_gem_object_ggtt_unpin(ctx_obj); + } +} + +static int intel_lr_request_pin(struct drm_i915_gem_request *rq) +{ + return intel_lr_context_pin(rq->ring, rq->ctx, rq->ringbuf); +} + +void intel_lr_request_unpin(struct drm_i915_gem_request *rq) +{ + intel_lr_context_unpin(rq->ring, rq->ctx, rq->ringbuf); +} + /** * intel_execlists_ctx_id() - get the Execlists Context ID * @ctx_obj: Logical Ring Context backing object. @@ -571,8 +651,7 @@ static int execlists_context_queue(struct drm_i915_gem_request *request) struct drm_i915_gem_request *cursor; int num_elements = 0; - if (request->ctx != ring->default_context) - intel_lr_context_pin(request); + intel_lr_request_pin(request); i915_gem_request_reference(request); @@ -664,11 +743,9 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request request->ringbuf = request->ctx->engine[request->ring->id].ringbuf; - if (request->ctx != request->ring->default_context) { - ret = intel_lr_context_pin(request); - if (ret) - return ret; - } + ret = intel_lr_request_pin(request); + if (ret) + return ret; return 0; } @@ -963,12 +1040,7 @@ void intel_execlists_retire_requests(struct intel_engine_cs *ring) spin_unlock_irq(&ring->execlist_lock); list_for_each_entry_safe(req, tmp, &retired_list, execlist_link) { - struct intel_context *ctx = req->ctx; - struct drm_i915_gem_object *ctx_obj = - ctx->engine[ring->id].state; - - if (ctx != ring->default_context)) - intel_lr_context_unpin(req); + intel_lr_request_unpin(req); list_del(&req->execlist_link); i915_gem_request_unreference(req); } @@ -1012,76 +1084,6 @@ int logical_ring_flush_all_caches(struct drm_i915_gem_request *req) return 0; } -static int intel_lr_context_do_pin(struct intel_engine_cs *ring, - struct drm_i915_gem_object *ctx_obj, - struct intel_ringbuffer *ringbuf) -{ - struct drm_device *dev = ring->dev; - struct drm_i915_private *dev_priv = dev->dev_private; - int ret = 0; - - WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex)); - ret = i915_gem_obj_ggtt_pin(ctx_obj, GEN8_LR_CONTEXT_ALIGN, - PIN_OFFSET_BIAS | GUC_WOPCM_TOP); - if (ret) - return ret; - - ret = intel_pin_and_map_ringbuffer_obj(ring->dev, ringbuf); - if (ret) - goto unpin_ctx_obj; - - ctx_obj->dirty = true; - - /* Invalidate GuC TLB. */ - if (i915.enable_guc_submission) - I915_WRITE(GEN8_GTCR, GEN8_GTCR_INVALIDATE); - - return ret; - -unpin_ctx_obj: - i915_gem_object_ggtt_unpin(ctx_obj); - - return ret; -} - -static int intel_lr_context_pin(struct drm_i915_gem_request *rq) -{ - int ret = 0; - struct intel_engine_cs *ring = rq->ring; - struct drm_i915_gem_object *ctx_obj = rq->ctx->engine[ring->id].state; - struct intel_ringbuffer *ringbuf = rq->ringbuf; - - if (!ctx_obj) - return 0; - - if (rq->ctx->engine[ring->id].pin_count++ == 0) { - ret = intel_lr_context_do_pin(ring, ctx_obj, ringbuf); - if (ret) - goto reset_pin_count; - } - return ret; - -reset_pin_count: - rq->ctx->engine[ring->id].pin_count = 0; - return ret; -} - -void intel_lr_context_unpin(struct drm_i915_gem_request *rq) -{ - struct intel_engine_cs *ring = rq->ring; - struct drm_i915_gem_object *ctx_obj = rq->ctx->engine[ring->id].state; - struct intel_ringbuffer *ringbuf = rq->ringbuf; - - if (!ctx_obj) - return; - - WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex)); - if (--rq->ctx->engine[ring->id].pin_count == 0) { - intel_unpin_ringbuffer_obj(ringbuf); - i915_gem_object_ggtt_unpin(ctx_obj); - } -} - static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req) { int ret, i; @@ -1915,6 +1917,9 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring) } lrc_destroy_wa_ctx_obj(ring); + + intel_lr_context_unpin(ring, ring->default_context, + ring->default_context->engine[ring->id].ringbuf); ring->dev = NULL; } @@ -1945,10 +1950,8 @@ static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *rin goto error; /* As this is the default context, always pin it */ - ret = intel_lr_context_do_pin( - ring, - ring->default_context->engine[ring->id].state, - ring->default_context->engine[ring->id].ringbuf); + ret = intel_lr_context_pin(ring, ring->default_context, + ring->default_context->engine[ring->id].ringbuf); if (ret) { DRM_ERROR( "Failed to pin and map ringbuffer %s: %d\n", diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h index 0b821b91723a..e8088b2551e0 100644 --- a/drivers/gpu/drm/i915/intel_lrc.h +++ b/drivers/gpu/drm/i915/intel_lrc.h @@ -86,7 +86,7 @@ static inline void intel_logical_ring_emit_reg(struct intel_ringbuffer *ringbuf, void intel_lr_context_free(struct intel_context *ctx); int intel_lr_context_deferred_alloc(struct intel_context *ctx, struct intel_engine_cs *ring); -void intel_lr_context_unpin(struct drm_i915_gem_request *req); +void intel_lr_request_unpin(struct drm_i915_gem_request *req); void intel_lr_context_reset(struct drm_device *dev, struct intel_context *ctx); uint64_t intel_lr_context_descriptor(struct intel_context *ctx, |