summaryrefslogtreecommitdiff
path: root/tests/gem_exec_parse.c
diff options
context:
space:
mode:
authorBrad Volkin <bradley.d.volkin@intel.com>2014-11-03 11:18:59 -0800
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-12 13:43:04 +0100
commitc1fdc2f0e95714e20b157e318f07110219a2237f (patch)
treede939fe7f184b8d91897864d0d5ff631b519fa90 /tests/gem_exec_parse.c
parent4dd6e0edcf4fb2dd52fafa8b448ce87fafc4125d (diff)
tests/gem_exec_parse: fix batch_len setting for cmd-crossing-page
The size of the batch buffer passed to the kernel is significantly larger than the size of the batch buffer passed to the function. A proposed optimization as part of the batch copy kernel series is to use batch_len for the copy and parse operations, which leads to a false "batch without MI_BATCH_BUFFER_END" failure for this test. To fix this, modify the test to set batch_start_offset and batch_len such that they define the range of actual commands in the batch, including a few of the surrounding nops for alignment purposes. v2: update batch_start_offset as well Signed-off-by: Brad Volkin <bradley.d.volkin@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'tests/gem_exec_parse.c')
-rw-r--r--tests/gem_exec_parse.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/tests/gem_exec_parse.c b/tests/gem_exec_parse.c
index 1dc9103e..e48b83a6 100644
--- a/tests/gem_exec_parse.c
+++ b/tests/gem_exec_parse.c
@@ -144,16 +144,18 @@ static void exec_split_batch(int fd, uint32_t *cmds,
struct drm_i915_gem_exec_object2 objs[1];
uint32_t cmd_bo;
uint32_t noop[1024] = { 0 };
+ const int alloc_size = 4096 * 2;
+ const int actual_start_offset = 4096-sizeof(uint32_t);
// Allocate and fill a 2-page batch with noops
- cmd_bo = gem_create(fd, 4096 * 2);
+ cmd_bo = gem_create(fd, alloc_size);
gem_write(fd, cmd_bo, 0, noop, sizeof(noop));
gem_write(fd, cmd_bo, 4096, noop, sizeof(noop));
// Write the provided commands such that the first dword
// of the command buffer is the last dword of the first
// page (i.e. the command is split across the two pages).
- gem_write(fd, cmd_bo, 4096-sizeof(uint32_t), cmds, size);
+ gem_write(fd, cmd_bo, actual_start_offset, cmds, size);
objs[0].handle = cmd_bo;
objs[0].relocation_count = 0;
@@ -166,8 +168,14 @@ static void exec_split_batch(int fd, uint32_t *cmds,
execbuf.buffers_ptr = (uintptr_t)objs;
execbuf.buffer_count = 1;
- execbuf.batch_start_offset = 0;
- execbuf.batch_len = size;
+ // NB: We want batch_start_offset and batch_len to point to the block
+ // of the actual commands (i.e. at the last dword of the first page),
+ // but have to adjust both the start offset and length to meet the
+ // kernel driver's requirements on the alignment of those fields.
+ execbuf.batch_start_offset = actual_start_offset & ~0x7;
+ execbuf.batch_len =
+ ALIGN(size + actual_start_offset - execbuf.batch_start_offset,
+ 0x8);
execbuf.cliprects_ptr = 0;
execbuf.num_cliprects = 0;
execbuf.DR1 = 0;