diff options
-rw-r--r-- | lib/ioctl_wrappers.c | 20 | ||||
-rw-r--r-- | lib/ioctl_wrappers.h | 3 | ||||
-rw-r--r-- | tests/gem_exec_suspend.c | 20 |
3 files changed, 32 insertions, 11 deletions
diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c index ffeb44cb..a213a984 100644 --- a/lib/ioctl_wrappers.c +++ b/lib/ioctl_wrappers.c @@ -1396,11 +1396,17 @@ void gem_require_caching(int fd) errno = 0; } -static int gem_has_ring(int fd, int ring) +bool gem_has_ring(int fd, unsigned ring) { struct drm_i915_gem_execbuffer2 execbuf; struct drm_i915_gem_exec_object2 exec; + /* silly ABI, the kernel thinks everyone who has BSD also has BSD2 */ + if ((ring & ~(3<<13)) == I915_EXEC_BSD) { + if (ring & (3 << 13) && !gem_has_bsd2(fd)) + return false; + } + memset(&exec, 0, sizeof(exec)); memset(&execbuf, 0, sizeof(execbuf)); execbuf.buffers_ptr = (uintptr_t)&exec; @@ -1412,21 +1418,15 @@ static int gem_has_ring(int fd, int ring) /** * gem_require_ring: * @fd: open i915 drm file descriptor - * @ring_id: ring flag bit as used in gem_execbuf() + * @ring: ring flag bit as used in gem_execbuf() * * Feature test macro to query whether a specific ring is available. * In contrast to gem_has_enable_ring() this automagically skips if the ring * isn't available by calling igt_require(). */ -void gem_require_ring(int fd, int ring_id) +void gem_require_ring(int fd, unsigned ring) { - igt_require(gem_has_ring(fd, ring_id)); - - /* silly ABI, the kernel thinks everyone who has BSD also has BSD2 */ - if ((ring_id & ~(3<<13)) == I915_EXEC_BSD) { - if (ring_id & (3 << 13)) - igt_require(gem_has_bsd2(fd)); - } + igt_require(gem_has_ring(fd, ring)); } /* prime */ diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h index f59eafba..3c922057 100644 --- a/lib/ioctl_wrappers.h +++ b/lib/ioctl_wrappers.h @@ -152,7 +152,8 @@ bool gem_has_softpin(int fd); /* check functions which auto-skip tests by calling igt_skip() */ void gem_require_caching(int fd); -void gem_require_ring(int fd, int ring_id); +bool gem_has_ring(int fd, unsigned ring); +void gem_require_ring(int fd, unsigned ring); /* prime */ struct local_dma_buf_sync { diff --git a/tests/gem_exec_suspend.c b/tests/gem_exec_suspend.c index 22e18f57..f468ff4a 100644 --- a/tests/gem_exec_suspend.c +++ b/tests/gem_exec_suspend.c @@ -36,6 +36,8 @@ enum mode { HIBERNATE, }; +static void run_test(int fd, unsigned ring, enum mode mode); + static void check_bo(int fd, uint32_t handle) { uint32_t *map; @@ -49,6 +51,14 @@ static void check_bo(int fd, uint32_t handle) munmap(map, 4096); } +static void test_all(int fd) +{ + const struct intel_execution_engine *e; + for (e = intel_execution_engines; e->name; e++) + if (gem_has_ring(fd, e->exec_id | e->flags)) + run_test(fd, e->exec_id | e->flags, NOSLEEP); +} + static void run_test(int fd, unsigned ring, enum mode mode) { const int gen = intel_gen(intel_get_drm_devid(fd)); @@ -61,6 +71,10 @@ static void run_test(int fd, unsigned ring, enum mode mode) igt_skip_on_f(gen == 6 && (ring & ~(3<<13)) == I915_EXEC_BSD, "MI_STORE_DATA broken on gen6 bsd\n"); + /* Before suspending, check normal operation */ + if (mode != NOSLEEP) + test_all(fd); + gem_quiescent_gpu(fd); memset(&execbuf, 0, sizeof(execbuf)); @@ -135,6 +149,12 @@ static void run_test(int fd, unsigned ring, enum mode mode) check_bo(fd, obj[0].handle); gem_close(fd, obj[0].handle); + + gem_quiescent_gpu(fd); + + /* After resume, make sure it still works */ + if (mode != NOSLEEP) + test_all(fd); } igt_main |