We don't know in what shape the default context was before reset.
The reset also dropped our changes that were done in
ring->init_context.

Mark our default context as uninitialized for it to be properly
setup up on reset recovery .

Signed-off-by: Mika Kuoppala <mika.kuopp...@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c     |  2 +-
 drivers/gpu/drm/i915/i915_drv.h         |  4 ++--
 drivers/gpu/drm/i915/i915_gem_context.c | 42 +++++++++++++++++++++------------
 drivers/gpu/drm/i915/intel_lrc.c        |  4 ++--
 4 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 0ba5c71..a03361c 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -176,7 +176,7 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object 
*obj)
 
 static void describe_ctx(struct seq_file *m, struct intel_context *ctx)
 {
-       seq_putc(m, ctx->legacy_hw_ctx.initialized ? 'I' : 'i');
+       seq_putc(m, ctx->initialized ? 'I' : 'i');
        seq_putc(m, ctx->remap_slice ? 'R' : 'r');
        seq_putc(m, ' ');
 }
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 07dafa2..49b45ec 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -637,16 +637,16 @@ struct intel_context {
        /* Legacy ring buffer submission */
        struct {
                struct drm_i915_gem_object *rcs_state;
-               bool initialized;
        } legacy_hw_ctx;
 
        /* Execlists */
-       bool rcs_initialized;
        struct {
                struct drm_i915_gem_object *state;
                struct intel_ringbuffer *ringbuf;
        } engine[I915_NUM_RINGS];
 
+       bool initialized;
+
        struct list_head link;
 };
 
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index a5221d8..b479840 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -306,6 +306,8 @@ void i915_gem_context_reset(struct drm_device *dev)
                        i915_gem_context_unreference(lctx);
                        ring->last_context = NULL;
                }
+
+               ring->default_context->initialized = false;
        }
 }
 
@@ -515,13 +517,30 @@ mi_set_context(struct intel_engine_cs *ring,
        return ret;
 }
 
+static void context_state_init(struct intel_engine_cs *ring,
+                              struct intel_context *to)
+{
+       int ret;
+
+       if (ring->init_context) {
+               ret = ring->init_context(ring);
+               if (ret)
+                       DRM_ERROR("ring init context: %d\n", ret);
+       }
+
+       if (ring->id == RCS) {
+               ret = i915_gem_render_state_init(ring);
+               if (ret)
+                       DRM_ERROR("init render state: %d\n", ret);
+       }
+}
+
 static int do_switch(struct intel_engine_cs *ring,
                     struct intel_context *to)
 {
        struct drm_i915_private *dev_priv = ring->dev->dev_private;
        struct intel_context *from = ring->last_context;
        u32 hw_flags = 0;
-       bool uninitialized = false;
        int ret, i;
 
        if (from != NULL && ring == &dev_priv->ring[RCS]) {
@@ -577,7 +596,7 @@ static int do_switch(struct intel_engine_cs *ring,
                vma->bind_vma(vma, to->legacy_hw_ctx.rcs_state->cache_level, 
GLOBAL_BIND);
        }
 
-       if (!to->legacy_hw_ctx.initialized || i915_gem_context_is_default(to))
+       if (!to->initialized || i915_gem_context_is_default(to))
                hw_flags |= MI_RESTORE_INHIBIT;
 
        ret = mi_set_context(ring, to, hw_flags);
@@ -618,26 +637,19 @@ static int do_switch(struct intel_engine_cs *ring,
                /* obj is kept alive until the next request by its active ref */
                i915_gem_object_ggtt_unpin(from->legacy_hw_ctx.rcs_state);
                i915_gem_context_unreference(from);
-       }
 
-       uninitialized = !to->legacy_hw_ctx.initialized && from == NULL;
-       to->legacy_hw_ctx.initialized = true;
+               /* We inherit the state from the previous context */
+               to->initialized = true;
+       }
 
 done:
        i915_gem_context_reference(to);
        ring->last_context = to;
 
-       if (uninitialized) {
-               if (ring->init_context) {
-                       ret = ring->init_context(ring);
-                       if (ret)
-                               DRM_ERROR("ring init context: %d\n", ret);
-               }
+       if (!to->initialized)
+               context_state_init(ring, to);
 
-               ret = i915_gem_render_state_init(ring);
-               if (ret)
-                       DRM_ERROR("init render state: %d\n", ret);
-       }
+       to->initialized = true;
 
        return 0;
 
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 803fc38..4899a3c 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1744,7 +1744,7 @@ int intel_lr_context_deferred_create(struct intel_context 
*ctx,
                ring->status_page.obj = ctx_obj;
        }
 
-       if (ring->id == RCS && !ctx->rcs_initialized) {
+       if (ring->id == RCS && !ctx->initialized) {
                ret = intel_lr_context_render_state_init(ring, ctx);
                if (ret) {
                        DRM_ERROR("Init render state failed: %d\n", ret);
@@ -1753,7 +1753,7 @@ int intel_lr_context_deferred_create(struct intel_context 
*ctx,
                        intel_destroy_ringbuffer_obj(ringbuf);
                        goto error;
                }
-               ctx->rcs_initialized = true;
+               ctx->initialized = true;
        }
 
        return 0;
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to