summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-02-17 09:14:10 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2017-02-17 09:15:32 +0000
commitf2251a9242c0ca9b3349098c5e2a8aac47952cd3 (patch)
tree51e178d375f105b96cccf0e409c33ccc7ae6266b /tests
parent11e31f9e5abfda8a0a51561ed01ad48c2692e320 (diff)
igt/gem_exec_reloc: Do basic tests of 4/8-byte aligned reloc.offsets
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests')
-rw-r--r--tests/gem_exec_reloc.c236
1 files changed, 124 insertions, 112 deletions
diff --git a/tests/gem_exec_reloc.c b/tests/gem_exec_reloc.c
index 8356d852..e79a5ecd 100644
--- a/tests/gem_exec_reloc.c
+++ b/tests/gem_exec_reloc.c
@@ -334,149 +334,161 @@ static bool has_64b_reloc(int fd)
#define HANG 4
static void basic_reloc(int fd, unsigned before, unsigned after, unsigned flags)
{
+#define OBJSZ 8192
struct drm_i915_gem_relocation_entry reloc;
struct drm_i915_gem_exec_object2 obj;
struct drm_i915_gem_execbuffer2 execbuf;
uint64_t address_mask = has_64b_reloc(fd) ? ~(uint64_t)0 : ~(uint32_t)0;
- uint32_t bbe = MI_BATCH_BUFFER_END;
- igt_spin_t *spin = NULL;
- uint32_t trash = 0;
- uint64_t offset;
- char *wc;
+ const uint32_t bbe = MI_BATCH_BUFFER_END;
+ unsigned int reloc_offset;
memset(&obj, 0, sizeof(obj));
-
- obj.handle = gem_create(fd, 4096);
+ obj.handle = gem_create(fd, OBJSZ);
obj.relocs_ptr = to_user_pointer(&reloc);
obj.relocation_count = 1;
- obj.offset = -1;
gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
- memset(&reloc, 0, sizeof(reloc));
- reloc.offset = 4000;
- reloc.target_handle = obj.handle;
- reloc.read_domains = I915_GEM_DOMAIN_INSTRUCTION;
- reloc.presumed_offset = -1;
-
memset(&execbuf, 0, sizeof(execbuf));
execbuf.buffers_ptr = to_user_pointer(&obj);
execbuf.buffer_count = 1;
if (flags & NORELOC)
execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC;
- if (before) {
- if (before == I915_GEM_DOMAIN_CPU)
- wc = gem_mmap__cpu(fd, obj.handle, 0, 4096, PROT_WRITE);
- else if (before == I915_GEM_DOMAIN_GTT)
- wc = gem_mmap__wc(fd, obj.handle, 0, 4096, PROT_WRITE);
- else
- igt_assert(0);
- gem_set_domain(fd, obj.handle, before, before);
- offset = -1;
- memcpy(wc + 4000, &offset, sizeof(offset));
- munmap(wc, 4096);
- } else {
- offset = -1;
- gem_write(fd, obj.handle, 4000, &offset, sizeof(offset));
- }
+ for (reloc_offset = 4096 - 8; reloc_offset <= 4096 + 8; reloc_offset += 4) {
+ igt_spin_t *spin = NULL;
+ uint32_t trash = 0;
+ uint64_t offset;
- if (flags & ACTIVE) {
- spin = igt_spin_batch_new(fd, I915_EXEC_DEFAULT, obj.handle);
- if (!(flags & HANG))
- igt_spin_batch_set_timeout(spin, NSEC_PER_SEC/100);
- igt_assert(gem_bo_busy(fd, obj.handle));
- }
+ obj.offset = -1;
- gem_execbuf(fd, &execbuf);
+ memset(&reloc, 0, sizeof(reloc));
+ reloc.offset = reloc_offset;
+ reloc.target_handle = obj.handle;
+ reloc.read_domains = I915_GEM_DOMAIN_INSTRUCTION;
+ reloc.presumed_offset = -1;
- if (after) {
- if (after == I915_GEM_DOMAIN_CPU)
- wc = gem_mmap__cpu(fd, obj.handle, 0, 4096, PROT_READ);
- else if (after == I915_GEM_DOMAIN_GTT)
- wc = gem_mmap__wc(fd, obj.handle, 0, 4096, PROT_READ);
- else
- igt_assert(0);
- gem_set_domain(fd, obj.handle, after, 0);
- offset = ~reloc.presumed_offset & address_mask;
- memcpy(&offset, wc + 4000, has_64b_reloc(fd) ? 8 : 4);
- munmap(wc, 4096);
- } else {
- offset = ~reloc.presumed_offset & address_mask;
- gem_read(fd, obj.handle, 4000, &offset, has_64b_reloc(fd) ? 8 : 4);
- }
+ if (before) {
+ char *wc;
+
+ if (before == I915_GEM_DOMAIN_CPU)
+ wc = gem_mmap__cpu(fd, obj.handle, 0, OBJSZ, PROT_WRITE);
+ else if (before == I915_GEM_DOMAIN_GTT)
+ wc = gem_mmap__wc(fd, obj.handle, 0, OBJSZ, PROT_WRITE);
+ else
+ igt_assert(0);
+ gem_set_domain(fd, obj.handle, before, before);
+ offset = -1;
+ memcpy(wc + reloc_offset, &offset, sizeof(offset));
+ munmap(wc, OBJSZ);
+ } else {
+ offset = -1;
+ gem_write(fd, obj.handle, reloc_offset, &offset, sizeof(offset));
+ }
- if (reloc.presumed_offset == -1)
- igt_warn("reloc.presumed_offset == -1\n");
- else
- igt_assert_eq_u64(reloc.presumed_offset, offset);
- igt_assert_eq_u64(obj.offset, offset);
+ if (flags & ACTIVE) {
+ spin = igt_spin_batch_new(fd, I915_EXEC_DEFAULT, obj.handle);
+ if (!(flags & HANG))
+ igt_spin_batch_set_timeout(spin, NSEC_PER_SEC/100);
+ igt_assert(gem_bo_busy(fd, obj.handle));
+ }
- igt_spin_batch_free(fd, spin);
+ gem_execbuf(fd, &execbuf);
- /* Simulate relocation */
- if (flags & NORELOC) {
- obj.offset += 4096;
- reloc.presumed_offset += 4096;
- } else {
- trash = obj.handle;
- obj.handle = gem_create(fd, 4096);
- obj.offset = -1;
- gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
- reloc.target_handle = obj.handle;
- }
+ if (after) {
+ char *wc;
+
+ if (after == I915_GEM_DOMAIN_CPU)
+ wc = gem_mmap__cpu(fd, obj.handle, 0, OBJSZ, PROT_READ);
+ else if (after == I915_GEM_DOMAIN_GTT)
+ wc = gem_mmap__wc(fd, obj.handle, 0, OBJSZ, PROT_READ);
+ else
+ igt_assert(0);
+ gem_set_domain(fd, obj.handle, after, 0);
+ offset = ~reloc.presumed_offset & address_mask;
+ memcpy(&offset, wc + reloc_offset, has_64b_reloc(fd) ? 8 : 4);
+ munmap(wc, OBJSZ);
+ } else {
+ offset = ~reloc.presumed_offset & address_mask;
+ gem_read(fd, obj.handle, reloc_offset, &offset, has_64b_reloc(fd) ? 8 : 4);
+ }
- if (before) {
- if (before == I915_GEM_DOMAIN_CPU)
- wc = gem_mmap__cpu(fd, obj.handle, 0, 4096, PROT_WRITE);
- else if (before == I915_GEM_DOMAIN_GTT)
- wc = gem_mmap__wc(fd, obj.handle, 0, 4096, PROT_WRITE);
+ if (reloc.presumed_offset == -1)
+ igt_warn("reloc.presumed_offset == -1\n");
else
- igt_assert(0);
- gem_set_domain(fd, obj.handle, before, before);
- offset = -1;
- memcpy(wc + 4000, &offset, sizeof(offset));
- munmap(wc, 4096);
- } else {
- offset = -1;
- gem_write(fd, obj.handle, 4000, &offset, sizeof(offset));
- }
+ igt_assert_eq_u64(reloc.presumed_offset, offset);
+ igt_assert_eq_u64(obj.offset, offset);
- if (flags & ACTIVE) {
- spin = igt_spin_batch_new(fd, I915_EXEC_DEFAULT, obj.handle);
- if (!(flags & HANG))
- igt_spin_batch_set_timeout(spin, NSEC_PER_SEC/100);
- igt_assert(gem_bo_busy(fd, obj.handle));
- }
+ igt_spin_batch_free(fd, spin);
- gem_execbuf(fd, &execbuf);
+ /* Simulate relocation */
+ if (flags & NORELOC) {
+ obj.offset += OBJSZ;
+ reloc.presumed_offset += OBJSZ;
+ } else {
+ trash = obj.handle;
+ obj.handle = gem_create(fd, OBJSZ);
+ obj.offset = -1;
+ gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
+ reloc.target_handle = obj.handle;
+ }
- if (after) {
- if (after == I915_GEM_DOMAIN_CPU)
- wc = gem_mmap__cpu(fd, obj.handle, 0, 4096, PROT_READ);
- else if (after == I915_GEM_DOMAIN_GTT)
- wc = gem_mmap__wc(fd, obj.handle, 0, 4096, PROT_READ);
- else
- igt_assert(0);
- gem_set_domain(fd, obj.handle, after, 0);
- offset = ~reloc.presumed_offset & address_mask;
- memcpy(&offset, wc + 4000, has_64b_reloc(fd) ? 8 : 4);
- munmap(wc, 4096);
- } else {
- offset = ~reloc.presumed_offset & address_mask;
- gem_read(fd, obj.handle, 4000, &offset, has_64b_reloc(fd) ? 8 : 4);
- }
+ if (before) {
+ char *wc;
+
+ if (before == I915_GEM_DOMAIN_CPU)
+ wc = gem_mmap__cpu(fd, obj.handle, 0, OBJSZ, PROT_WRITE);
+ else if (before == I915_GEM_DOMAIN_GTT)
+ wc = gem_mmap__wc(fd, obj.handle, 0, OBJSZ, PROT_WRITE);
+ else
+ igt_assert(0);
+ gem_set_domain(fd, obj.handle, before, before);
+ offset = -1;
+ memcpy(wc + reloc_offset, &offset, sizeof(offset));
+ munmap(wc, OBJSZ);
+ } else {
+ offset = -1;
+ gem_write(fd, obj.handle, reloc_offset, &offset, sizeof(offset));
+ }
- if (reloc.presumed_offset == -1)
- igt_warn("reloc.presumed_offset == -1\n");
- else
- igt_assert_eq_u64(reloc.presumed_offset, offset);
- igt_assert_eq_u64(obj.offset, offset);
+ if (flags & ACTIVE) {
+ spin = igt_spin_batch_new(fd, I915_EXEC_DEFAULT, obj.handle);
+ if (!(flags & HANG))
+ igt_spin_batch_set_timeout(spin, NSEC_PER_SEC/100);
+ igt_assert(gem_bo_busy(fd, obj.handle));
+ }
+
+ gem_execbuf(fd, &execbuf);
- igt_spin_batch_free(fd, spin);
+ if (after) {
+ char *wc;
+
+ if (after == I915_GEM_DOMAIN_CPU)
+ wc = gem_mmap__cpu(fd, obj.handle, 0, OBJSZ, PROT_READ);
+ else if (after == I915_GEM_DOMAIN_GTT)
+ wc = gem_mmap__wc(fd, obj.handle, 0, OBJSZ, PROT_READ);
+ else
+ igt_assert(0);
+ gem_set_domain(fd, obj.handle, after, 0);
+ offset = ~reloc.presumed_offset & address_mask;
+ memcpy(&offset, wc + reloc_offset, has_64b_reloc(fd) ? 8 : 4);
+ munmap(wc, OBJSZ);
+ } else {
+ offset = ~reloc.presumed_offset & address_mask;
+ gem_read(fd, obj.handle, reloc_offset, &offset, has_64b_reloc(fd) ? 8 : 4);
+ }
+
+ if (reloc.presumed_offset == -1)
+ igt_warn("reloc.presumed_offset == -1\n");
+ else
+ igt_assert_eq_u64(reloc.presumed_offset, offset);
+ igt_assert_eq_u64(obj.offset, offset);
+
+ igt_spin_batch_free(fd, spin);
+ if (trash)
+ gem_close(fd, trash);
+ }
gem_close(fd, obj.handle);
- if (trash)
- gem_close(fd, trash);
}
static void basic_softpin(int fd)