diff options
author | Brad Volkin <bradley.d.volkin@intel.com> | 2014-11-03 11:18:59 -0800 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-11-12 13:43:04 +0100 |
commit | c1fdc2f0e95714e20b157e318f07110219a2237f (patch) | |
tree | de939fe7f184b8d91897864d0d5ff631b519fa90 | |
parent | 4dd6e0edcf4fb2dd52fafa8b448ce87fafc4125d (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>
-rw-r--r-- | tests/gem_exec_parse.c | 16 |
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; |