[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