From 093a0bea629ac8e4f2ee9a3ffc30817139452937 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Thu, 31 Dec 2020 17:04:05 +0000 Subject: [PATCH] drm/i915: Populate logical context during first pin. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows us to remove pin_map from state allocation, which saves us a few retry loops. We won't need this until first pin, anyway. Signed-off-by: Maarten Lankhorst Reviewed-by: Thomas Hellström Signed-off-by: Chris Wilson Link: https://patchwork.freedesktop.org/patch/msgid/20201231170405.22843-1-chris@chris-wilson.co.uk --- drivers/gpu/drm/i915/gt/intel_context_types.h | 13 +++--- .../drm/i915/gt/intel_execlists_submission.c | 43 +------------------ drivers/gpu/drm/i915/gt/intel_lrc.c | 4 ++ 3 files changed, 13 insertions(+), 47 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/intel_context_types.h b/drivers/gpu/drm/i915/gt/intel_context_types.h index 430aafb78ed3..e10d78601bbd 100644 --- a/drivers/gpu/drm/i915/gt/intel_context_types.h +++ b/drivers/gpu/drm/i915/gt/intel_context_types.h @@ -89,12 +89,13 @@ struct intel_context { unsigned long flags; #define CONTEXT_BARRIER_BIT 0 #define CONTEXT_ALLOC_BIT 1 -#define CONTEXT_VALID_BIT 2 -#define CONTEXT_CLOSED_BIT 3 -#define CONTEXT_USE_SEMAPHORES 4 -#define CONTEXT_BANNED 5 -#define CONTEXT_FORCE_SINGLE_SUBMISSION 6 -#define CONTEXT_NOPREEMPT 7 +#define CONTEXT_INIT_BIT 2 +#define CONTEXT_VALID_BIT 3 +#define CONTEXT_CLOSED_BIT 4 +#define CONTEXT_USE_SEMAPHORES 5 +#define CONTEXT_BANNED 6 +#define CONTEXT_FORCE_SINGLE_SUBMISSION 7 +#define CONTEXT_NOPREEMPT 8 u32 *lrc_reg_state; union { diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c index cb2491ec6d3f..2afbc0a4ca03 100644 --- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c @@ -2500,48 +2500,9 @@ static int execlists_context_pin(struct intel_context *ce, void *vaddr) return lrc_pin(ce, ce->engine, vaddr); } -static int __lrc_setup(struct intel_context *ce, - struct intel_engine_cs *engine) -{ - struct drm_i915_gem_object *obj = ce->state->obj; - void *vaddr; - - vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB); - if (IS_ERR(vaddr)) { - drm_dbg(&engine->i915->drm, "Could not map object pages!\n"); - return PTR_ERR(vaddr); - } - - lrc_init_state(ce, engine, vaddr); - - __i915_gem_object_flush_map(obj, 0, engine->context_size); - i915_gem_object_unpin_map(obj); - return 0; -} - -static int __execlists_context_alloc(struct intel_context *ce, - struct intel_engine_cs *engine) -{ - int err; - - err = lrc_alloc(ce, engine); - if (err) - return err; - - err = __lrc_setup(ce, engine); - if (err) - goto err_lrc; - - return 0; - -err_lrc: - lrc_fini(ce); - return err; -} - static int execlists_context_alloc(struct intel_context *ce) { - return __execlists_context_alloc(ce, ce->engine); + return lrc_alloc(ce, ce->engine); } static const struct intel_context_ops execlists_context_ops = { @@ -3414,7 +3375,7 @@ static int virtual_context_alloc(struct intel_context *ce) { struct virtual_engine *ve = container_of(ce, typeof(*ve), context); - return __execlists_context_alloc(ce, ve->siblings[0]); + return lrc_alloc(ce, ve->siblings[0]); } static int virtual_context_pre_pin(struct intel_context *ce, diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c index 008f50a86355..4e856947fb13 100644 --- a/drivers/gpu/drm/i915/gt/intel_lrc.c +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c @@ -916,6 +916,10 @@ lrc_pin(struct intel_context *ce, void *vaddr) { ce->lrc_reg_state = vaddr + LRC_STATE_OFFSET; + + if (!__test_and_set_bit(CONTEXT_INIT_BIT, &ce->flags)) + lrc_init_state(ce, engine, vaddr); + ce->lrc.lrca = lrc_update_regs(ce, engine, ce->ring->tail); return 0; }