From: Antonio Argenziano <antonio.argenziano@xxxxxxxxx> An hanging batch is nothing more than a spinning batch that never gets stopped, so re-use the routines implemented in dummyload.c. v2: - Let caller decide spin loop size - Now builds with meson. v3: - Only use loose loops for hangs (Chris) v4: - No requires Signed-off-by: Antonio Argenziano <antonio.argenziano@xxxxxxxxx> Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Reviewed-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- lib/igt_gt.c | 57 ++++++++-------------------------------------------- 1 file changed, 8 insertions(+), 49 deletions(-) diff --git a/lib/igt_gt.c b/lib/igt_gt.c index 89b318ae6..e2701fb21 100644 --- a/lib/igt_gt.c +++ b/lib/igt_gt.c @@ -40,6 +40,7 @@ #include "ioctl_wrappers.h" #include "intel_reg.h" #include "intel_chipset.h" +#include "igt_dummyload.h" /** * SECTION:igt_gt @@ -271,14 +272,9 @@ igt_hang_t igt_hang_ctx(int fd, unsigned flags, uint64_t *offset) { - struct drm_i915_gem_relocation_entry reloc; - struct drm_i915_gem_execbuffer2 execbuf; - struct drm_i915_gem_exec_object2 exec; struct drm_i915_gem_context_param param; - uint32_t b[16]; + igt_spin_t *spin; unsigned ban; - unsigned len; - int gen; igt_require_hang_ring(fd, ring); @@ -302,52 +298,15 @@ igt_hang_t igt_hang_ctx(int fd, if ((flags & HANG_ALLOW_BAN) == 0) context_set_ban(fd, ctx, 0); - memset(&reloc, 0, sizeof(reloc)); - memset(&exec, 0, sizeof(exec)); - memset(&execbuf, 0, sizeof(execbuf)); - - exec.handle = gem_create(fd, 4096); - exec.relocation_count = 1; - exec.relocs_ptr = to_user_pointer(&reloc); - - memset(b, 0xc5, sizeof(b)); - - len = 0; - gen = intel_gen(intel_get_drm_devid(fd)); - if (gen >= 8) { - b[len++] = MI_BATCH_BUFFER_START | 1 << 8 | 1; - b[len++] = 0; - b[len++] = 0; - } else if (gen >= 6) { - b[len++] = MI_BATCH_BUFFER_START | 1 << 8; - b[len++] = 0; - } else { - b[len++] = MI_BATCH_BUFFER_START | 2 << 6; - b[len] = 0; - if (gen < 4) { - b[len] |= 1; - reloc.delta = 1; - } - len++; - } - b[len++] = MI_BATCH_BUFFER_END; - b[len] = MI_NOOP; - gem_write(fd, exec.handle, 0, b, sizeof(b)); - - reloc.offset = sizeof(uint32_t); - reloc.target_handle = exec.handle; - reloc.read_domains = I915_GEM_DOMAIN_COMMAND; - - execbuf.buffers_ptr = to_user_pointer(&exec); - execbuf.buffer_count = 1; - execbuf.flags = ring; - i915_execbuffer2_set_context_id(execbuf, ctx); - gem_execbuf(fd, &execbuf); + spin = __igt_spin_batch_new(fd, + .ctx = ctx, + .engine = ring, + .flags = IGT_SPIN_NO_PREEMPTION); if (offset) - *offset = exec.offset; + *offset = spin->obj[1].offset; - return (igt_hang_t){ exec.handle, ctx, ban, flags }; + return (igt_hang_t){ spin->handle, ctx, ban, flags }; } /** -- 2.18.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx