summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Barbalho <rafael.barbalho@intel.com>2013-11-06 18:12:12 +0000
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-11-07 13:41:38 +0100
commitc537c23efc8173d6526236b6b311ac44c10a14af (patch)
tree76679a9ad218c8b0e5aa7e7d269ab3f46d599e6d
parent5fab0b8aa7352525f72e0594f05c09272bfc1a79 (diff)
tests/gem_reloc_overflow: Add gen8+ specifc tests
Broadwell introduces 64-bit relocation addresses which add extra corner cases. The test was refactored slightly with some tests that were in the source offset tests were moved to the more generic reloc test area. The source offset tests are now gen aware and called twice to test both cpu & gtt relocation paths. In addition 2 new gen8+ test were added to the test: * Relocation straddling page a page * Insufficient space for a relocation at the end of the buffer. Signed-off-by: Rafael Barbalho <rafael.barbalho@intel.com> Conflicts: tests/gem_reloc_overflow.c Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--tests/gem_reloc_overflow.c148
1 files changed, 103 insertions, 45 deletions
diff --git a/tests/gem_reloc_overflow.c b/tests/gem_reloc_overflow.c
index f7ba1d7c..38ad2a52 100644
--- a/tests/gem_reloc_overflow.c
+++ b/tests/gem_reloc_overflow.c
@@ -24,6 +24,7 @@
* Authors:
* Kees Cook <keescook@chromium.org>
* Daniel Vetter <daniel.vetter@ffwll.ch>
+ * Rafael Barbalho <rafael.barbalho@intel.com>
*
*/
@@ -60,13 +61,14 @@ struct drm_i915_gem_relocation_entry *reloc;
uint32_t handle;
uint32_t batch_handle;
-
-static void source_offset_tests(void)
+static void source_offset_tests(int devid, bool reloc_gtt)
{
struct drm_i915_gem_relocation_entry single_reloc;
+ char *dst_gtt;
+ char *relocation_type;
igt_fixture {
- handle = gem_create(fd, 4096);
+ handle = gem_create(fd, 8192);
execobjs[1].handle = batch_handle;
execobjs[1].relocation_count = 0;
@@ -76,21 +78,70 @@ static void source_offset_tests(void)
execobjs[0].relocation_count = 1;
execobjs[0].relocs_ptr = (uintptr_t) &single_reloc;
execbuf.buffer_count = 2;
+
+ if (reloc_gtt) {
+ dst_gtt = gem_mmap(fd, handle, 8192, PROT_READ | PROT_WRITE);
+ igt_assert(dst_gtt != MAP_FAILED);
+ gem_set_domain(fd, handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+ memset(dst_gtt, 0, 8192);
+ munmap(dst_gtt, 8192);
+ relocation_type = "reloc-gtt";
+ } else {
+ relocation_type = "reloc-cpu";
+ }
}
- igt_subtest("source-offset-end") {
- single_reloc.offset = 4096 - 4;
- single_reloc.delta = 0;
- single_reloc.target_handle = handle;
- single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
- single_reloc.write_domain = I915_GEM_DOMAIN_RENDER;
- single_reloc.presumed_offset = 0;
+ if (intel_gen(devid) >= 8) {
+ igt_subtest_f("source-offset-page-stradle-gen8+-%s", relocation_type) {
+ single_reloc.offset = 4096 - 4;
+ single_reloc.delta = 0;
+ single_reloc.target_handle = handle;
+ single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
+ single_reloc.write_domain = I915_GEM_DOMAIN_RENDER;
+ single_reloc.presumed_offset = 0;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0);
+ single_reloc.delta = 1024;
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0);
+ }
- igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0);
+ igt_subtest_f("source-offset-end-gen8+-%s", relocation_type) {
+ single_reloc.offset = 8192 - 8;
+ single_reloc.delta = 0;
+ single_reloc.target_handle = handle;
+ single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
+ single_reloc.write_domain = I915_GEM_DOMAIN_RENDER;
+ single_reloc.presumed_offset = 0;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0);
+ }
+
+ igt_subtest_f("source-offset-overflow-gen8+-%s", relocation_type) {
+ single_reloc.offset = 8192 - 4;
+ single_reloc.delta = 0;
+ single_reloc.target_handle = handle;
+ single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
+ single_reloc.write_domain = I915_GEM_DOMAIN_RENDER;
+ single_reloc.presumed_offset = 0;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) != 0);
+ igt_assert(errno == EINVAL);
+ }
+ } else {
+ igt_subtest_f("source-offset-end-%s", relocation_type) {
+ single_reloc.offset = 8192 - 4;
+ single_reloc.delta = 0;
+ single_reloc.target_handle = handle;
+ single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
+ single_reloc.write_domain = I915_GEM_DOMAIN_RENDER;
+ single_reloc.presumed_offset = 0;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) == 0);
+ }
}
- igt_subtest("source-offset-big") {
- single_reloc.offset = 4096;
+ igt_subtest_f("source-offset-big-%s", relocation_type) {
+ single_reloc.offset = 8192;
single_reloc.delta = 0;
single_reloc.target_handle = handle;
single_reloc.read_domains = I915_GEM_DOMAIN_RENDER;
@@ -101,7 +152,7 @@ static void source_offset_tests(void)
igt_assert(errno == EINVAL);
}
- igt_subtest("source-offset-negative") {
+ igt_subtest_f("source-offset-negative-%s", relocation_type) {
single_reloc.offset = (int64_t) -4;
single_reloc.delta = 0;
single_reloc.target_handle = handle;
@@ -113,7 +164,7 @@ static void source_offset_tests(void)
igt_assert(errno == EINVAL);
}
- igt_subtest("source-offset-unaligned") {
+ igt_subtest_f("source-offset-unaligned-%s", relocation_type) {
single_reloc.offset = 1;
single_reloc.delta = 0;
single_reloc.target_handle = handle;
@@ -126,34 +177,6 @@ static void source_offset_tests(void)
}
igt_fixture {
- execobjs[0].handle = batch_handle;
- execobjs[0].relocation_count = 0;
- execobjs[0].relocs_ptr = 0;
-
- execbuf.buffer_count = 1;
- }
-
- igt_subtest("batch-start-unaligend") {
- execbuf.batch_start_offset = 1;
- execbuf.batch_len = 8;
-
- igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) != 0);
- igt_assert(errno == EINVAL);
- }
-
- igt_subtest("batch-end-unaligend") {
- execbuf.batch_start_offset = 0;
- execbuf.batch_len = 7;
-
- igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) != 0);
- igt_assert(errno == EINVAL);
- }
-
- igt_fixture {
- /* Undo damage for next tests. */
- execbuf.batch_start_offset = 0;
- execbuf.batch_len = 8;
-
gem_close(fd, handle);
}
}
@@ -185,6 +208,36 @@ static void reloc_tests(void)
igt_assert(errno == EINVAL);
}
+ igt_fixture {
+ execobjs[0].handle = batch_handle;
+ execobjs[0].relocation_count = 0;
+ execobjs[0].relocs_ptr = 0;
+
+ execbuf.buffer_count = 1;
+ }
+
+ igt_subtest("batch-start-unaligned") {
+ execbuf.batch_start_offset = 1;
+ execbuf.batch_len = 8;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) != 0);
+ igt_assert(errno == EINVAL);
+ }
+
+ igt_subtest("batch-end-unaligned") {
+ execbuf.batch_start_offset = 0;
+ execbuf.batch_len = 7;
+
+ igt_assert(ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf) != 0);
+ igt_assert(errno == EINVAL);
+ }
+
+ igt_fixture {
+ /* Undo damage for next tests. */
+ execbuf.batch_start_offset = 0;
+ execbuf.batch_len = 8;
+ }
+
igt_subtest("wrapped-overflow") {
/* Attempt wrapped overflow entries. */
for (i = 0; i < num; i++) {
@@ -252,12 +305,16 @@ static void buffer_count_tests(void)
igt_main
{
+ int devid = 0;
+
igt_fixture {
int ring;
uint32_t batch_data [2] = { MI_NOOP, MI_BATCH_BUFFER_END };
fd = drm_open_any();
+ devid = intel_get_drm_devid(fd);
+
/* Create giant reloc buffer area. */
num = 257;
entries = ((1ULL << 32) / (num - 1));
@@ -271,7 +328,7 @@ igt_main
for (int i = 0; i < num; i++)
handles[i] = gem_create(fd, 4096);
- if (intel_gen(intel_get_drm_devid(fd)) >= 6)
+ if (intel_gen(devid) >= 6)
ring = I915_EXEC_BLT;
else
ring = 0;
@@ -296,7 +353,8 @@ igt_main
reloc_tests();
- source_offset_tests();
+ source_offset_tests(devid, false);
+ source_offset_tests(devid, true);
buffer_count_tests();