drm/i915/selftests: Always use an active engine while resetting
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 13 Feb 2019 22:48:05 +0000 (22:48 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Feb 2019 09:37:31 +0000 (09:37 +0000)
Currently, we only try to reset a live engine for checking the whitelist
retention across a per-engine reset. For safety, it appears we need to
prime the system with a hanging spinner before performing a full-device
reset. (Figuring out the root cause behind the instability with handling
a reset during a no-op request is a challenge for another test, the
whitelist test has its own purpose.)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109626
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190213224805.32021-1-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
drivers/gpu/drm/i915/selftests/intel_workarounds.c

index b15c4f2..d6bb200 100644 (file)
@@ -237,14 +237,8 @@ switch_to_scratch_context(struct intel_engine_cs *engine,
                return PTR_ERR(ctx);
 
        rq = ERR_PTR(-ENODEV);
-       with_intel_runtime_pm(engine->i915, wakeref) {
-               if (spin)
-                       rq = igt_spinner_create_request(spin,
-                                                       ctx, engine,
-                                                       MI_NOOP);
-               else
-                       rq = i915_request_alloc(engine, ctx);
-       }
+       with_intel_runtime_pm(engine->i915, wakeref)
+               rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);
 
        kernel_context_close(ctx);
 
@@ -273,7 +267,6 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
                                        const char *name)
 {
        struct drm_i915_private *i915 = engine->i915;
-       bool want_spin = reset == do_engine_reset;
        struct i915_gem_context *ctx;
        struct igt_spinner spin;
        intel_wakeref_t wakeref;
@@ -282,11 +275,9 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
        pr_info("Checking %d whitelisted registers (RING_NONPRIV) [%s]\n",
                engine->whitelist.count, name);
 
-       if (want_spin) {
-               err = igt_spinner_init(&spin, i915);
-               if (err)
-                       return err;
-       }
+       err = igt_spinner_init(&spin, i915);
+       if (err)
+               return err;
 
        ctx = kernel_context(i915);
        if (IS_ERR(ctx))
@@ -298,17 +289,15 @@ static int check_whitelist_across_reset(struct intel_engine_cs *engine,
                goto out;
        }
 
-       err = switch_to_scratch_context(engine, want_spin ? &spin : NULL);
+       err = switch_to_scratch_context(engine, &spin);
        if (err)
                goto out;
 
        with_intel_runtime_pm(i915, wakeref)
                err = reset(engine);
 
-       if (want_spin) {
-               igt_spinner_end(&spin);
-               igt_spinner_fini(&spin);
-       }
+       igt_spinner_end(&spin);
+       igt_spinner_fini(&spin);
 
        if (err) {
                pr_err("%s reset failed\n", name);