From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 lib/igt_dummyload.c | 39 +++++++++++++++++++++++++++++++++++++--
 lib/igt_gt.c        | 14 --------------
 lib/igt_gt.h        |  2 --
 tests/perf_pmu.c    | 44 ++++++++++++++++++++++++++++++++++++--------
 4 files changed, 73 insertions(+), 26 deletions(-)

diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 13bd2e8dead1..8f457e5069e7 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -105,10 +105,45 @@ emit_recursive_batch(igt_spin_t *spin,
                        flags[nengine++] = engine->flags;
                }
        } else {
-               gem_require_ring(fd, opts->engine);
+#define SIZEOF_CTX_PARAM       offsetof(struct i915_context_param_engines, \
+                                       class_instance[GEM_MAX_ENGINES])
+               I915_DEFINE_CONTEXT_PARAM_ENGINES(engines, GEM_MAX_ENGINES);
+               struct drm_i915_gem_context_param param = {
+                       .param = I915_CONTEXT_PARAM_ENGINES,
+                       .ctx_id = opts->ctx,
+                       .size = SIZEOF_CTX_PARAM,
+                       .value = to_user_pointer(&engines),
+               };
+               unsigned int class;
+
+               /*
+                * If the context has engine map configured we need to consider
+                * the engine selector as index into the array. Therefore to
+                * find out the class and instance we need to query the map.
+                */
+               if (!__gem_context_get_param(fd, &param) && param.size) {
+                       unsigned int nengines;
+
+                       nengines = param.size >
+                                  sizeof(struct i915_context_param_engines) ?
+                                  (param.size -
+                                   sizeof(struct i915_context_param_engines)) /
+                                  sizeof(engines.class_instance[0]) : 0;
+
+                       igt_assert(nengines > 0);
+                       igt_assert(opts->engine < nengines);
+
+                       class =
+                            engines.class_instance[opts->engine].engine_class;
+               } else {
+
+                       gem_require_ring(fd, opts->engine);
+
+                       class = gem_eb_to_class(opts->engine);
+               }
 
                if (opts->flags & IGT_SPIN_POLL_RUN)
-                       igt_require(gem_can_store_dword(fd, opts->engine));
+                       igt_require(gem_class_can_store_dword(fd, class));
 
                flags[nengine++] = opts->engine;
        }
diff --git a/lib/igt_gt.c b/lib/igt_gt.c
index 12e19417a827..5d0a8e8060a7 100644
--- a/lib/igt_gt.c
+++ b/lib/igt_gt.c
@@ -609,20 +609,6 @@ int gem_eb_to_class(unsigned int flags)
        }
 }
 
-void gem_eb_to_class_instance(int fd, unsigned int flags,
-                             struct intel_execution_engine2 *e)
-{
-       e->class = gem_eb_to_class(flags);
-
-       e->instance = ((flags & 0x3f) | I915_EXEC_BSD_RING2) ==
-                     (I915_EXEC_BSD | I915_EXEC_BSD_RING2) ?
-                     1 :
-                     0;
-
-       if (!gem_has_engine_topology(fd))
-               e->flags = flags;
-}
-
 unsigned int
 gem_class_instance_to_eb_flags(int gem_fd,
                               enum drm_i915_gem_engine_class class,
diff --git a/lib/igt_gt.h b/lib/igt_gt.h
index b7e6bdc33db7..c2ca07e03738 100644
--- a/lib/igt_gt.h
+++ b/lib/igt_gt.h
@@ -101,8 +101,6 @@ extern const struct intel_execution_engine2 {
 } intel_execution_engines2[];
 
 int gem_eb_to_class(unsigned int flags);
-void gem_eb_to_class_instance(int fd, unsigned int flags,
-                             struct intel_execution_engine2 *e);
 
 unsigned int
 gem_class_instance_to_eb_flags(int gem_fd,
diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
index 0af955139c3e..d70f4585c147 100644
--- a/tests/perf_pmu.c
+++ b/tests/perf_pmu.c
@@ -225,9 +225,12 @@ static igt_spin_t * spin_sync(int fd, uint32_t ctx,
 
 static igt_spin_t * spin_sync_flags(int fd, uint32_t ctx, unsigned int flags)
 {
-       struct intel_execution_engine2 e;
+       struct intel_execution_engine2 e = { };
 
-       gem_eb_to_class_instance(fd, flags, &e);
+       e.class = gem_eb_to_class(flags);
+       e.instance = (flags & (I915_EXEC_BSD_MASK | I915_EXEC_RING_MASK)) ==
+                    (I915_EXEC_BSD | I915_EXEC_BSD_RING2) ? 1 : 0;
+       e.flags = flags;
 
        return spin_sync(fd, ctx, &e);
 }
@@ -355,6 +358,9 @@ busy_double_start(int gem_fd, struct 
intel_execution_engine2 *e)
 
        ctx = gem_context_create(gem_fd);
 
+       /* QQQ This feels ugly! */
+       intel_init_engine_list(gem_fd, ctx);
+
        /*
         * Defeat the busy stats delayed disable, we need to guarantee we are
         * the first user.
@@ -510,7 +516,7 @@ most_busy_check_all(int gem_fd, struct 
intel_execution_engine2 *e,
                else if (spin)
                        __submit_spin_batch(gem_fd, spin, e_, 64);
                else
-                       spin = __spin_poll(gem_fd, 0, e);
+                       spin = __spin_poll(gem_fd, 0, e_);
 
                val[i++] = I915_PMU_ENGINE_BUSY(e_->class, e_->instance);
        }
@@ -1046,6 +1052,7 @@ static void cpu_hotplug(int gem_fd)
        igt_spin_t *spin[2];
        uint64_t ts[2];
        uint64_t val;
+       uint32_t ctx;
        int link[2];
        int fd, ret;
        int cur = 0;
@@ -1053,14 +1060,18 @@ static void cpu_hotplug(int gem_fd)
 
        igt_require(cpu0_hotplug_support());
 
+       ctx = gem_context_create(gem_fd);
+
        fd = open_pmu(I915_PMU_ENGINE_BUSY(I915_ENGINE_CLASS_RENDER, 0));
 
        /*
         * Create two spinners so test can ensure shorter gaps in engine
         * busyness as it is terminating one and re-starting the other.
         */
-       spin[0] = igt_spin_batch_new(gem_fd, .engine = I915_EXEC_RENDER);
-       spin[1] = __igt_spin_batch_new(gem_fd, .engine = I915_EXEC_RENDER);
+       spin[0] = igt_spin_batch_new(gem_fd,
+                                    .engine = I915_EXEC_RENDER, .ctx = ctx);
+       spin[1] = __igt_spin_batch_new(gem_fd,
+                                      .engine = I915_EXEC_RENDER, .ctx = ctx);
 
        val = __pmu_read_single(fd, &ts[0]);
 
@@ -1144,6 +1155,7 @@ static void cpu_hotplug(int gem_fd)
 
                igt_spin_batch_free(gem_fd, spin[cur]);
                spin[cur] = __igt_spin_batch_new(gem_fd,
+                                                .ctx = ctx,
                                                 .engine = I915_EXEC_RENDER);
                cur ^= 1;
        }
@@ -1157,6 +1169,7 @@ static void cpu_hotplug(int gem_fd)
        igt_waitchildren();
        close(fd);
        close(link[0]);
+       gem_context_destroy(gem_fd, ctx);
 
        /* Skip if child signals a problem with offlining a CPU. */
        igt_skip_on(buf == 's');
@@ -1172,17 +1185,21 @@ test_interrupts(int gem_fd)
        igt_spin_t *spin[target];
        struct pollfd pfd;
        uint64_t idle, busy;
+       uint32_t ctx;
        int fence_fd;
        int fd;
 
        gem_quiescent_gpu(gem_fd);
 
+       ctx = gem_context_create(gem_fd);
+
        fd = open_pmu(I915_PMU_INTERRUPTS);
 
        /* Queue spinning batches. */
        for (int i = 0; i < target; i++) {
                spin[i] = __igt_spin_batch_new(gem_fd,
                                               .engine = I915_EXEC_RENDER,
+                                              .ctx = ctx,
                                               .flags = IGT_SPIN_FENCE_OUT);
                if (i == 0) {
                        fence_fd = spin[i]->out_fence;
@@ -1224,6 +1241,7 @@ test_interrupts(int gem_fd)
        /* Check at least as many interrupts has been generated. */
        busy = pmu_read_single(fd) - idle;
        close(fd);
+       gem_context_destroy(gem_fd, ctx);
 
        igt_assert_lte(target, busy);
 }
@@ -1236,15 +1254,19 @@ test_interrupts_sync(int gem_fd)
        igt_spin_t *spin[target];
        struct pollfd pfd;
        uint64_t idle, busy;
+       uint32_t ctx;
        int fd;
 
        gem_quiescent_gpu(gem_fd);
 
+       ctx = gem_context_create(gem_fd);
+
        fd = open_pmu(I915_PMU_INTERRUPTS);
 
        /* Queue spinning batches. */
        for (int i = 0; i < target; i++)
                spin[i] = __igt_spin_batch_new(gem_fd,
+                                              .ctx = ctx,
                                               .flags = IGT_SPIN_FENCE_OUT);
 
        /* Wait for idle state. */
@@ -1269,6 +1291,7 @@ test_interrupts_sync(int gem_fd)
        /* Check at least as many interrupts has been generated. */
        busy = pmu_read_single(fd) - idle;
        close(fd);
+       gem_context_destroy(gem_fd, ctx);
 
        igt_assert_lte(target, busy);
 }
@@ -1281,6 +1304,9 @@ test_frequency(int gem_fd)
        double min[2], max[2];
        igt_spin_t *spin;
        int fd, sysfs;
+       uint32_t ctx;
+
+       ctx = gem_context_create(gem_fd);
 
        sysfs = igt_sysfs_open(gem_fd);
        igt_require(sysfs >= 0);
@@ -1308,7 +1334,7 @@ test_frequency(int gem_fd)
        igt_require(igt_sysfs_get_u32(sysfs, "gt_boost_freq_mhz") == min_freq);
 
        gem_quiescent_gpu(gem_fd); /* Idle to be sure the change takes effect */
-       spin = spin_sync_flags(gem_fd, 0, I915_EXEC_RENDER);
+       spin = spin_sync_flags(gem_fd, ctx, I915_EXEC_RENDER);
 
        slept = pmu_read_multi(fd, 2, start);
        measured_usleep(batch_duration_ns / 1000);
@@ -1334,7 +1360,7 @@ test_frequency(int gem_fd)
        igt_require(igt_sysfs_get_u32(sysfs, "gt_min_freq_mhz") == max_freq);
 
        gem_quiescent_gpu(gem_fd);
-       spin = spin_sync_flags(gem_fd, 0, I915_EXEC_RENDER);
+       spin = spin_sync_flags(gem_fd, ctx, I915_EXEC_RENDER);
 
        slept = pmu_read_multi(fd, 2, start);
        measured_usleep(batch_duration_ns / 1000);
@@ -1355,6 +1381,8 @@ test_frequency(int gem_fd)
                         min_freq, igt_sysfs_get_u32(sysfs, "gt_min_freq_mhz"));
        close(fd);
 
+       gem_context_destroy(gem_fd, ctx);
+
        igt_info("Min frequency: requested %.1f, actual %.1f\n",
                 min[0], min[1]);
        igt_info("Max frequency: requested %.1f, actual %.1f\n",
@@ -1904,7 +1932,7 @@ igt_main
                        gem_quiescent_gpu(fd);
                }
 
-               __for_each_physical_engine(fd, e) {
+               __for_each_physical_engine(render_fd, e) {
                        igt_subtest_group {
                                igt_fixture {
                                        gem_require_engine(render_fd,
-- 
2.19.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to