[Intel-gfx] [PATCH 3/5] drm/i915/contexts: Switch to default on resume

Ben Widawsky ben at bwidawsk.net
Tue Aug 14 23:35:15 CEST 2012


In order to make the HW state CCID match with what we think it should
be, we must order a switch to the default context.

The really sad thing here is that the switch can potentially fail, and
as such we have to assume contexts no longer work. There is likely room
for improvement but until we actually start seeing the case occur, I
think it should be fine.

This was accidentally left this out of the first series, noticed by
Chris Wilson.

Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_gem_context.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 5c2d354..3e884dc 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -244,15 +244,26 @@ void i915_gem_context_init(struct drm_device *dev)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	uint32_t ctx_size;
 
+	if (dev_priv->hw_contexts_disabled)
+		return;
+
 	if (!HAS_HW_CONTEXTS(dev)) {
 		dev_priv->hw_contexts_disabled = true;
 		return;
 	}
 
-	/* If called from reset, or thaw... we've been here already */
-	if (dev_priv->hw_contexts_disabled ||
-	    dev_priv->ring[RCS].default_context)
+	/* If called from reset, or thaw we want to switch back to the default
+	 * context so our HW CCID matches what we think it should be in software.
+	 */
+	if (dev_priv->ring[RCS].default_context) {
+		int ret = do_switch(dev_priv->ring[RCS].default_context);
+		if (ret) {
+			DRM_ERROR("HW contexts were broken after resume\n");
+			i915_gem_context_fini(dev);
+			dev_priv->hw_contexts_disabled = true;
+		}
 		return;
+	}
 
 	ctx_size = get_context_size(dev);
 	dev_priv->hw_context_size = get_context_size(dev);
-- 
1.7.11.4




More information about the Intel-gfx mailing list