diff mbox

[3/6] drm/i915: Mark all default contexts as uninitialised after context loss

Message ID 1464176933-31067-4-git-send-email-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson May 25, 2016, 11:48 a.m. UTC
When the GPU is reset or state lost through suspend, every default
legacy context needs to reload their state - both the golden render
state and the L3 mapping. Only context images explicitly saved to memory
(i.e. all execlists and non-default legacy contexts) will retain their
state across the reset.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_context.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

Comments

Joonas Lahtinen May 25, 2016, 12:43 p.m. UTC | #1
On ke, 2016-05-25 at 12:48 +0100, Chris Wilson wrote:
> When the GPU is reset or state lost through suspend, every default
> legacy context needs to reload their state - both the golden render
> state and the L3 mapping. Only context images explicitly saved to memory
> (i.e. all execlists and non-default legacy contexts) will retain their
> state across the reset.
> 

Should not hurt at least.

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_gem_context.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 3e3acd054f05..62de72a947e5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -470,7 +470,21 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
>  		}
>  	}
>  
> -	/* Force the GPU state to be restore on enabling */
> +	/* Force the GPU state to be restored on enabling */
> +	if (!i915.enable_execlists) {
> +		struct i915_gem_context *ctx;
> +
> +		list_for_each_entry(ctx, &dev_priv->context_list, link) {
> +			if (!i915_gem_context_is_default(ctx))
> +				continue;
> +
> +			for_each_engine(engine, dev_priv)
> +				ctx->engine[engine->id].initialised = false;
> +
> +			ctx->remap_slice = ALL_L3_SLICES(dev_priv);
> +		}
> +	}
> +
>  	for_each_engine(engine, dev_priv) {
>  		struct intel_context *ce =
>  			&dev_priv->kernel_context->engine[engine->id];
> @@ -478,7 +492,6 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
>  		ce->initialised =
>  			!i915.enable_execlists || engine->init_context == NULL;
>  	}
> -	dev_priv->kernel_context->remap_slice = ALL_L3_SLICES(dev_priv);
>  }
>  
>  void i915_gem_context_fini(struct drm_device *dev)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 3e3acd054f05..62de72a947e5 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -470,7 +470,21 @@  void i915_gem_context_lost(struct drm_i915_private *dev_priv)
 		}
 	}
 
-	/* Force the GPU state to be restore on enabling */
+	/* Force the GPU state to be restored on enabling */
+	if (!i915.enable_execlists) {
+		struct i915_gem_context *ctx;
+
+		list_for_each_entry(ctx, &dev_priv->context_list, link) {
+			if (!i915_gem_context_is_default(ctx))
+				continue;
+
+			for_each_engine(engine, dev_priv)
+				ctx->engine[engine->id].initialised = false;
+
+			ctx->remap_slice = ALL_L3_SLICES(dev_priv);
+		}
+	}
+
 	for_each_engine(engine, dev_priv) {
 		struct intel_context *ce =
 			&dev_priv->kernel_context->engine[engine->id];
@@ -478,7 +492,6 @@  void i915_gem_context_lost(struct drm_i915_private *dev_priv)
 		ce->initialised =
 			!i915.enable_execlists || engine->init_context == NULL;
 	}
-	dev_priv->kernel_context->remap_slice = ALL_L3_SLICES(dev_priv);
 }
 
 void i915_gem_context_fini(struct drm_device *dev)