summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-03-29 17:14:10 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2020-09-03 13:52:05 +0100
commit4097a503e35ff77f01eb2a254e456cbf2390cee1 (patch)
tree43d7e52fa65f5ac10588ce768fc57f5cd7673cbf
parent90a97fc98645313865ba8c80e6bd99486f170bb4 (diff)
igt/gem_wait: Exercise waiting on only write hazards
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--tests/i915/gem_wait.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/i915/gem_wait.c b/tests/i915/gem_wait.c
index 7b2b1c2b..bd427b3a 100644
--- a/tests/i915/gem_wait.c
+++ b/tests/i915/gem_wait.c
@@ -31,6 +31,8 @@
#include "igt.h"
#include "igt_vgem.h"
+#define LOCAL_WAIT_READ_ONLY 0x1
+
static int __gem_wait(int fd, struct drm_i915_gem_wait *w)
{
int err;
@@ -146,6 +148,48 @@ static void basic(int fd, unsigned engine, unsigned flags)
igt_spin_free(fd, spin);
}
+static bool wait_has_readonly(int fd)
+{
+ struct drm_i915_gem_wait arg = { .flags = LOCAL_WAIT_READ_ONLY };
+ int err = 0;
+ if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_WAIT, &arg))
+ err = -errno;
+ errno = 0;
+ return err == -ENOENT;
+}
+
+static void readonly(int fd)
+{
+ uint32_t scratch = gem_create(fd, 4096);
+ igt_spin_t *spin = igt_spin_batch_new(fd, 0, 0, scratch);
+ struct drm_i915_gem_wait wait = { spin->handle };
+
+ /* Test read-only batch */
+ wait.flags = LOCAL_WAIT_READ_ONLY;
+ igt_assert_eq(__gem_wait(fd, &wait), 0);
+ wait.timeout_ns = -1;
+ igt_assert_eq(__gem_wait(fd, &wait), 0);
+
+ wait.flags = 0;
+ wait.timeout_ns = 0;
+ igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
+
+ /* Test write hazard to scratch */
+ wait.bo_handle = scratch;
+ igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
+
+ wait.flags = LOCAL_WAIT_READ_ONLY;
+ igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
+
+ igt_spin_batch_free(fd, spin);
+
+ wait.timeout_ns = -1;
+ wait.flags = LOCAL_WAIT_READ_ONLY;
+ igt_assert_eq(__gem_wait(fd, &wait), 0);
+
+ gem_close(fd, scratch);
+}
+
static void test_all_engines(const char *name, int i915, unsigned int test)
{
const struct intel_execution_engine2 *e;
@@ -210,6 +254,15 @@ igt_main
}
igt_subtest_group {
+ igt_fixture {
+ igt_require(wait_has_readonly(fd));
+ }
+
+ igt_subtest("read-only")
+ readonly(fd);
+ }
+
+ igt_subtest_group {
static const struct {
const char *name;
unsigned int flags;