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 <ch...@chris-wilson.co.uk>
Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospu...@intel.com>
---
 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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to