drm/i915: Populate logical context during first pin.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Thu, 31 Dec 2020 17:04:05 +0000 (17:04 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 1 Jan 2021 22:16:01 +0000 (22:16 +0000)
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 <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20201231170405.22843-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_context_types.h
drivers/gpu/drm/i915/gt/intel_execlists_submission.c
drivers/gpu/drm/i915/gt/intel_lrc.c

index 430aafb78ed357917202450b536a0bf3ee9f4397..e10d78601bbd830f84a740dd4507bd3be093db89 100644 (file)
@@ -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 {
index cb2491ec6d3f2c055a3be1d7d9a7a51b700badb9..2afbc0a4ca031af126975e5a683f63f546a81ee7 100644 (file)
@@ -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,
index 008f50a86355ae6c1e5510e5eeb943c3106c09cd..4e856947fb13b786b24b199e1931c407999de16f 100644 (file)
@@ -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;
 }