drm/i915/selftests: Exercise adjusting rpcs over all render-class engines
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 27 Oct 2019 22:58:05 +0000 (22:58 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 28 Oct 2019 12:08:29 +0000 (12:08 +0000)
Iterate over all user-accessible render engines when checking whether
they can be adjusted for sseu.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191027225808.19437-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c

index 2c65c9e95cc5d58c59c44ac2d584bd4bc214beff..d1d873f233383e8218c2f58663afe81f81817504 100644 (file)
@@ -1186,93 +1186,90 @@ __igt_ctx_sseu(struct drm_i915_private *i915,
               const char *name,
               unsigned int flags)
 {
-       struct intel_engine_cs *engine = i915->engine[RCS0];
        struct drm_i915_gem_object *obj;
-       struct i915_gem_context *ctx;
-       struct intel_context *ce;
-       struct intel_sseu pg_sseu;
-       struct drm_file *file;
+       int inst = 0;
        int ret;
 
-       if (INTEL_GEN(i915) < 9 || !engine)
+       if (INTEL_GEN(i915) < 9 || !RUNTIME_INFO(i915)->sseu.has_slice_pg)
                return 0;
 
-       if (!RUNTIME_INFO(i915)->sseu.has_slice_pg)
-               return 0;
-
-       if (hweight32(engine->sseu.slice_mask) < 2)
-               return 0;
-
-       /*
-        * Gen11 VME friendly power-gated configuration with half enabled
-        * sub-slices.
-        */
-       pg_sseu = engine->sseu;
-       pg_sseu.slice_mask = 1;
-       pg_sseu.subslice_mask =
-               ~(~0 << (hweight32(engine->sseu.subslice_mask) / 2));
-
-       pr_info("SSEU subtest '%s', flags=%x, def_slices=%u, pg_slices=%u\n",
-               name, flags, hweight32(engine->sseu.slice_mask),
-               hweight32(pg_sseu.slice_mask));
-
-       file = mock_file(i915);
-       if (IS_ERR(file))
-               return PTR_ERR(file);
-
        if (flags & TEST_RESET)
                igt_global_reset_lock(&i915->gt);
 
-       ctx = live_context(i915, file);
-       if (IS_ERR(ctx)) {
-               ret = PTR_ERR(ctx);
-               goto out_unlock;
-       }
-       i915_gem_context_clear_bannable(ctx); /* to reset and beyond! */
-
        obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
        if (IS_ERR(obj)) {
                ret = PTR_ERR(obj);
                goto out_unlock;
        }
 
-       ce = i915_gem_context_get_engine(ctx, RCS0);
-       if (IS_ERR(ce)) {
-               ret = PTR_ERR(ce);
-               goto out_put;
-       }
+       do {
+               struct intel_engine_cs *engine;
+               struct intel_context *ce;
+               struct intel_sseu pg_sseu;
 
-       ret = intel_context_pin(ce);
-       if (ret)
-               goto out_context;
+               engine = intel_engine_lookup_user(i915,
+                                                 I915_ENGINE_CLASS_RENDER,
+                                                 inst++);
+               if (!engine)
+                       break;
 
-       /* First set the default mask. */
-       ret = __sseu_test(name, flags, ce, obj, engine->sseu);
-       if (ret)
-               goto out_fail;
+               if (hweight32(engine->sseu.slice_mask) < 2)
+                       continue;
 
-       /* Then set a power-gated configuration. */
-       ret = __sseu_test(name, flags, ce, obj, pg_sseu);
-       if (ret)
-               goto out_fail;
+               /*
+                * Gen11 VME friendly power-gated configuration with
+                * half enabled sub-slices.
+                */
+               pg_sseu = engine->sseu;
+               pg_sseu.slice_mask = 1;
+               pg_sseu.subslice_mask =
+                       ~(~0 << (hweight32(engine->sseu.subslice_mask) / 2));
+
+               pr_info("%s: SSEU subtest '%s', flags=%x, def_slices=%u, pg_slices=%u\n",
+                       engine->name, name, flags,
+                       hweight32(engine->sseu.slice_mask),
+                       hweight32(pg_sseu.slice_mask));
+
+               ce = intel_context_create(engine->kernel_context->gem_context,
+                                         engine);
+               if (IS_ERR(ce)) {
+                       ret = PTR_ERR(ce);
+                       goto out_put;
+               }
 
-       /* Back to defaults. */
-       ret = __sseu_test(name, flags, ce, obj, engine->sseu);
-       if (ret)
-               goto out_fail;
+               ret = intel_context_pin(ce);
+               if (ret)
+                       goto out_ce;
 
-       /* One last power-gated configuration for the road. */
-       ret = __sseu_test(name, flags, ce, obj, pg_sseu);
-       if (ret)
-               goto out_fail;
+               /* First set the default mask. */
+               ret = __sseu_test(name, flags, ce, obj, engine->sseu);
+               if (ret)
+                       goto out_unpin;
+
+               /* Then set a power-gated configuration. */
+               ret = __sseu_test(name, flags, ce, obj, pg_sseu);
+               if (ret)
+                       goto out_unpin;
+
+               /* Back to defaults. */
+               ret = __sseu_test(name, flags, ce, obj, engine->sseu);
+               if (ret)
+                       goto out_unpin;
+
+               /* One last power-gated configuration for the road. */
+               ret = __sseu_test(name, flags, ce, obj, pg_sseu);
+               if (ret)
+                       goto out_unpin;
+
+out_unpin:
+               intel_context_unpin(ce);
+out_ce:
+               intel_context_put(ce);
+       } while (!ret);
 
-out_fail:
        if (igt_flush_test(i915))
                ret = -EIO;
 
-       intel_context_unpin(ce);
-out_context:
-       intel_context_put(ce);
 out_put:
        i915_gem_object_put(obj);
 
@@ -1280,8 +1277,6 @@ out_unlock:
        if (flags & TEST_RESET)
                igt_global_reset_unlock(&i915->gt);
 
-       mock_file_free(i915, file);
-
        if (ret)
                pr_err("%s: Failed with %d!\n", name, ret);