From: Boris Brezillon <boris.brezillon@collabora.com>
To: Daniel Almeida <daniel.almeida@collabora.com>
Cc: adrinael@adrinael.net, arek@hiler.eu,
kamil.konieczny@linux.intel.com, juhapekka.heikkila@gmail.com,
bhanuprakash.modem@gmail.com, ashutosh.dixit@intel.com,
karthik.b.s@intel.com, liviu.dudau@arm.com, steven.price@arm.com,
aliceryhl@google.com, jeffv@google.com,
intel-gfx@lists.freedesktop.org, igt-dev@lists.freedesktop.org,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH i-g-t v3 2/3] panthor: add initial infrastructure
Date: Thu, 6 Nov 2025 10:25:18 +0100 [thread overview]
Message-ID: <20251106102518.3252b745@fedora> (raw)
In-Reply-To: <20251104202845.2879460-3-daniel.almeida@collabora.com>
On Tue, 4 Nov 2025 17:28:42 -0300
Daniel Almeida <daniel.almeida@collabora.com> wrote:
> Add the necessary code needed to compile panthor tests as well as the
> basic infrastructure that will be used by the Panthor tests themselves.
>
> To make sure everything is in order, add a basic test in
> panthor_query.c.
>
> Acked-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> ---
> lib/igt_panthor.c | 41 ++++++++
> lib/igt_panthor.h | 193 ++++++++++++++++++++++++++++++++++
> lib/meson.build | 1 +
> meson.build | 8 ++
> tests/meson.build | 2 +
> tests/panthor/meson.build | 12 +++
> tests/panthor/panthor_query.c | 29 +++++
> 7 files changed, 286 insertions(+)
> create mode 100644 lib/igt_panthor.c
> create mode 100644 lib/igt_panthor.h
> create mode 100644 tests/panthor/meson.build
> create mode 100644 tests/panthor/panthor_query.c
>
> diff --git a/lib/igt_panthor.c b/lib/igt_panthor.c
> new file mode 100644
> index 000000000..0b690f796
> --- /dev/null
> +++ b/lib/igt_panthor.c
> @@ -0,0 +1,41 @@
> +// SPDX-License-Identifier: MIT
> +// SPDX-FileCopyrightText: Copyright (C) 2025 Collabora Ltd.
> +
> +#include "drmtest.h"
> +#include "igt_panthor.h"
> +#include "ioctl_wrappers.h"
> +#include "panthor_drm.h"
> +
> +/**
> + * SECTION:igt_panthor
> + * @short_description: Panthor support library
> + * @title: Panthor
> + * @include: igt.h
> + *
> + * This library provides various auxiliary helper functions for writing Panthor
> + * tests.
> + */
> +
> +/**
> + * igt_panthor_query:
> + * @fd: device file descriptor
> + * @type: query type (e.g., DRM_PANTHOR_DEV_QUERY_GPU_INFO)
> + * @data: pointer to a struct to store the query result
> + * @size: size of the result struct
> + * @err: expected error code, or 0 for success
> + *
> + * Query GPU information.
> + */
> +void igt_panthor_query(int fd, int32_t type, void *data, size_t size, int err)
> +{
> + struct drm_panthor_dev_query query = {
> + .type = type,
> + .pointer = (uintptr_t)data,
> + .size = size,
> + };
> +
> + if (err)
> + do_ioctl_err(fd, DRM_IOCTL_PANTHOR_DEV_QUERY, &query, err);
> + else
> + do_ioctl(fd, DRM_IOCTL_PANTHOR_DEV_QUERY, &query);
> +}
> diff --git a/lib/igt_panthor.h b/lib/igt_panthor.h
> new file mode 100644
> index 000000000..6f94b8f79
> --- /dev/null
> +++ b/lib/igt_panthor.h
> @@ -0,0 +1,193 @@
> +/* SPDX-License-Identifier: MIT */
> +/* SPDX-FileCopyrightText: Copyright (C) 2025 Collabora Ltd. */
> +
> +#ifndef IGT_PANTHOR_H
> +#define IGT_PANTHOR_H
> +
> +#include <stddef.h>
> +#include <stdint.h>
> +#include <stdbool.h>
> +
> +void igt_panthor_query(int fd, int32_t type, void *data, size_t size, int err);
> +
> +enum cs_opcode {
> + CS_OPCODE_NOP = 0,
> + CS_OPCODE_MOVE48 = 1,
> + CS_OPCODE_MOVE32 = 2,
> + CS_OPCODE_WAIT = 3,
> + CS_OPCODE_STM = 21,
> + CS_OPCODE_FLUSH_CACHE = 36,
> +};
> +
> +enum cs_flush_mode {
> + CS_FLUSH_MODE_NONE = 0,
> + CS_FLUSH_MODE_CLEAN = 1,
> + CS_FLUSH_MODE_INVALIDATE = 2,
> + CS_FLUSH_MODE_CLEAN_AND_INVALIDATE = 3,
> +};
> +
> +/* There's no plan to support big endian in the UMD, so keep
> + * things simple and don't bother supporting it here either.
> + */
> +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> +#error "big endian not supported"
> +#endif
> +
> +struct cs_instr {
> + union {
> + struct {
> + uint64_t data: 56;
> + uint64_t opcode: 8;
> + } any;
> + struct {
> + uint64_t unused: 56;
> + uint64_t opcode: 8;
> + } nop;
> + struct {
> + uint64_t immediate: 48;
> + uint64_t dest: 8;
> + uint64_t opcode: 8;
> + } move48;
> + struct {
> + uint64_t immediate: 32;
> + uint64_t unused: 16;
> + uint64_t dest: 8;
> + uint64_t opcode: 8;
> + } move32;
> + struct {
> + uint64_t unused0: 16;
> + uint64_t wait_mask: 16;
> + uint64_t progress_inc: 1;
> + uint64_t unused1: 23;
> + uint64_t opcode: 8;
> + } wait;
> + struct {
> + uint64_t offset: 16;
> + uint64_t mask: 16;
> + uint64_t unused: 8;
> + uint64_t address: 8;
> + uint64_t src: 8;
> + uint64_t opcode: 8;
> + } stm;
> + struct {
> + uint64_t l2_mode: 4;
> + uint64_t lsc_mode: 4;
> + uint64_t other_mode: 4;
> + uint64_t unused0: 4;
> + uint64_t wait_mask: 16;
> + uint64_t unused1: 8;
> + uint64_t flush_id: 8;
> + uint64_t signal_slot: 4;
> + uint64_t unused2: 4;
> + uint64_t opcode: 8;
> + } flush;
> + uint64_t raw;
> + };
> +};
> +
> +static inline uint64_t
> +cs_nop(void)
> +{
> + struct cs_instr instr = {
> + .nop = {
> + .opcode = CS_OPCODE_NOP,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +static inline uint64_t
> +cs_mov48(uint8_t dst, uint64_t imm)
> +{
> + struct cs_instr instr = {
> + .move48 = {
> + .opcode = CS_OPCODE_MOVE48,
> + .dest = dst,
> + .immediate = (uint64_t)imm & 0xffffffffffffull,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +static inline uint64_t
> +cs_mov32(uint8_t dst, uint32_t imm)
> +{
> + struct cs_instr instr = {
> + .move32 = {
> + .opcode = CS_OPCODE_MOVE32,
> + .dest = dst,
> + .immediate = (uint32_t)imm,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +static inline uint64_t
> +cs_wait(uint16_t wait_mask, bool progress_inc)
> +{
> + struct cs_instr instr = {
> + .wait = {
> + .opcode = CS_OPCODE_WAIT,
> + .wait_mask = wait_mask,
> + .progress_inc = progress_inc,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +static inline uint64_t
> +cs_stm(uint8_t address, uint8_t src, uint16_t mask, int16_t offset)
> +{
> + struct cs_instr instr = {
> + .stm = {
> + .opcode = CS_OPCODE_STM,
> + .offset = (uint16_t)offset,
> + .mask = mask,
> + .src = src,
> + .address = address,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +static inline uint64_t
> +cs_stm32(uint8_t address, uint8_t src, int16_t offset)
> +{
> + return cs_stm(address, src, 0x1, offset);
> +}
> +
> +static inline uint64_t
> +cs_stm64(uint8_t address, uint8_t src, int16_t offset)
> +{
> + return cs_stm(address, src, 0x3, offset);
> +}
> +
> +static inline uint64_t
> +cs_flush(enum cs_flush_mode l2_mode,
> + enum cs_flush_mode lsc_mode,
> + enum cs_flush_mode other_mode,
> + uint16_t wait_mask,
> + uint8_t flush_id,
> + uint8_t signal_slot)
> +{
> + struct cs_instr instr = {
> + .flush = {
> + .l2_mode = l2_mode,
> + .lsc_mode = lsc_mode,
> + .other_mode = other_mode,
> + .wait_mask = wait_mask,
> + .flush_id = flush_id,
> + .signal_slot = signal_slot,
> + .opcode = CS_OPCODE_FLUSH_CACHE,
> + },
> + };
> +
> + return instr.raw;
> +}
> +
> +#endif /* IGT_PANTHOR_H */
> diff --git a/lib/meson.build b/lib/meson.build
> index 725a46e98..707ce6ff9 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -106,6 +106,7 @@ lib_sources = [
> 'igt_kmod.c',
> 'igt_ktap.c',
> 'igt_panfrost.c',
> + 'igt_panthor.c',
> 'igt_v3d.c',
> 'igt_vc4.c',
> 'igt_vmwgfx.c',
> diff --git a/meson.build b/meson.build
> index db6e09a94..bfcffbb9a 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -288,6 +288,7 @@ libexecdir = join_paths(get_option('libexecdir'), 'igt-gpu-tools')
> amdgpudir = join_paths(libexecdir, 'amdgpu')
> msmdir = join_paths(libexecdir, 'msm')
> panfrostdir = join_paths(libexecdir, 'panfrost')
> +panthordir = join_paths(libexecdir, 'panthor')
> v3ddir = join_paths(libexecdir, 'v3d')
> vc4dir = join_paths(libexecdir, 'vc4')
> vkmsdir = join_paths(libexecdir, 'vkms')
> @@ -341,6 +342,12 @@ if get_option('use_rpath')
> endforeach
> panfrost_rpathdir = join_paths(panfrost_rpathdir, libdir)
>
> + panthor_rpathdir = '$ORIGIN'
> + foreach p : panthordir.split('/')
> + panthor_rpathdir = join_paths(panthor_rpathdir, '..')
> + endforeach
> + panthor_rpathdir = join_paths(panthor_rpathdir, libdir)
> +
> v3d_rpathdir = '$ORIGIN'
> foreach p : v3ddir.split('/')
> v3d_rpathdir = join_paths(v3d_rpathdir, '..')
> @@ -370,6 +377,7 @@ else
> amdgpudir_rpathdir = ''
> msm_rpathdir = ''
> panfrost_rpathdir = ''
> + panthor_rpathdir = ''
> v3d_rpathdir = ''
> vc4_rpathdir = ''
> vkms_rpathdir = ''
> diff --git a/tests/meson.build b/tests/meson.build
> index f2267bc09..e1fdac2cf 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -490,6 +490,8 @@ subdir('msm')
>
> subdir('panfrost')
>
> +subdir('panthor')
> +
> subdir('v3d')
>
> subdir('vc4')
> diff --git a/tests/panthor/meson.build b/tests/panthor/meson.build
> new file mode 100644
> index 000000000..ce13aebaa
> --- /dev/null
> +++ b/tests/panthor/meson.build
> @@ -0,0 +1,12 @@
> +panthor_progs = [
> + 'panthor_query'
> +]
> +
> +foreach prog : panthor_progs
> + test_executables += executable(prog, prog + '.c',
> + dependencies : test_deps,
> + install_dir : panthordir,
> + install_rpath : panthor_rpathdir,
> + install : true)
> + test_list += join_paths('panthor', prog)
> +endforeach
> diff --git a/tests/panthor/panthor_query.c b/tests/panthor/panthor_query.c
> new file mode 100644
> index 000000000..81c2ebd23
> --- /dev/null
> +++ b/tests/panthor/panthor_query.c
> @@ -0,0 +1,29 @@
> +// SPDX-License-Identifier: MIT
> +// SPDX-FileCopyrightText: Copyright (C) 2025 Collabora Ltd.
> +
> +#include "igt.h"
> +#include "igt_core.h"
> +#include "igt_panthor.h"
> +#include "panthor_drm.h"
> +#include <stdint.h>
> +
> +igt_main {
> + int fd;
> +
> + igt_fixture {
> + fd = drm_open_driver(DRIVER_PANTHOR);
> + }
> +
> + igt_describe("Query GPU information from ROM.");
> + igt_subtest("query") {
> + struct drm_panthor_gpu_info gpu = {};
> +
> + igt_panthor_query(fd, DRM_PANTHOR_DEV_QUERY_GPU_INFO, &gpu, sizeof(gpu), 0);
> +
> + igt_assert_neq(gpu.gpu_id, 0);
> + }
> +
> + igt_fixture {
> + drm_close_driver(fd);
> + }
> +}
next prev parent reply other threads:[~2025-11-06 9:25 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 20:28 [PATCH i-g-t v3 0/3] Add initial Panthor tests Daniel Almeida
2025-11-04 20:28 ` [PATCH i-g-t v3 1/3] lib: add support for opening Panthor devices Daniel Almeida
2025-11-06 9:24 ` Boris Brezillon
2025-11-04 20:28 ` [PATCH i-g-t v3 2/3] panthor: add initial infrastructure Daniel Almeida
2025-11-06 9:25 ` Boris Brezillon [this message]
2025-11-04 20:28 ` [PATCH i-g-t v3 3/3] tests/panthor: add panthor tests Daniel Almeida
2025-11-04 21:04 ` Boris Brezillon
2025-11-06 11:13 ` Daniel Almeida
2025-11-06 14:03 ` Pawel Sikora
2025-11-06 9:26 ` Boris Brezillon
2025-11-06 17:10 ` Kamil Konieczny
2025-11-05 22:08 ` ✗ i915.CI.BAT: failure for Add initial Panthor tests (rev3) Patchwork
2025-11-05 22:51 ` ✓ Xe.CI.BAT: success " Patchwork
2025-11-06 9:29 ` [PATCH i-g-t v3 0/3] Add initial Panthor tests Boris Brezillon
2025-11-06 10:40 ` ✗ Xe.CI.Full: failure for Add initial Panthor tests (rev3) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251106102518.3252b745@fedora \
--to=boris.brezillon@collabora.com \
--cc=adrinael@adrinael.net \
--cc=aliceryhl@google.com \
--cc=arek@hiler.eu \
--cc=ashutosh.dixit@intel.com \
--cc=bhanuprakash.modem@gmail.com \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=igt-dev@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jeffv@google.com \
--cc=juhapekka.heikkila@gmail.com \
--cc=kamil.konieczny@linux.intel.com \
--cc=karthik.b.s@intel.com \
--cc=liviu.dudau@arm.com \
--cc=steven.price@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.