Added a subtest for invalid FENCE_IN usage, updated invalid-flag subtest and made the rsvd2 test skip when exec fences are available. v2: add a test that tries to use the device fd as fence (Chris) Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@xxxxxxxxx> --- lib/ioctl_wrappers.c | 29 +++++++++++++++++++++++++++++ lib/ioctl_wrappers.h | 1 + tests/gem_exec_fence.c | 14 -------------- tests/gem_exec_params.c | 33 ++++++++++++++++++++++++++++++--- 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c index ccc5ccf..cd0c24b 100644 --- a/lib/ioctl_wrappers.c +++ b/lib/ioctl_wrappers.c @@ -1433,6 +1433,35 @@ bool gem_has_softpin(int fd) return has_softpin; } +#define LOCAL_PARAM_HAS_EXEC_FENCE 44 +/** + * gem_has_exec_fence: + * @fd: open i915 drm file descriptor + * + * Feature test macro to query whether in/out fence support in execbuffer is + * available. + * + * Returns: Whether fence support is available + */ +bool gem_has_exec_fence(int fd) +{ + static int has_exec_fence = -1; + + if (has_exec_fence < 0) { + struct drm_i915_getparam gp; + + memset(&gp, 0, sizeof(gp)); + gp.param = LOCAL_PARAM_HAS_EXEC_FENCE; + gp.value = &has_exec_fence; + + has_exec_fence = 0; + ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp, sizeof(gp)); + errno = 0; + } + + return has_exec_fence; +} + /** * gem_require_caching: * @fd: open i915 drm file descriptor diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h index 5f3bbd1..64628df 100644 --- a/lib/ioctl_wrappers.h +++ b/lib/ioctl_wrappers.h @@ -164,6 +164,7 @@ uint64_t gem_aperture_size(int fd); uint64_t gem_global_aperture_size(int fd); uint64_t gem_mappable_aperture_size(void); bool gem_has_softpin(int fd); +bool gem_has_exec_fence(int fd); /* check functions which auto-skip tests by calling igt_skip() */ void gem_require_caching(int fd); diff --git a/tests/gem_exec_fence.c b/tests/gem_exec_fence.c index 3df436a..ddc5e7f 100644 --- a/tests/gem_exec_fence.c +++ b/tests/gem_exec_fence.c @@ -309,20 +309,6 @@ static void test_fence_flip(int i915) igt_skip_on_f(1, "no fence-in for atomic flips\n"); } -static bool gem_has_exec_fence(int fd) -{ - struct drm_i915_getparam gp; - int val = -1; - - memset(&gp, 0, sizeof(gp)); - gp.param = LOCAL_PARAM_HAS_EXEC_FENCE; - gp.value = &val; - - ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp); - - return val > 0; -} - igt_main { const struct intel_execution_engine *e; diff --git a/tests/gem_exec_params.c b/tests/gem_exec_params.c index f9a2054..8a6cb45 100644 --- a/tests/gem_exec_params.c +++ b/tests/gem_exec_params.c @@ -45,6 +45,8 @@ #define LOCAL_I915_EXEC_BSD_RING1 (1<<13) #define LOCAL_I915_EXEC_BSD_RING2 (2<<13) #define LOCAL_I915_EXEC_RESOURCE_STREAMER (1<<15) +#define LOCAL_I915_EXEC_FENCE_IN (1 << 16) +#define LOCAL_I915_EXEC_FENCE_OUT (1 << 17) static bool has_ring(int fd, unsigned ring_exec_flags) { @@ -239,13 +241,15 @@ igt_main &execbuf) == 0); } - /* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle */ + /* HANDLE_LUT and NO_RELOC are already exercised by gem_exec_lut_handle, + * EXEC_FENCE_IN and EXEC_FENCE_OUT correct usage is tested by + * gem_exec_fence, invalid usage of EXEC_FENCE_IN is tested below. */ igt_subtest("invalid-flag") { /* NOTE: This test intentionally exercise the next available * flag. Don't "fix" this testcase without adding the required * tests for the new flag first. */ - execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_RESOURCE_STREAMER << 1); + execbuf.flags = I915_EXEC_RENDER | (LOCAL_I915_EXEC_FENCE_OUT << 1); RUN_FAIL(EINVAL); } @@ -283,6 +287,30 @@ igt_main RUN_FAIL(EINVAL); } + igt_subtest("invalid-fence-in") { + igt_require(gem_has_exec_fence(fd)); + execbuf.flags = LOCAL_I915_EXEC_FENCE_IN; + execbuf.rsvd2 = -1; + RUN_FAIL(EINVAL); + execbuf.rsvd2 = 0; + } + + igt_subtest("invalid-fence-in2") { + igt_require(gem_has_exec_fence(fd)); + execbuf.flags = LOCAL_I915_EXEC_FENCE_IN; + execbuf.rsvd2 = fd; + RUN_FAIL(EINVAL); + execbuf.rsvd2 = 0; + } + + igt_subtest("rsvd2-dirt") { + igt_require(!gem_has_exec_fence(fd)); + execbuf.flags = 0; + execbuf.rsvd2 = 1; + RUN_FAIL(EINVAL); + execbuf.rsvd2 = 0; + } + #define DIRT(name) \ igt_subtest(#name "-dirt") { \ execbuf.flags = 0; \ @@ -291,7 +319,6 @@ igt_main execbuf.name = 0; \ } - DIRT(rsvd2); DIRT(cliprects_ptr); DIRT(DR1); DIRT(DR4); -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx