drm/i915/gt: Track the context validity explicitly
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 3 Dec 2019 12:41:55 +0000 (12:41 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 3 Dec 2019 16:49:31 +0000 (16:49 +0000)
Rather than assume if and only if the engine->default_state is not set
that the context is invalid, instead track when we know the context has
valid state -- either because we have copied the default_state or we
have completed a context switch to save the HW state.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191203124155.3019926-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_context.c
drivers/gpu/drm/i915/gt/intel_context_types.h
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/gt/intel_ring_submission.c

index b5e9c35ec6b8c96fb204e7514622c5b2f90e5814..c5e52ad394633e65007cf6f2de39e167964b7b02 100644 (file)
@@ -147,6 +147,7 @@ static void __intel_context_retire(struct i915_active *active)
        GEM_TRACE("%s context:%llx retire\n",
                  ce->engine->name, ce->timeline->fence_context);
 
+       set_bit(CONTEXT_VALID_BIT, &ce->flags);
        if (ce->state)
                __context_unpin_state(ce->state);
 
index 6959b05ae5f8d5709ab29c6ce682a2e166d4038b..d1204cc899a337a44efc8c4faa5561a1a1dde206 100644 (file)
@@ -55,6 +55,7 @@ struct intel_context {
 
        unsigned long flags;
 #define CONTEXT_ALLOC_BIT 0
+#define CONTEXT_VALID_BIT 1
 
        u32 *lrc_reg_state;
        u64 lrc_desc;
index 82807918382d4b73d8914b192df354131e5851c0..a743876645835a468966dfdf9afe2131dc84a1d0 100644 (file)
@@ -4102,6 +4102,7 @@ populate_lr_context(struct intel_context *ce,
 
                memcpy(vaddr, defaults, engine->context_size);
                i915_gem_object_unpin_map(engine->default_state);
+               __set_bit(CONTEXT_VALID_BIT, &ce->flags);
                inhibit = false;
        }
 
index dcdeef0a776fbf7a132fdb699ee07fce4ef3cba2..093cec103b4cae0f1f16d33329829937ebab3cda 100644 (file)
@@ -1319,6 +1319,8 @@ static int ring_context_alloc(struct intel_context *ce)
                        return PTR_ERR(vma);
 
                ce->state = vma;
+               if (engine->default_state)
+                       __set_bit(CONTEXT_VALID_BIT, &ce->flags);
        }
 
        return 0;
@@ -1625,7 +1627,7 @@ static int switch_context(struct i915_request *rq)
        if (ce->state) {
                GEM_BUG_ON(rq->engine->id != RCS0);
 
-               if (!rq->engine->default_state)
+               if (!test_bit(CONTEXT_VALID_BIT, &ce->flags))
                        hw_flags = MI_RESTORE_INHIBIT;
 
                ret = mi_set_context(rq, hw_flags);