drm/i915/gt: Track the context validity explicitly
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
This commit is contained in:
parent
49e74c8f9a
commit
f70de8d2ca
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user