mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-13 02:46:23 +00:00
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>
This commit is contained in:
parent
4dd6e0edcf
commit
c1fdc2f0e9
@ -144,16 +144,18 @@ static void exec_split_batch(int fd, uint32_t *cmds,
|
|||||||
struct drm_i915_gem_exec_object2 objs[1];
|
struct drm_i915_gem_exec_object2 objs[1];
|
||||||
uint32_t cmd_bo;
|
uint32_t cmd_bo;
|
||||||
uint32_t noop[1024] = { 0 };
|
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
|
// 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, 0, noop, sizeof(noop));
|
||||||
gem_write(fd, cmd_bo, 4096, noop, sizeof(noop));
|
gem_write(fd, cmd_bo, 4096, noop, sizeof(noop));
|
||||||
|
|
||||||
// Write the provided commands such that the first dword
|
// Write the provided commands such that the first dword
|
||||||
// of the command buffer is the last dword of the first
|
// of the command buffer is the last dword of the first
|
||||||
// page (i.e. the command is split across the two pages).
|
// 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].handle = cmd_bo;
|
||||||
objs[0].relocation_count = 0;
|
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.buffers_ptr = (uintptr_t)objs;
|
||||||
execbuf.buffer_count = 1;
|
execbuf.buffer_count = 1;
|
||||||
execbuf.batch_start_offset = 0;
|
// NB: We want batch_start_offset and batch_len to point to the block
|
||||||
execbuf.batch_len = size;
|
// 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.cliprects_ptr = 0;
|
||||||
execbuf.num_cliprects = 0;
|
execbuf.num_cliprects = 0;
|
||||||
execbuf.DR1 = 0;
|
execbuf.DR1 = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user