From 40ebf95163dcb233b556bb97e9864497623d7328 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 28 Jul 2015 18:59:47 +0100 Subject: 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 --- lib/igt_core.h | 27 +++++++++++++++++++++++++++ tests/gem_streaming_writes.c | 13 +++++++++---- 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 @@ -364,6 +364,24 @@ void igt_exit(void) __attribute__((noreturn)); "error: %#x " #ncmp " %#x\n", __n1, __n2); \ } 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 @@ -404,6 +422,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 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); -- cgit v1.2.3