summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-07-28 18:59:47 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-07-28 19:01:41 +0100
commit40ebf95163dcb233b556bb97e9864497623d7328 (patch)
treec69209335d930794a1daf6026167b1db7d091c1c
parentcd306d4e650d5280a40b15fe076f41eba081c0a0 (diff)
igt/gem_streaming_writes: Bind into the GTT early
If we are using a streaming GGTT write into the source, we need to trigger an early fault in order to obtain a mappable offset. This is required when later we start reserving execbuf object top-down to try and avoid mappable space! Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--lib/igt_core.h27
-rw-r--r--tests/gem_streaming_writes.c13
2 files changed, 36 insertions, 4 deletions
diff --git a/lib/igt_core.h b/lib/igt_core.h
index babb0bb0..83eac02b 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -365,6 +365,24 @@ void igt_exit(void) __attribute__((noreturn));
} while (0)
/**
+ * igt_assert_cmpu64:
+ * @n1: first value
+ * @cmp: compare operator
+ * @ncmp: negated version of @cmp
+ * @n2: second value
+ *
+ * Like igt_assert_cmpuint(), but for larger ints.
+ */
+#define igt_assert_cmpu64(n1, cmp, ncmp, n2) \
+ do { \
+ uint64_t __n1 = (n1), __n2 = (n2); \
+ if (__n1 cmp __n2) ; else \
+ __igt_fail_assert(IGT_LOG_DOMAIN, __FILE__, __LINE__, __func__, \
+ #n1 " " #cmp " " #n2, \
+ "error: %#llx " #ncmp " %#llx\n", (long long)__n1, (long long)__n2); \
+ } while (0)
+
+/**
* igt_assert_cmpdouble:
* @n1: first value
* @cmp: compare operator
@@ -405,6 +423,15 @@ void igt_exit(void) __attribute__((noreturn));
#define igt_assert_eq_u32(n1, n2) igt_assert_cmpuint(n1, ==, !=, n2)
/**
+ * igt_assert_eq_u64:
+ * @n1: first integer
+ * @n2: second integer
+ *
+ * Like igt_assert_eq_u32(), but for uint64_t.
+ */
+#define igt_assert_eq_u64(n1, n2) igt_assert_cmpu64(n1, ==, !=, n2)
+
+/**
* igt_assert_eq_double:
* @n1: first double
* @n2: second double
diff --git a/tests/gem_streaming_writes.c b/tests/gem_streaming_writes.c
index 1ab47b48..3c1ef9e1 100644
--- a/tests/gem_streaming_writes.c
+++ b/tests/gem_streaming_writes.c
@@ -103,6 +103,7 @@ static void test_streaming(int fd, int mode, int sync)
break;
}
igt_assert(s);
+ *s = 0; /* fault the object into the mappable range first (for GTT) */
d = gem_mmap__cpu(fd, dst, 0, OBJECT_SIZE, PROT_READ);
igt_assert(d);
@@ -138,6 +139,9 @@ static void test_streaming(int fd, int mode, int sync)
reloc[2*i+1].read_domains = I915_GEM_DOMAIN_RENDER;
reloc[2*i+1].write_domain = 0;
}
+ igt_assert(__gem_execbuf(fd, &execbuf) == 0);
+ igt_assert_eq_u64(__src_offset, src_offset);
+ igt_assert_eq_u64(__dst_offset, dst_offset);
exec[2].relocation_count = 2;
execbuf.buffer_count = 3;
@@ -212,8 +216,8 @@ static void test_streaming(int fd, int mode, int sync)
execbuf.batch_start_offset = 64*n;
gem_execbuf(fd, &execbuf);
- igt_assert(__src_offset == src_offset);
- igt_assert(__dst_offset == dst_offset);
+ igt_assert_eq_u64(__src_offset, src_offset);
+ igt_assert_eq_u64(__dst_offset, dst_offset);
batch[b].offset = exec[2].offset;
}
@@ -292,6 +296,7 @@ static void test_batch(int fd, int mode, int reverse)
break;
}
igt_assert(base);
+ *base = 0; /* fault the object into the mappable range first */
gem_write(fd, exec[2].handle, 0, tmp, sizeof(tmp));
memset(&execbuf, 0, sizeof(execbuf));
@@ -349,8 +354,8 @@ static void test_batch(int fd, int mode, int reverse)
base[k++] = MI_BATCH_BUFFER_END;
gem_execbuf(fd, &execbuf);
- igt_assert(__src_offset == src_offset);
- igt_assert(__dst_offset == dst_offset);
+ igt_assert_eq_u64(__src_offset, src_offset);
+ igt_assert_eq_u64(__dst_offset, dst_offset);
}
gem_set_domain(fd, dst, I915_GEM_DOMAIN_CPU, 0);