Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 tests/i915/gem_exec_latency.c | 81 +++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/tests/i915/gem_exec_latency.c b/tests/i915/gem_exec_latency.c
index e88fbbc6a..fd4ceb4d6 100644
--- a/tests/i915/gem_exec_latency.c
+++ b/tests/i915/gem_exec_latency.c
@@ -490,6 +490,83 @@ static void execution_latency(int i915, unsigned int ring, 
const char *name)
        gem_close(i915, obj.handle);
 }
 
+static void wakeup_latency(int i915, unsigned int ring, const char *name)
+{
+       struct drm_i915_gem_exec_object2 obj = {
+               .handle = gem_create(i915, 4095),
+       };
+       struct drm_i915_gem_execbuffer2 execbuf = {
+               .buffers_ptr = to_user_pointer(&obj),
+               .buffer_count = 1,
+               .flags = ring | LOCAL_I915_EXEC_NO_RELOC | 
LOCAL_I915_EXEC_HANDLE_LUT,
+       };
+       const unsigned int mmio_base = 0x2000;
+       const unsigned int cs_timestamp = mmio_base + 0x358;
+       volatile uint32_t *timestamp;
+       struct igt_mean wakeup;
+       uint32_t *cs, *result;
+
+       timestamp =
+               (volatile uint32_t *)((volatile char *)igt_global_mmio + 
cs_timestamp);
+
+       obj.handle = gem_create(i915, 4096);
+       obj.flags = EXEC_OBJECT_PINNED;
+       result = gem_mmap__wc(i915, obj.handle, 0, 4096, PROT_WRITE);
+
+       cs = result;
+
+       *cs++ = 0x24 << 23 | 2; /* SRM */
+       *cs++ = cs_timestamp;
+       *cs++ = 4096 - 16 * 4;
+       *cs++ = 0;
+
+       *cs++ = MI_BATCH_BUFFER_START | 1;
+       *cs++ = 0;
+       *cs++ = 0;
+
+       *cs++ = 0x24 << 23 | 2; /* SRM */
+       *cs++ = cs_timestamp;
+       *cs++ = 4096 - 16 * 4 + 4;
+       *cs++ = 0;
+       *cs++ = 0xa << 23;
+
+       cs = result + 1024 - 16;
+
+       {
+               struct sched_param p = { .sched_priority = 99 };
+               sched_setscheduler(0, SCHED_FIFO | SCHED_RESET_ON_FORK, &p);
+       }
+
+       igt_mean_init(&wakeup);
+       igt_until_timeout(2) {
+               uint32_t end;
+
+               igt_fork(child, 1) {
+                       result[4] = MI_BATCH_BUFFER_START | 1;
+                       cs[0] = 0;
+
+                       gem_execbuf(i915, &execbuf);
+
+                       while (!cs[0])
+                               ;
+                       result[4] = 0;
+                       __sync_synchronize();
+               }
+               gem_sync(i915, obj.handle);
+               end = *timestamp;
+
+               igt_mean_add(&wakeup, (end - cs[1]) * rcs_clock);
+               igt_waitchildren();
+       }
+       igt_info("%s Wakeup latency: %.2f±%.2fms [%.2f, %.2f]\n", name,
+                1e-6 * igt_mean_get(&wakeup),
+                1e-6 * sqrt(igt_mean_get_variance(&wakeup)),
+                1e-6 * wakeup.min, 1e-6 * wakeup.max);
+
+       munmap(result, 4096);
+       gem_close(i915, obj.handle);
+}
+
 static void
 __submit_spin(int fd, igt_spin_t *spin, unsigned int flags)
 {
@@ -942,6 +1019,10 @@ igt_main
                                        execution_latency(device,
                                                          e->exec_id | e->flags,
                                                          e->name);
+                               igt_subtest_f("%s-wakeup-latency", e->name)
+                                       wakeup_latency(device,
+                                                       e->exec_id | e->flags,
+                                                       e->name);
 
                                igt_subtest_f("%s-live-dispatch-queued", 
e->name)
                                        latency_on_ring(device,
-- 
2.20.1

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

Reply via email to