diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-02-17 09:14:10 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-02-17 09:15:32 +0000 |
commit | f2251a9242c0ca9b3349098c5e2a8aac47952cd3 (patch) | |
tree | 51e178d375f105b96cccf0e409c33ccc7ae6266b /tests | |
parent | 11e31f9e5abfda8a0a51561ed01ad48c2692e320 (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.c | 236 |
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) |