diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2024-04-23 18:22:17 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2024-04-24 12:14:23 -0400 |
commit | a97669050e1242add00c110d91103d2d3787627c (patch) | |
tree | c5df9533fb5d7e5dfdfe99a7ec8b65200c79e06c | |
parent | e7d31440464c076e0fbf018cc63f344fa06362c1 (diff) |
tests/intel/xe_wedged: Also add a simple exec to confirm GPU health
Besides confirming that the rebind puts the device in a state
where we can send IOCTLs, let's also ensure it can really
perform some basic exec functions.
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Link: https://lore.kernel.org/r/20240423222220.1285742-2-rodrigo.vivi@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
-rw-r--r-- | tests/intel/xe_wedged.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/intel/xe_wedged.c b/tests/intel/xe_wedged.c index f2587cc43..ab9bf23d5 100644 --- a/tests/intel/xe_wedged.c +++ b/tests/intel/xe_wedged.c @@ -17,9 +17,13 @@ #include "igt.h" #include "igt_device.h" #include "igt_kmod.h" +#include "igt_syncobj.h" #include "igt_sysfs.h" +#include "xe_drm.h" #include "xe/xe_ioctl.h" +#include "xe/xe_query.h" +#include "xe/xe_spin.h" static void force_wedged(int fd) { @@ -75,12 +79,96 @@ static int simple_ioctl(int fd) return ret; } +static void +simple_exec(int fd, struct drm_xe_engine_class_instance *eci) +{ + uint32_t vm; + uint64_t addr = 0x1a0000; + struct drm_xe_sync sync[2] = { + { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, + { .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, }, + }; + struct drm_xe_exec exec = { + .num_batch_buffer = 1, + .num_syncs = 2, + .syncs = to_user_pointer(sync), + }; + uint64_t batch_offset, batch_addr, sdi_offset, sdi_addr; + uint32_t exec_queue; + uint32_t syncobjs; + size_t bo_size; + uint32_t bo = 0; + struct { + uint32_t batch[16]; + uint64_t pad; + uint32_t data; + } *data; + int b; + + vm = xe_vm_create(fd, 0, 0); + + bo_size = sizeof(*data) * 2; + bo_size = xe_bb_size(fd, bo_size); + bo = xe_bo_create(fd, vm, bo_size, + vram_if_possible(fd, eci->gt_id), + DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM); + data = xe_bo_map(fd, bo, bo_size); + + exec_queue = xe_exec_queue_create(fd, vm, eci, 0); + + syncobjs = syncobj_create(fd, 0); + sync[0].handle = syncobj_create(fd, 0); + + xe_vm_bind_async(fd, vm, 0, bo, 0, addr, + bo_size, sync, 1); + + batch_offset = (char *)&data[0].batch - (char *)data; + batch_addr = addr + batch_offset; + sdi_offset = (char *)&data[0].data - (char *)data; + sdi_addr = addr + sdi_offset; + + b = 0; + data[0].batch[b++] = MI_STORE_DWORD_IMM_GEN4; + data[0].batch[b++] = sdi_addr; + data[0].batch[b++] = sdi_addr >> 32; + data[0].batch[b++] = 0xc0ffee; + data[0].batch[b++] = MI_BATCH_BUFFER_END; + igt_assert(b <= ARRAY_SIZE(data[0].batch)); + + sync[0].flags &= ~DRM_XE_SYNC_FLAG_SIGNAL; + sync[1].flags |= DRM_XE_SYNC_FLAG_SIGNAL; + sync[1].handle = syncobjs; + + exec.exec_queue_id = exec_queue; + exec.address = batch_addr; + + syncobj_reset(fd, &syncobjs, 1); + + xe_exec(fd, &exec); + + igt_assert(syncobj_wait(fd, &syncobjs, 1, INT64_MAX, 0, NULL)); + igt_assert_eq(data[0].data, 0xc0ffee); + igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); + sync[0].flags |= DRM_XE_SYNC_FLAG_SIGNAL; + xe_vm_unbind_async(fd, vm, 0, 0, addr, bo_size, sync, 1); + igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL)); + igt_assert_eq(data[0].data, 0xc0ffee); + + syncobj_destroy(fd, sync[0].handle); + syncobj_destroy(fd, syncobjs); + xe_exec_queue_destroy(fd, exec_queue); + munmap(data, bo_size); + gem_close(fd, bo); + xe_vm_destroy(fd, vm); +} + /** * SUBTEST: basic-wedged * Description: Force Xe device wedged after injecting a failure in GT reset */ igt_main { + struct drm_xe_engine_class_instance *hwe; int fd; igt_fixture { @@ -96,6 +184,8 @@ igt_main igt_assert_neq(simple_ioctl(fd), 0); fd = rebind_xe(fd); igt_assert_eq(simple_ioctl(fd), 0); + xe_for_each_engine(fd, hwe) + simple_exec(fd, hwe); } igt_fixture { |