diff options
author | Maíra Canal <mcanal@igalia.com> | 2022-12-04 18:49:17 -0300 |
---|---|---|
committer | Maíra Canal <mcanal@igalia.com> | 2023-02-03 14:43:45 -0300 |
commit | 8b199fe65d8f453c8c8944cd23eddb9549f2c840 (patch) | |
tree | 354763b84cd3ff4b8adb4eda8508f42b6afbee87 /tests/v3d | |
parent | 0e7751e374f1917f542b8b2a845cd6d51d0daa0f (diff) |
tests/v3d_wait_bo: Create test for V3D's Wait BO IOCTL
Add nine igt_subtests for the DRM_IOCTL_V3D_WAIT_BO, which ensures
that improper parameters return an errno and tests timeouts for used
and unused BOs. In order to create used BOs, it submits a noop job and
evaluates V3D's job BOs.
Reviewed-by: Melissa Wen <mwen@igalia.com>
Signed-off-by: Maíra Canal <mcanal@igalia.com>
Diffstat (limited to 'tests/v3d')
-rw-r--r-- | tests/v3d/meson.build | 1 | ||||
-rw-r--r-- | tests/v3d/v3d_wait_bo.c | 127 |
2 files changed, 128 insertions, 0 deletions
diff --git a/tests/v3d/meson.build b/tests/v3d/meson.build index 07badc498..7b4257f98 100644 --- a/tests/v3d/meson.build +++ b/tests/v3d/meson.build @@ -4,6 +4,7 @@ v3d_progs = [ 'v3d_get_param', 'v3d_mmap', 'v3d_perfmon', + 'v3d_wait_bo', ] foreach prog : v3d_progs diff --git a/tests/v3d/v3d_wait_bo.c b/tests/v3d/v3d_wait_bo.c new file mode 100644 index 000000000..9e51b6a05 --- /dev/null +++ b/tests/v3d/v3d_wait_bo.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2022 Igalia S.L. + */ + +#include "igt.h" +#include "igt_v3d.h" +#include "v3d/v3d_cl.h" + +IGT_TEST_DESCRIPTION("Tests for the V3D's Wait BO IOCTL"); + +static void test_used_bo(int fd, struct v3d_bo *bo, uint64_t timeout) +{ + struct drm_v3d_wait_bo arg = { + .timeout_ns = timeout, + .handle = bo->handle, + }; + int ret; + + ret = igt_ioctl(fd, DRM_IOCTL_V3D_WAIT_BO, &arg); + + if (ret == -1 && errno == ETIME) + igt_debug("Timeout triggered\n"); + igt_assert(ret == 0 || (ret == -1 && errno == ETIME)); +} + +igt_main +{ + int fd; + struct v3d_bo *bo; + + igt_fixture { + fd = drm_open_driver(DRIVER_V3D); + bo = igt_v3d_create_bo(fd, PAGE_SIZE); + } + + igt_describe("Make sure it cannot wait on an invalid BO."); + igt_subtest("bad-bo") { + struct drm_v3d_wait_bo arg = { + .handle = bo->handle + 1, + .timeout_ns = 0, + }; + do_ioctl_err(fd, DRM_IOCTL_V3D_WAIT_BO, &arg, EINVAL); + } + + igt_describe("Make sure the pad is zero."); + igt_subtest("bad-pad") { + struct drm_v3d_wait_bo arg = { + .pad = 1, + .handle = bo->handle, + .timeout_ns = 0, + }; + do_ioctl_err(fd, DRM_IOCTL_V3D_WAIT_BO, &arg, EINVAL); + } + + igt_describe("Wait on an unused BO for 0 ns."); + igt_subtest("unused-bo-0ns") + igt_v3d_wait_bo(fd, bo, 0); + + igt_describe("Wait on an unused BO for 1 ns."); + igt_subtest("unused-bo-1ns") + igt_v3d_wait_bo(fd, bo, 1); + + igt_describe("Wait on a newly mapped BO for 0 ns."); + igt_subtest("map-bo-0ns") { + igt_v3d_bo_mmap(fd, bo); + igt_v3d_wait_bo(fd, bo, 0); + munmap(bo->map, bo->size); + } + + igt_describe("Wait on a newly mapped BO for 1 ns."); + igt_subtest("map-bo-1ns") { + igt_v3d_bo_mmap(fd, bo); + igt_v3d_wait_bo(fd, bo, 1); + munmap(bo->map, bo->size); + } + + igt_describe("Wait for BOs used for a noop job for 0 ns."); + igt_subtest("used-bo-0ns") { + struct v3d_cl_job *job = igt_v3d_noop_job(fd); + + do_ioctl(fd, DRM_IOCTL_V3D_SUBMIT_CL, job->submit); + + test_used_bo(fd, job->tile_alloc, 0); + test_used_bo(fd, job->tile_state, 0); + test_used_bo(fd, job->bcl->bo, 0); + test_used_bo(fd, job->rcl->bo, 0); + test_used_bo(fd, job->icl->bo, 0); + + igt_v3d_free_cl_job(fd, job); + } + + igt_describe("Wait for BOs used for a noop job for 1 ns."); + igt_subtest("used-bo-1ns") { + struct v3d_cl_job *job = igt_v3d_noop_job(fd); + + do_ioctl(fd, DRM_IOCTL_V3D_SUBMIT_CL, job->submit); + + test_used_bo(fd, job->tile_alloc, 1); + test_used_bo(fd, job->tile_state, 1); + test_used_bo(fd, job->bcl->bo, 1); + test_used_bo(fd, job->rcl->bo, 1); + test_used_bo(fd, job->icl->bo, 1); + + igt_v3d_free_cl_job(fd, job); + } + + igt_describe("Wait for BOs used for a noop job for a long amount of time."); + igt_subtest("used-bo") { + struct v3d_cl_job *job = igt_v3d_noop_job(fd); + + do_ioctl(fd, DRM_IOCTL_V3D_SUBMIT_CL, job->submit); + + igt_v3d_wait_bo(fd, job->tile_alloc, INT64_MAX); + igt_v3d_wait_bo(fd, job->tile_state, INT64_MAX); + igt_v3d_wait_bo(fd, job->bcl->bo, INT64_MAX); + igt_v3d_wait_bo(fd, job->rcl->bo, INT64_MAX); + igt_v3d_wait_bo(fd, job->icl->bo, INT64_MAX); + + igt_v3d_free_cl_job(fd, job); + } + + igt_fixture { + igt_v3d_free_bo(fd, bo); + close(fd); + } +} |