From: "Kuoppala, Mika" <mika.kuoppala@xxxxxxxxx> If cmd parser is mandatory, batch can't be modified post execbuf. Some tests rely on modifying batch post execbuf. Give those tests a method to query if those modifications ever reach the actual engine command stream. v2: pull in the test changes, doh v3: class based query v4: rebase Signed-off-by: Kuoppala, Mika <mika.kuoppala@xxxxxxxxx> --- lib/i915/gem_submission.c | 62 ++++++++++++++++++++++++++++++++++ lib/i915/gem_submission.h | 2 ++ tests/i915/gem_busy.c | 7 +++- tests/i915/gem_exec_async.c | 3 ++ tests/i915/gem_exec_await.c | 7 +++- tests/i915/gem_exec_fence.c | 8 +++++ tests/i915/gem_exec_latency.c | 7 ++++ tests/i915/gem_exec_nop.c | 4 ++- tests/i915/gem_exec_schedule.c | 6 +++- tests/i915/gem_exec_whisper.c | 4 ++- tests/prime_busy.c | 3 ++ tests/prime_vgem.c | 6 ++++ 12 files changed, 114 insertions(+), 5 deletions(-) diff --git a/lib/i915/gem_submission.c b/lib/i915/gem_submission.c index 4f946493..9bdf28bc 100644 --- a/lib/i915/gem_submission.c +++ b/lib/i915/gem_submission.c @@ -64,6 +64,22 @@ static bool has_semaphores(int fd, int dir) return val; } +static int cmd_parser_version(int fd) +{ + int val = 0; + struct drm_i915_getparam gp = { + gp.param = I915_PARAM_CMD_PARSER_VERSION, + gp.value = &val, + }; + + if (ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp) < 0) { + val = -errno; + igt_assert(val < 0); + } + + return val; +} + /** * gem_submission_method: * @fd: open i915 drm file descriptor @@ -253,3 +269,49 @@ void gem_require_blitter(int i915) { igt_require(gem_has_blitter(i915)); } + +static bool gem_engine_has_immutable_submission(int i915, int class) +{ + const int gen = intel_gen(intel_get_drm_devid(i915)); + int parser_version; + + parser_version = cmd_parser_version(i915); + + if (parser_version < 0) + return false; + + if (gen == 9 && class == I915_ENGINE_CLASS_COPY && parser_version > 9) + return true; + + return false; +} + + +/** + * gem_class_has_mutable_submission: + * @i915: open i915 drm file descriptor + * @class: engine class + * + * Returns boolean value if the engine class allows batch modifications + * post execbuf. + */ + +bool +gem_class_has_mutable_submission(int fd, int class) +{ + return !gem_engine_has_immutable_submission(fd, class); +} + +/** + * gem_engine_has_mutable_submission: + * @i915: open i915 drm file descriptor + * @engine: the engine (I915_EXEC_RING id) of target + * + * Returns boolean value if the engine allows batch modifications + * post execbuf. + */ +bool gem_engine_has_mutable_submission(int i915, unsigned int engine) +{ + return gem_class_has_mutable_submission(i915, + gem_execbuf_flags_to_engine_class(engine)); +} diff --git a/lib/i915/gem_submission.h b/lib/i915/gem_submission.h index 6deb7e2d..acd24bcb 100644 --- a/lib/i915/gem_submission.h +++ b/lib/i915/gem_submission.h @@ -34,6 +34,8 @@ void gem_submission_print_method(int fd); bool gem_has_semaphores(int fd); bool gem_has_execlists(int fd); bool gem_has_guc_submission(int fd); +bool gem_engine_has_mutable_submission(int fd, unsigned int engine); +bool gem_class_has_mutable_submission(int fd, int class); int gem_cmdparser_version(int i915, uint32_t engine); static inline bool gem_has_cmdparser(int i915, uint32_t engine) diff --git a/tests/i915/gem_busy.c b/tests/i915/gem_busy.c index a8388149..b84e2bd1 100644 --- a/tests/i915/gem_busy.c +++ b/tests/i915/gem_busy.c @@ -243,6 +243,10 @@ static void one(int fd, const struct intel_execution_engine2 *e, unsigned test_f i++; igt_assert(i < size/sizeof(*batch)); + + if ((test_flags & HANG) == 0) + igt_require(gem_class_has_mutable_submission(fd, e->class)); + igt_require(__gem_execbuf(fd, &execbuf) == 0); __gem_busy(fd, obj[SCRATCH].handle, &read[SCRATCH], &write[SCRATCH]); @@ -256,7 +260,8 @@ static void one(int fd, const struct intel_execution_engine2 *e, unsigned test_f e2->instance == e->instance) continue; - if (!gem_class_can_store_dword(fd, e2->class)) + if (!gem_class_can_store_dword(fd, e2->class) || + !gem_class_has_mutable_submission(fd, e2->class)) continue; igt_debug("Testing %s in parallel\n", e2->name); diff --git a/tests/i915/gem_exec_async.c b/tests/i915/gem_exec_async.c index d83e9f6d..b9859ffa 100644 --- a/tests/i915/gem_exec_async.c +++ b/tests/i915/gem_exec_async.c @@ -138,6 +138,9 @@ static void one(int fd, unsigned ring, uint32_t flags) execbuf.buffers_ptr = to_user_pointer(obj); execbuf.buffer_count = 2; execbuf.flags = ring | flags; + + igt_require(gem_engine_has_mutable_submission(fd, ring)); + igt_require(__gem_execbuf(fd, &execbuf) == 0); gem_close(fd, obj[BATCH].handle); diff --git a/tests/i915/gem_exec_await.c b/tests/i915/gem_exec_await.c index 33e2ee45..7817b483 100644 --- a/tests/i915/gem_exec_await.c +++ b/tests/i915/gem_exec_await.c @@ -78,8 +78,13 @@ static void wide(int fd, int ring_size, int timeout, unsigned int flags) double time; nengine = 0; - for_each_physical_engine(e, fd) + for_each_physical_engine(e, fd) { + if (!gem_engine_has_mutable_submission(fd, eb_ring(e))) + continue; + engines[nengine++] = eb_ring(e); + } + igt_require(nengine); exec = calloc(nengine, sizeof(*exec)); diff --git a/tests/i915/gem_exec_fence.c b/tests/i915/gem_exec_fence.c index 002120bf..fbb11ab2 100644 --- a/tests/i915/gem_exec_fence.c +++ b/tests/i915/gem_exec_fence.c @@ -129,6 +129,9 @@ static void test_fence_busy(int fd, unsigned ring, unsigned flags) uint32_t *batch; int fence, i, timeout; + if ((flags & HANG) == 0) + igt_require(gem_engine_has_mutable_submission(fd, ring)); + gem_quiescent_gpu(fd); memset(&execbuf, 0, sizeof(execbuf)); @@ -265,6 +268,8 @@ static void test_fence_busy_all(int fd, unsigned flags) for_each_engine(e, fd) { int fence, new; + if ((flags & HANG) == 0) + igt_require(gem_engine_has_mutable_submission(fd, eb_ring(e))); execbuf.flags = eb_ring(e) | LOCAL_EXEC_FENCE_OUT; execbuf.rsvd2 = -1; gem_execbuf_wr(fd, &execbuf); @@ -321,6 +326,9 @@ static void test_fence_await(int fd, unsigned ring, unsigned flags) uint32_t *out; int i; + if ((flags & HANG) == 0) + igt_require(gem_engine_has_mutable_submission(fd, ring)); + igt_require(gem_can_store_dword(fd, 0)); out = gem_mmap__wc(fd, scratch, 0, 4096, PROT_WRITE); diff --git a/tests/i915/gem_exec_latency.c b/tests/i915/gem_exec_latency.c index 3d99182a..e4c0c862 100644 --- a/tests/i915/gem_exec_latency.c +++ b/tests/i915/gem_exec_latency.c @@ -128,6 +128,8 @@ static void latency_on_ring(int fd, double gpu_latency; int i, j; + igt_require(gem_engine_has_mutable_submission(fd, ring)); + reg = (volatile uint32_t *)((volatile char *)igt_global_mmio + RCS_TIMESTAMP); memset(&execbuf, 0, sizeof(execbuf)); @@ -271,6 +273,8 @@ static void latency_from_ring(int fd, uint32_t ctx[2] = {}; int i, j; + igt_require(gem_engine_has_mutable_submission(fd, ring)); + if (flags & PREEMPT) { ctx[0] = gem_context_create(fd); gem_context_set_priority(fd, ctx[0], -1023); @@ -316,6 +320,9 @@ static void latency_from_ring(int fd, igt_spin_t *spin = NULL; IGT_CORK_HANDLE(c); + if (!gem_engine_has_mutable_submission(fd, eb_ring(e))) + continue; + gem_set_domain(fd, obj[2].handle, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT); diff --git a/tests/i915/gem_exec_nop.c b/tests/i915/gem_exec_nop.c index 2ad8aeea..dbedb356 100644 --- a/tests/i915/gem_exec_nop.c +++ b/tests/i915/gem_exec_nop.c @@ -123,6 +123,7 @@ static void poll_ring(int fd, unsigned engine, const char *name, int timeout) gem_require_ring(fd, engine); igt_require(gem_can_store_dword(fd, engine)); + igt_require(gem_engine_has_mutable_submission(fd, engine)); memset(&obj, 0, sizeof(obj)); obj.handle = gem_create(fd, 4096); @@ -234,7 +235,8 @@ static void poll_sequential(int fd, const char *name, int timeout) nengine = 0; for_each_physical_engine(e, fd) { - if (!gem_can_store_dword(fd, eb_ring(e))) + if (!gem_can_store_dword(fd, eb_ring(e)) || + !gem_engine_has_mutable_submission(fd, eb_ring(e))) continue; engines[nengine++] = eb_ring(e); diff --git a/tests/i915/gem_exec_schedule.c b/tests/i915/gem_exec_schedule.c index 5c15f177..ca6bef6a 100644 --- a/tests/i915/gem_exec_schedule.c +++ b/tests/i915/gem_exec_schedule.c @@ -652,7 +652,8 @@ static void semaphore_noskip(int i915) igt_spin_t *chain, *spin; if (eb_ring(inner) == eb_ring(outer) || - !gem_can_store_dword(i915, eb_ring(inner))) + !gem_can_store_dword(i915, eb_ring(inner)) || + !gem_engine_has_mutable_submission(i915, eb_ring(inner))) continue; chain = __igt_spin_new(i915, .engine = eb_ring(outer)); @@ -1157,6 +1158,9 @@ static void deep(int fd, unsigned ring) int dep_nreq; int n; + igt_require(gem_can_store_dword(fd, ring)); + igt_require(gem_engine_has_mutable_submission(fd, ring)); + ctx = malloc(sizeof(*ctx) * MAX_CONTEXTS); for (n = 0; n < MAX_CONTEXTS; n++) { ctx[n] = gem_context_create(fd); diff --git a/tests/i915/gem_exec_whisper.c b/tests/i915/gem_exec_whisper.c index a3384760..45cc1437 100644 --- a/tests/i915/gem_exec_whisper.c +++ b/tests/i915/gem_exec_whisper.c @@ -204,13 +204,15 @@ static void whisper(int fd, unsigned engine, unsigned flags) nengine = 0; if (engine == ALL_ENGINES) { for_each_physical_engine(e, fd) { - if (gem_can_store_dword(fd, eb_ring(e))) + if (gem_can_store_dword(fd, eb_ring(e)) && + gem_engine_has_mutable_submission(fd, eb_ring(e))) engines[nengine++] = eb_ring(e); } } else { igt_assert(!(flags & ALL)); igt_require(gem_has_ring(fd, engine)); igt_require(gem_can_store_dword(fd, engine)); + igt_require(gem_engine_has_mutable_submission(fd, engine)); engines[nengine++] = engine; } igt_require(nengine); diff --git a/tests/prime_busy.c b/tests/prime_busy.c index 8ee23bb3..bb29216e 100644 --- a/tests/prime_busy.c +++ b/tests/prime_busy.c @@ -53,6 +53,9 @@ static void busy(int fd, unsigned ring, unsigned flags) uint32_t *batch, *bbe; int i, count, timeout; + if ((flags & HANG) == 0) + igt_require(gem_engine_has_mutable_submission(fd, ring)); + gem_quiescent_gpu(fd); memset(&execbuf, 0, sizeof(execbuf)); diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c index 2b21ff41..04cc913d 100644 --- a/tests/prime_vgem.c +++ b/tests/prime_vgem.c @@ -342,6 +342,8 @@ static void work(int i915, int dmabuf, unsigned ring, uint32_t flags) uint32_t *batch, *bbe; int i, count; + igt_require(gem_engine_has_mutable_submission(i915, ring)); + memset(&execbuf, 0, sizeof(execbuf)); execbuf.buffers_ptr = (uintptr_t)obj; execbuf.buffer_count = 2; @@ -850,6 +852,7 @@ igt_main e->name) { gem_require_ring(i915, eb_ring(e)); igt_require(gem_can_store_dword(i915, eb_ring(e))); + igt_require(gem_engine_has_mutable_submission(i915, eb_ring(e))); gem_quiescent_gpu(i915); test_sync(i915, vgem, e->exec_id, e->flags); @@ -862,6 +865,7 @@ igt_main e->name) { gem_require_ring(i915, eb_ring(e)); igt_require(gem_can_store_dword(i915, eb_ring(e))); + igt_require(gem_engine_has_mutable_submission(i915, eb_ring(e))); gem_quiescent_gpu(i915); test_busy(i915, vgem, e->exec_id, e->flags); @@ -874,6 +878,7 @@ igt_main e->name) { gem_require_ring(i915, eb_ring(e)); igt_require(gem_can_store_dword(i915, eb_ring(e))); + igt_require(gem_engine_has_mutable_submission(i915, eb_ring(e))); gem_quiescent_gpu(i915); test_wait(i915, vgem, e->exec_id, e->flags); @@ -897,6 +902,7 @@ igt_main e->name) { gem_require_ring(i915, eb_ring(e)); igt_require(gem_can_store_dword(i915, eb_ring(e))); + igt_require(gem_engine_has_mutable_submission(i915, eb_ring(e))); gem_quiescent_gpu(i915); test_fence_wait(i915, vgem, e->exec_id, e->flags); -- 2.17.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx