Re: [EXTERNAL] Re: [PATCH i-g-t v3 01/10] tests/imagination: Add framework for Imagination tests
Kamil Konieczny <[email protected]> Mon, 27 Jul 2026 20:18:55 +0200
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
Hi Brajesh, On 2026-07-27 at 09:49:54 +0000, Brajesh Gupta wrote: > On Wed, 2026-07-22 at 15:44 +0200, Kamil Konieczny wrote: > Hi Kamil, > > *** CAUTION: This email originates from a source not known to Imagination Technologies. Think before you click a link or open an attachment *** > > > > Hi Robert, > > On 2026-07-17 at 16:21:33 +0200, Robert Mazur wrote: > > > From: Matt Coster <[email protected]> > > > > > > Add the initial IGT infrastructure for PowerVR (Imagination) GPUs and > > > introduce the first GEM buffer object creation tests. > > > > > > The tests verify valid BO creation and validate error handling for > > > invalid ioctl parameters. > > > > > > PowerVR DRM driver background: > > > https://lore.kernel.org/dri-devel/[email protected]/ > > > Driver documentation: > > > https://docs.kernel.org/gpu/imagination/index.html > > > > > > > Can someone from your team run these tests on your hardware and > > report here that they work? Also may he/she help with review > > tests? I will do general part in this one patch and will glance > > into others. > > I ran IGT tests on two different platforms and all tests are passing. Attached > result for test runs. > > Thanks, > Brajesh Thank you, please send Tested-by: to each, or write in one reply for which patches in series your t-by applies. Thanks! Regards, Kamil > > > > > > Signed-off-by: Matt Coster <[email protected]> > > > Signed-off-by: Robert Mazur <[email protected]> > > > --- > > > docs/platforms.md | 1 + > > > lib/drmtest.c | 11 +++++++ > > > lib/drmtest.h | 3 ++ > > > lib/igt_pvr.c | 75 +++++++++++++++++++++++++++++++++++++++++++ > > > lib/igt_pvr.h | 16 +++++++++ > > > lib/meson.build | 1 + > > > meson.build | 8 +++++ > > > tests/imagination/meson.build | 13 ++++++++ > > > tests/imagination/pvr_gem.c | 66 +++++++++++++++++++++++++++++++++++++ > > > tests/meson.build | 2 ++ > > > 10 files changed, 196 insertions(+) > > > > > > diff --git a/docs/platforms.md b/docs/platforms.md > > > index 214f53c1d..ea86a89c9 100644 > > > --- a/docs/platforms.md > > > +++ b/docs/platforms.md > > > @@ -25,6 +25,7 @@ Support exists for the following platforms: > > > - Panthor > > > - Virtual GPUs (e.g., virtio_gpu in QEMU/KVM/AVD or vmwgfx) > > > - Virtual display (vkms) > > > +- Imagination (powervr) > > > > > > #### Intel > > > > > > diff --git a/lib/drmtest.c b/lib/drmtest.c > > > index b0be06a75..1e789d2af 100644 > > > --- a/lib/drmtest.c > > > +++ b/lib/drmtest.c > > > @@ -143,6 +143,11 @@ bool is_msm_device(int fd) > > > return __is_device(fd, "msm"); > > > } > > > > > > +bool is_pvr_device(int fd) > > > +{ > > > + return __is_device(fd, "powervr"); > > > +} > > > + > > > bool is_nouveau_device(int fd) > > > { > > > /* Currently all nouveau-specific codepaths require libdrm */ > > > @@ -227,6 +232,7 @@ static const struct module { > > > { DRIVER_MSM, "msm" }, > > > { DRIVER_PANFROST, "panfrost" }, > > > { DRIVER_PANTHOR, "panthor" }, > > > + { DRIVER_POWERVR, "powervr" }, > > > { DRIVER_V3D, "v3d" }, > > > { DRIVER_VC4, "vc4" }, > > > { DRIVER_VGEM, "vgem" }, > > > @@ -988,6 +994,11 @@ void igt_require_amdgpu(int fd) > > > igt_require(is_amdgpu_device(fd)); > > > } > > > > > > +void igt_require_imagination(int fd) > > > +{ > > > + igt_require(is_pvr_device(fd)); > > > +} > > > + > > > void igt_require_intel(int fd) > > > { > > > igt_require(is_intel_device(fd)); > > > diff --git a/lib/drmtest.h b/lib/drmtest.h > > > index 9d488b274..012de9dee 100644 > > > --- a/lib/drmtest.h > > > +++ b/lib/drmtest.h > > > @@ -59,6 +59,7 @@ int __get_drm_device_name(int fd, char *name, int name_size); > > > #define DRIVER_VIRTIO (1 << 10) > > > #define DRIVER_PANTHOR (1 << 11) > > > #define DRIVER_ASAHI (1 << 12) > > > +#define DRIVER_POWERVR (1 << 13) > > > > > > /* > > > * Exclude DRIVER_VGEM and DRIVER_VIRTIO from DRIVER_ANY since if you run > > > @@ -137,6 +138,7 @@ int drm_prepare_filtered_multigpu(int chipset); > > > int drm_open_filtered_card(int idx); > > > > > > void igt_require_amdgpu(int fd); > > > +void igt_require_imagination(int fd); > > > void igt_require_intel(int fd); > > > void igt_require_i915(int fd); > > > void igt_require_nouveau(int fd); > > > @@ -150,6 +152,7 @@ bool is_i915_device(int fd); > > > bool is_mtk_device(int fd); > > > bool is_msm_device(int fd); > > > bool is_nouveau_device(int fd); > > > +bool is_pvr_device(int fd); > > > bool is_vc4_device(int fd); > > > bool is_xe_device(int fd); > > > bool is_intel_device(int fd); > > > diff --git a/lib/igt_pvr.c b/lib/igt_pvr.c > > > new file mode 100644 > > > index 000000000..048ccab31 > > > --- /dev/null > > > +++ b/lib/igt_pvr.c > > > @@ -0,0 +1,75 @@ > > > +// SPDX-License-Identifier: GPL-2.0 or MIT > > > +/* Copyright (c) 2026 Imagination Technologies Ltd. All Rights Reserved */ > > > + > > > +#include <limits.h> > > > +#include <stddef.h> > > > +#include <stdint.h> > > > +#include <sys/types.h> > > > + > > > +#include "igt_pvr.h" > > > + > > > > You do not need to have newlines in igt section but > > it is up to you. > > > > > +#include "drmtest.h" > > > > Move before igt_pvr.h > > > > > +#include "ioctl_wrappers.h" > > > + > > > +#include "pvr_drm.h" > > > + > > > +/** > > > + * SECTION:igt_pvr > > > + * @short_description: PowerVR support library > > > + * @title: pvr > > > + * @include: igt.h > > > + * > > > + * This library provides various auxiliary helper functions for writing PowerVR > > > + * tests. > > > + */ > > > + > > > +/** > > > + * igt_pvr_ioctl_create_bo: > > > + * @fd: The file descriptor of the DRM device. > > > + * @size: On entry, the requested size of the buffer object. On return, the > > > + * actual size of the buffer object. > > > + * > > > + * Function to create a buffer object. > > > + * > > > + * Returns: The handle of the created buffer object. > > > + */ > > > +uint32_t igt_pvr_ioctl_create_bo(int fd, size_t *size) > > > +{ > > > + struct drm_pvr_ioctl_create_bo_args arg = { > > > + .size = *size, > > > + }; > > > + > > > + do_ioctl(fd, DRM_IOCTL_PVR_CREATE_BO, &arg); > > > + > > > + igt_assert(arg.size >= *size && arg.size <= SIZE_MAX); > > > + *size = (size_t)arg.size; > > > + > > > + return arg.handle; > > > +} > > > + > > > + > > > +/** > > > + * igt_pvr_ioctl_get_bo_mmap_offset: > > > + * @fd: The file descriptor of the DRM device. > > > + * @handle: The handle of the buffer object. > > > + * > > > + * Function to get the mmap offset of a buffer object. > > > + * > > > + * Returns: The mmap offset of the buffer object. > > > + */ > > > +off_t igt_pvr_ioctl_get_bo_mmap_offset(int fd, uint32_t handle) > > > +{ > > > + struct drm_pvr_ioctl_get_bo_mmap_offset_args arg = { > > > + .handle = handle, > > > + }; > > > + > > > + do_ioctl(fd, DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET, &arg); > > > + > > > + /* > > > + * There is no OFF_MAX equivalent to SIZE_MAX; use the identical (by > > > + * definition) PTRDIFF_MAX instead. > > > + */ > > > + igt_assert(arg.offset <= PTRDIFF_MAX); > > > + > > > + return (off_t)arg.offset; > > > +} > > > diff --git a/lib/igt_pvr.h b/lib/igt_pvr.h > > > new file mode 100644 > > > index 000000000..e8b2d9026 > > > --- /dev/null > > > +++ b/lib/igt_pvr.h > > > @@ -0,0 +1,16 @@ > > > +/* SPDX-License-Identifier: GPL-2.0 or MIT */ > > > +/* Copyright (c) 2026 Imagination Technologies Ltd. All Rights Reserved */ > > > + > > > +#ifndef IGT_PVR_H > > > +#define IGT_PVR_H > > > + > > > +#include <stddef.h> > > > +#include <stdint.h> > > > +#include <sys/types.h> > > > + > > > +#include "pvr_drm.h" > > > + > > > +uint32_t igt_pvr_ioctl_create_bo(int fd, size_t *size); > > > +off_t igt_pvr_ioctl_get_bo_mmap_offset(int fd, uint32_t handle); > > > + > > > +#endif /* IGT_PVR_H */ > > > diff --git a/lib/meson.build b/lib/meson.build > > > index c45a96530..05632eede 100644 > > > --- a/lib/meson.build > > > +++ b/lib/meson.build > > > @@ -110,6 +110,7 @@ lib_sources = [ > > > 'igt_asahi.c', > > > 'igt_panfrost.c', > > > 'igt_panthor.c', > > > + 'igt_pvr.c', > > > 'igt_v3d.c', > > > 'igt_vc4.c', > > > 'igt_vmwgfx.c', > > > diff --git a/meson.build b/meson.build > > > index e09122a09..b30438e31 100644 > > > --- a/meson.build > > > +++ b/meson.build > > > @@ -289,6 +289,7 @@ asahidir = join_paths(libexecdir, 'asahi') > > > msmdir = join_paths(libexecdir, 'msm') > > > panfrostdir = join_paths(libexecdir, 'panfrost') > > > panthordir = join_paths(libexecdir, 'panthor') > > > +pvrdir = join_paths(libexecdir, 'imagination') > > > unigrafdir = join_paths(libexecdir, 'unigraf') > > > v3ddir = join_paths(libexecdir, 'v3d') > > > vc4dir = join_paths(libexecdir, 'vc4') > > > @@ -355,6 +356,12 @@ if get_option('use_rpath') > > > endforeach > > > panthor_rpathdir = join_paths(panthor_rpathdir, libdir) > > > > > > + pvrdir_rpathdir = '$ORIGIN' > > > + foreach p : pvrdir.split('/') > > > + pvrdir_rpathdir = join_paths(pvrdir_rpathdir, '..') > > > + endforeach > > > + pvrdir_rpathdir = join_paths(pvrdir_rpathdir, libdir) > > > + > > > v3d_rpathdir = '$ORIGIN' > > > foreach p : v3ddir.split('/') > > > v3d_rpathdir = join_paths(v3d_rpathdir, '..') > > > @@ -392,6 +399,7 @@ else > > > msm_rpathdir = '' > > > panfrost_rpathdir = '' > > > panthor_rpathdir = '' > > > + pvrdir_rpathdir = '' > > > v3d_rpathdir = '' > > > vc4_rpathdir = '' > > > vkms_rpathdir = '' > > > diff --git a/tests/imagination/meson.build b/tests/imagination/meson.build > > > new file mode 100644 > > > index 000000000..65b90c39f > > > --- /dev/null > > > +++ b/tests/imagination/meson.build > > > @@ -0,0 +1,13 @@ > > > +pvr_progs = [ 'pvr_gem', > > > + ] > > > + > > > +pvr_deps = test_deps > > > + > > > +foreach prog : pvr_progs > > > + test_executables += executable(prog, prog + '.c', > > > + dependencies : pvr_deps, > > > + install_dir : pvrdir, > > > + install_rpath : pvrdir_rpathdir, > > > + install : true) > > > + test_list += join_paths('pvr', prog) > > > +endforeach > > > diff --git a/tests/imagination/pvr_gem.c b/tests/imagination/pvr_gem.c > > > new file mode 100644 > > > index 000000000..273f4d56f > > > --- /dev/null > > > +++ b/tests/imagination/pvr_gem.c > > > @@ -0,0 +1,66 @@ > > > +// SPDX-License-Identifier: GPL-2.0 or MIT > > > +/* Copyright (c) 2026 Imagination Technologies Ltd. All Rights Reserved */ > > > + > > > +#include <linux/errno.h> > > > > imho errno.h should be ok. > > > > > +#include <stddef.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 valid buffer object creation"); > > > + igt_subtest("create-bo-4096") > > > + { > > > + size_t size = 4096; > > > + uint32_t handle = igt_pvr_ioctl_create_bo(fd, &size); > > > + > > > + gem_close(fd, handle); > > > + } > > > + > > > + igt_describe("Test buffer object creation with 0 size"); > > > + igt_subtest("create-bo-0") > > > + { > > > + struct drm_pvr_ioctl_create_bo_args arg = { > > > + .size = 0, > > > + }; > > > + > > > + do_ioctl_err(fd, DRM_IOCTL_PVR_CREATE_BO, &arg, EINVAL); > > > + } > > > + > > > + igt_describe("Test buffer object creation with bad padding"); > > > + igt_subtest("create-bo-bad-padding") > > > + { > > > + struct drm_pvr_ioctl_create_bo_args arg = { > > > + .size = 4096, > > > + ._padding_c = 0xbad6bad6, > > > + }; > > > + > > > + do_ioctl_err(fd, DRM_IOCTL_PVR_CREATE_BO, &arg, EINVAL); > > > + } > > > + > > > + igt_describe("Test buffer object creation with unaligned size"); > > > + igt_subtest("create-bo-unaligned-fail") > > > > Why '-fail' in name? imho without it test name also looks ok. > > It is only suggestion here, you can also keep it. > > > > With above fixed this is > > Reviewed-by: Kamil Konieczny <[email protected]> > > > > Regards, > > Kamil > > > > > + { > > > + struct drm_pvr_ioctl_create_bo_args arg = { > > > + .size = 4000, > > > + }; > > > + > > > + do_ioctl_err(fd, DRM_IOCTL_PVR_CREATE_BO, &arg, EINVAL); > > > + } > > > + > > > + igt_fixture() > > > + { > > > + drm_close_driver(fd); > > > + } > > > +} > > > diff --git a/tests/meson.build b/tests/meson.build > > > index 6d90627b9..63adc61b9 100644 > > > --- a/tests/meson.build > > > +++ b/tests/meson.build > > > @@ -561,3 +561,5 @@ if not meson.is_cross_build() > > > endif > > > > > > subdir('intel-ci') > > > + > > > +subdir('imagination') > > > > > > -- > > > 2.43.0 > > > >