[PATCH 3/4] drm/i915: Perform a double reset for gen3 (i915g/i915gm)

Chris Wilson chris at chris-wilson.co.uk
Sat Dec 16 20:06:30 UTC 2017


Older gen3 does not always restart successfully after a reset,
especially following the immediate execution of an empty request, commit
7b6da818d86f ("drm/i915: Restore the kernel context after a GPU reset on
an idle engine"). If we do a double reset, the miscreant machines
survive and it should be safe on all platforms.

Fixes: 7b6da818d86f ("drm/i915: Restore the kernel context after a GPU reset on an idle engine")
Testcase: igt/drv_hangman/error-state-basic #i915g/i915gm
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Cc: Michel Thierry <michel.thierry at intel.com>
---
 drivers/gpu/drm/i915/i915_drv.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 6d39fdf2b604..dad8c166bdaf 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1857,6 +1857,23 @@ static int i915_resume_switcheroo(struct drm_device *dev)
 	return i915_drm_resume(dev);
 }
 
+static int double_gpu_reset(struct drm_i915_private *i915)
+{
+	int err, i;
+
+	intel_gpu_reset(i915, ALL_ENGINES);
+
+	for (i = 0; i < 3; i++) {
+		err = intel_gpu_reset(i915, ALL_ENGINES);
+		if (err == 0)
+			break;
+
+		msleep(100);
+	}
+
+	return err;
+}
+
 /**
  * i915_reset - reset chip after a hang
  * @i915: #drm_i915_private to reset
@@ -1879,7 +1896,6 @@ void i915_reset(struct drm_i915_private *i915, unsigned int flags)
 {
 	struct i915_gpu_error *error = &i915->gpu_error;
 	int ret;
-	int i;
 
 	might_sleep();
 	lockdep_assert_held(&i915->drm.struct_mutex);
@@ -1912,13 +1928,7 @@ void i915_reset(struct drm_i915_private *i915, unsigned int flags)
 		goto error;
 	}
 
-	for (i = 0; i < 3; i++) {
-		ret = intel_gpu_reset(i915, ALL_ENGINES);
-		if (ret == 0)
-			break;
-
-		msleep(100);
-	}
+	ret = double_gpu_reset(i915);
 	if (ret) {
 		dev_err(i915->drm.dev, "Failed to reset chip\n");
 		goto taint;
-- 
2.15.1



More information about the Intel-gfx-trybot mailing list