[PATCH i-g-t] intel/xe_exec_store.c: Fix the execution of basic-all test
sai.gowtham.ch at intel.com
sai.gowtham.ch at intel.com
Fri Dec 8 07:17:43 UTC 2023
From: Sai Gowtham Ch <sai.gowtham.ch at intel.com>
Implement xe_for_each_engine in basic-all test, it queries
all the supported classes and instances for a gt and submits
workload to it. which fixes the num_placements issue.
Signed-off-by: Sai Gowtham Ch <sai.gowtham.ch at intel.com>
---
tests/intel/xe_exec_store.c | 126 +++++++-----------------------------
1 file changed, 25 insertions(+), 101 deletions(-)
diff --git a/tests/intel/xe_exec_store.c b/tests/intel/xe_exec_store.c
index dec8546a3..88ee69a63 100644
--- a/tests/intel/xe_exec_store.c
+++ b/tests/intel/xe_exec_store.c
@@ -51,8 +51,13 @@ static void store_dword_batch(struct data *data, uint64_t addr, int value)
/**
* SUBTEST: basic-store
* Description: Basic test to verify store dword.
+ * Test category: functionality test
+ *
+ * SUBTEST: basic-all
+ * Description: Test to verify store dword on all available engines.
+ * Test category: functionality test
*/
-static void store(int fd)
+static void store(int fd, struct drm_xe_engine_class_instance *eci)
{
struct drm_xe_sync sync = {
.type = DRM_XE_SYNC_TYPE_SYNCOBJ,
@@ -64,9 +69,9 @@ static void store(int fd)
.syncs = to_user_pointer(&sync),
};
struct data *data;
- struct drm_xe_engine *engine;
uint32_t vm;
uint32_t exec_queue;
+ uint32_t bind_engine;
uint32_t syncobj;
size_t bo_size;
int value = 0x123456;
@@ -81,16 +86,17 @@ static void store(int fd)
bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd),
xe_get_default_alignment(fd));
- engine = xe_engine(fd, 1);
bo = xe_bo_create(fd, vm, bo_size,
- vram_if_possible(fd, engine->instance.gt_id),
+ vram_if_possible(fd, eci->gt_id),
DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM);
- xe_vm_bind_async(fd, vm, engine->instance.gt_id, bo, 0, addr, bo_size, &sync, 1);
+ exec_queue = xe_exec_queue_create(fd, vm, eci, 0);
+ bind_engine = xe_bind_exec_queue_create(fd, vm, 0, true);
+ xe_vm_bind_async(fd, vm, bind_engine, bo, 0, addr, bo_size, &sync, 1);
data = xe_bo_map(fd, bo, bo_size);
store_dword_batch(data, addr, value);
- exec_queue = xe_exec_queue_create(fd, vm, &engine->instance, 0);
+ exec_queue = xe_exec_queue_create(fd, vm, eci, 0);
exec.exec_queue_id = exec_queue;
exec.address = data->addr;
sync.flags &= DRM_XE_SYNC_FLAG_SIGNAL;
@@ -206,112 +212,30 @@ static void store_cachelines(int fd, struct drm_xe_engine_class_instance *eci,
xe_vm_destroy(fd, vm);
}
-/**
- * SUBTEST: basic-all
- * Description: Test to verify store dword on all available engines.
- */
-static void store_all(int fd, int gt, int class)
-{
- 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),
- };
-
- struct data *data;
- uint32_t syncobjs[MAX_INSTANCE];
- uint32_t exec_queues[MAX_INSTANCE];
- uint32_t vm;
- size_t bo_size;
- uint64_t addr = 0x100000;
- uint32_t bo = 0;
- struct drm_xe_engine_class_instance eci[MAX_INSTANCE];
- struct drm_xe_engine_class_instance *hwe;
- int i, num_placements = 0;
-
- vm = xe_vm_create(fd, DRM_XE_VM_CREATE_FLAG_ASYNC_DEFAULT, 0);
- bo_size = sizeof(*data);
- bo_size = ALIGN(bo_size + xe_cs_prefetch_size(fd),
- xe_get_default_alignment(fd));
-
- bo = xe_bo_create(fd, vm, bo_size,
- vram_if_possible(fd, 0),
- DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM);
- data = xe_bo_map(fd, bo, bo_size);
-
- xe_for_each_engine(fd, hwe) {
- if (hwe->engine_class != class || hwe->gt_id != gt)
- continue;
- eci[num_placements++] = *hwe;
- }
-
- igt_require(num_placements);
-
- for (i = 0; i < num_placements; i++) {
- struct drm_xe_exec_queue_create create = {
- .vm_id = vm,
- .width = 1,
- .num_placements = num_placements,
- .instances = to_user_pointer(eci),
- };
-
- igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_EXEC_QUEUE_CREATE,
- &create), 0);
- exec_queues[i] = create.exec_queue_id;
- syncobjs[i] = 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);
-
- for (i = 0; i < num_placements; i++) {
-
- store_dword_batch(data, addr, i);
- sync[0].flags &= ~DRM_XE_SYNC_FLAG_SIGNAL;
- sync[1].flags |= DRM_XE_SYNC_FLAG_SIGNAL;
- sync[1].handle = syncobjs[i];
-
- exec.exec_queue_id = exec_queues[i];
- exec.address = data->addr;
- xe_exec(fd, &exec);
-
- igt_assert(syncobj_wait(fd, &syncobjs[i], 1, INT64_MAX, 0, NULL));
- igt_assert_eq(data->data, i);
- }
-
- xe_vm_unbind_async(fd, vm, 0, 0, addr, bo_size, sync, 1);
- syncobj_destroy(fd, sync[0].handle);
- munmap(data, bo_size);
- gem_close(fd, bo);
-
- for (i = 0; i < num_placements; i++) {
- syncobj_destroy(fd, syncobjs[i]);
- xe_exec_queue_destroy(fd, exec_queues[i]);
- }
- xe_vm_destroy(fd, vm);
-}
-
igt_main
{
struct drm_xe_engine_class_instance *hwe;
- int fd, class, gt;
+ struct drm_xe_engine *engine;
+ int fd, i = 0;
igt_fixture {
fd = drm_open_driver(DRIVER_XE);
xe_device_get(fd);
}
- igt_subtest("basic-store")
- store(fd);
+ igt_subtest("basic-store") {
+ engine = xe_engine(fd, 1);
+ store(fd, &engine->instance);
+ }
igt_subtest("basic-all") {
- xe_for_each_gt(fd, gt)
- xe_for_each_engine_class(class)
- store_all(fd, gt, class);
+ xe_for_each_engine(fd, hwe) {
+ igt_info("engine %d: %s, engine instance: %d, tile: TILE-%d\n", i++,
+ xe_engine_class_string(hwe->engine_class),
+ hwe->engine_instance,
+ hwe->gt_id);
+ store(fd, hwe);
+ }
}
igt_subtest("cachelines")
--
2.39.1
More information about the igt-dev
mailing list