[PATCH i-g-t 1/2] tests/imagination: Add DEV_QUERY quirks and enhancements tests
Robert Mazur <[email protected]> Tue, 28 Jul 2026 21:39:33 +0200
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <20260728-test-imagination-additional-dev_query-tests-v1-1-f361c7c2b513@imgtec.com> |
From: Donald Robson <[email protected]> Add subtests for DEV_QUERY quirks and enhancements for array copy and invalid padding error paths. Signed-off-by: Donald Robson <[email protected]> Signed-off-by: Robert Mazur <[email protected]> Acked-by: Kamil Konieczny <[email protected]> --- tests/imagination/meson.build | 1 + tests/imagination/pvr_quirks_enhancements.c | 112 ++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/tests/imagination/meson.build b/tests/imagination/meson.build index 69ef0a8c6..dc08a5d8b 100644 --- a/tests/imagination/meson.build +++ b/tests/imagination/meson.build @@ -4,6 +4,7 @@ pvr_progs = [ 'pvr_dev_query', 'pvr_gpu_info', 'pvr_heap_info', 'pvr_hwrt', + 'pvr_quirks_enhancements', 'pvr_vm_context', ] diff --git a/tests/imagination/pvr_quirks_enhancements.c b/tests/imagination/pvr_quirks_enhancements.c new file mode 100644 index 000000000..d91a5ab64 --- /dev/null +++ b/tests/imagination/pvr_quirks_enhancements.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* Copyright (c) 2026 Imagination Technologies Ltd. All Rights Reserved */ + +#include <errno.h> +#include <stdbool.h> +#include <stdint.h> + +#include "igt.h" +#include "igt_pvr.h" + +#include "pvr_drm.h" + +int igt_main() +{ + int fd; + + igt_fixture() + { + fd = drm_open_driver(DRIVER_POWERVR); + } + + igt_describe("Test copying enhancements from the kernel"); + igt_subtest("enhancements-array-copy") + { + struct drm_pvr_dev_query_enhancements enhancements_get = {0}; + uint32_t *enhancements; + + /* Enhancements. */ + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET, + sizeof(enhancements_get), + &enhancements_get, 0); + /* + * Supplementary check - alloc one extra space as a watermark + * to check the copy does not overflow. We only need to check + * this once for the whole UAPI, as a macro is used to do this. + */ + enhancements = calloc(enhancements_get.count + 1, + sizeof(*enhancements)); + igt_assert(enhancements); + + /* Set watermark. */ + enhancements[enhancements_get.count] = 0xABCDEFAB; + + enhancements_get.enhancements = to_user_pointer(enhancements); + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET, + sizeof(enhancements_get), + &enhancements_get, 0); + + for (int i = 0; i < enhancements_get.count; i++) + igt_assert_neq(enhancements[i], 0); + + /* Check the watermark is intact. */ + igt_assert_eq(enhancements[enhancements_get.count], 0xABCDEFAB); + } + + igt_describe("Test copying quirks from the kernel"); + igt_subtest("quirks-array-copy") + { + struct drm_pvr_dev_query_quirks quirks_get = {0}; + uint32_t *quirks; + + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_QUIRKS_GET, + sizeof(quirks_get), &quirks_get, 0); + quirks = calloc(quirks_get.count, sizeof(*quirks)); + igt_assert(quirks); + + quirks_get.quirks = to_user_pointer(quirks); + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_QUIRKS_GET, + sizeof(quirks_get), + &quirks_get, 0); + + for (int i = 0; i < quirks_get.count; i++) + igt_assert_neq(quirks[i], 0); + + igt_assert_lte(quirks_get.musthave_count, quirks_get.count); + } + + igt_describe("Test enhancements query with invalid padding"); + igt_subtest("enhancements-bad-padding") + { + struct drm_pvr_dev_query_enhancements enhancements_get = { + ._padding_a = 1, + }; + + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET, + sizeof(enhancements_get), + &enhancements_get, EINVAL); + + enhancements_get._padding_a = 0; + enhancements_get._padding_c = 1; + + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET, + sizeof(enhancements_get), + &enhancements_get, EINVAL); + } + + igt_describe("Test quirks query with invalid padding"); + igt_subtest("quirks-bad-padding") + { + struct drm_pvr_dev_query_quirks quirks_get = { + ._padding_c = 1, + }; + + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_QUIRKS_GET, + sizeof(quirks_get), &quirks_get, EINVAL); + } + + igt_fixture() + { + drm_close_driver(fd); + } +} -- 2.43.0