Asahi is DRM render-only driver for Apple AGX GPUs found in Apple
silicon SoCs starting with the Apple M1 family.
Add a define for the driver, build system support and a helper function
for DRM_IOCTL_ASAHI_GET_PARAMS. To ensure everything works add an
initial test for DRM_IOCTL_ASAHI_GET_PARAMS.
Further tests are expected to require some of the queried parameters.

Signed-off-by: Janne Grunau <[email protected]>
---
 lib/drmtest.c                  |  1 +
 lib/drmtest.h                  |  1 +
 lib/igt_asahi.c                | 44 +++++++++++++++++++++++++++++++++
 lib/igt_asahi.h                | 12 +++++++++
 lib/meson.build                |  1 +
 meson.build                    |  8 ++++++
 tests/asahi/asahi_get_params.c | 55 ++++++++++++++++++++++++++++++++++++++++++
 tests/asahi/meson.build        | 13 ++++++++++
 tests/meson.build              |  2 ++
 9 files changed, 137 insertions(+)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 
4a788ea7a59cfd2878d0586b1d7ed9ad0de14a14..dc3fe330bf57693fa4f157cf9076e995e64639cb
 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -222,6 +222,7 @@ static const struct module {
        void (*modprobe)(const char *name);
 } modules[] = {
        { DRIVER_AMDGPU, "amdgpu" },
+       { DRIVER_ASAHI, "asahi" },
        { DRIVER_INTEL, "i915", modprobe_i915 },
        { DRIVER_MSM, "msm" },
        { DRIVER_PANFROST, "panfrost" },
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 
37874d729bb89577f61875728bd0d6d2a6458756..74cff27ffd3deba4b7664b4f37fbd59143e04f3e
 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -58,6 +58,7 @@ int __get_drm_device_name(int fd, char *name, int name_size);
 #define DRIVER_VKMS    (1 << 9)
 #define DRIVER_VIRTIO  (1 << 10)
 #define DRIVER_PANTHOR (1 << 11)
+#define DRIVER_ASAHI   (1 << 12)
 
 /*
  * Exclude DRIVER_VGEM and DRIVER_VIRTIO from DRIVER_ANY since if you run
diff --git a/lib/igt_asahi.c b/lib/igt_asahi.c
new file mode 100644
index 
0000000000000000000000000000000000000000..90d2c190f0dd05e372af0eefaed22d2b2a26eb71
--- /dev/null
+++ b/lib/igt_asahi.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: MIT
+// SPDX-FileCopyrightText: Copyright (C) 2025 Collabora Ltd.
+// SPDX-FileCopyrightText: Copyright (C) 2025 Asahi Linux contributors
+/*
+ * Based on igt_panthor.c
+ */
+
+#include "drmtest.h"
+#include "igt_asahi.h"
+#include "ioctl_wrappers.h"
+#include "asahi_drm.h"
+
+#include <stdint.h>
+
+/**
+ * SECTION:igt_asahi
+ * @short_description: asahi support library
+ * @title: Asahi
+ * @include: igt.h
+ *
+ * This Library provides auxiliary helper functions for writing asahi tests.
+ */
+
+/**
+ * igt_asahi_get_params:
+ * @fd: device file descriptor
+ * @param_group: which params to query parameters for
+ * @params: pointer to the struct to store the parameters in
+ * @size: size of the params buffer
+ * @err: expected error code, 0 for success
+ */
+void igt_asahi_get_params(int fd, uint32_t param_group, void *params, size_t 
size, int err)
+{
+       struct drm_asahi_get_params get_params = {
+               .param_group = param_group,
+               .pointer = (uintptr_t)params,
+               .size = size,
+       };
+
+       if (err)
+               do_ioctl_err(fd, DRM_IOCTL_ASAHI_GET_PARAMS, &get_params, err);
+       else
+               do_ioctl(fd, DRM_IOCTL_ASAHI_GET_PARAMS, &get_params);
+}
diff --git a/lib/igt_asahi.h b/lib/igt_asahi.h
new file mode 100644
index 
0000000000000000000000000000000000000000..f0ac3fbf428a8050957eab0e9b259f68b5ecd0cd
--- /dev/null
+++ b/lib/igt_asahi.h
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: MIT
+// SPDX-FileCopyrightText: Copyright (C) 2025 Asahi Linux contributors
+
+#ifndef ASAHI_IOCTL_H
+#define ASAHI_IOCTL_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+void igt_asahi_get_params(int fd, uint32_t param_group, void *data, size_t 
size, int err);
+
+#endif /* ASAHI_IOCTL_H */
diff --git a/lib/meson.build b/lib/meson.build
index 
d0487fb3ca79faa40640579ce78efd434eb38f86..73e07ea677ebbffa9722de7c28b6c94bc2a53ee0
 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -105,6 +105,7 @@ lib_sources = [
        'uwildmat/uwildmat.c',
        'igt_kmod.c',
        'igt_ktap.c',
+       'igt_asahi.c',
        'igt_panfrost.c',
        'igt_panthor.c',
        'igt_v3d.c',
diff --git a/meson.build b/meson.build
index 
4b2496c01679852c05c575ab4589192b15da149c..1b16a60281e6202b99affbf43d1ab4e098ea6860
 100644
--- a/meson.build
+++ b/meson.build
@@ -286,6 +286,7 @@ includedir = get_option('includedir')
 libdir = get_option('libdir')
 libexecdir = join_paths(get_option('libexecdir'), 'igt-gpu-tools')
 amdgpudir = join_paths(libexecdir, 'amdgpu')
+asahidir = join_paths(libexecdir, 'asahi')
 msmdir = join_paths(libexecdir, 'msm')
 panfrostdir = join_paths(libexecdir, 'panfrost')
 panthordir = join_paths(libexecdir, 'panthor')
@@ -330,6 +331,12 @@ if get_option('use_rpath')
        endforeach
        amdgpudir_rpathdir = join_paths(amdgpudir_rpathdir, libdir)
 
+       asahi_rpathdir = '$ORIGIN'
+       foreach p : asahidir.split('/')
+               asahi_rpathdir = join_paths(asahi_rpathdir, '..')
+       endforeach
+       asahi_rpathdir = join_paths(asahi_rpathdir, libdir)
+
        msm_rpathdir = '$ORIGIN'
        foreach p : msmdir.split('/')
                msm_rpathdir = join_paths(msm_rpathdir, '..')
@@ -375,6 +382,7 @@ else
        bindir_rpathdir = ''
        libexecdir_rpathdir = ''
        amdgpudir_rpathdir = ''
+       asahi_rpathdir = ''
        msm_rpathdir = ''
        panfrost_rpathdir = ''
        panthor_rpathdir = ''
diff --git a/tests/asahi/asahi_get_params.c b/tests/asahi/asahi_get_params.c
new file mode 100644
index 
0000000000000000000000000000000000000000..43482a00418f854cba2417f8f8eb5c6a04e19385
--- /dev/null
+++ b/tests/asahi/asahi_get_params.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MIT
+// SPDX-FileCopyrightText: Copyright (C) Asahi Linux contributors
+
+#include "igt.h"
+#include "igt_core.h"
+#include "igt_asahi.h"
+#include "asahi_drm.h"
+#include <stdint.h>
+
+int igt_main()
+{
+       int fd;
+
+       igt_fixture() {
+               fd = drm_open_driver_render(DRIVER_ASAHI);
+       }
+
+       igt_describe("Query global GPU parameters from device.");
+       igt_subtest("get-params") {
+               struct drm_asahi_params_global globals = {};
+
+               igt_asahi_get_params(fd, 0, &globals, sizeof(globals), 0);
+
+               // Supported GPU generations start with G13G
+               igt_assert(globals.gpu_generation >= 13);
+               // chip id is expected to be non zero
+               igt_assert(globals.chip_id != 0);
+               // VM should contain some space
+               igt_assert(globals.vm_end > globals.vm_start);
+               // the driver is expected to request some space for the
+               // kernel in a VM
+               igt_assert(globals.vm_kernel_min_size > 0);
+               // the frequency of the clock used to generate timestamps
+               igt_assert(globals.command_timestamp_frequency_hz > 0);
+       }
+
+       igt_describe("Query global GPU parameters for invalid param_groups.");
+       igt_subtest_group() {
+               struct drm_asahi_params_global globals = {};
+
+               igt_subtest("get-params-1") {
+                       igt_asahi_get_params(fd, 1, &globals, sizeof(globals), 
EINVAL);
+               }
+               igt_subtest("get-params-2") {
+                       igt_asahi_get_params(fd, 2, &globals, sizeof(globals), 
EINVAL);
+               }
+               igt_subtest("get-params-uint32-max") {
+                       igt_asahi_get_params(fd, UINT32_MAX, &globals, 
sizeof(globals), EINVAL);
+               }
+       }
+
+       igt_fixture() {
+               drm_close_driver(fd);
+       }
+}
diff --git a/tests/asahi/meson.build b/tests/asahi/meson.build
new file mode 100644
index 
0000000000000000000000000000000000000000..909e146295e83f558ef7378f814ded55adaafe2b
--- /dev/null
+++ b/tests/asahi/meson.build
@@ -0,0 +1,13 @@
+asahi_progs = [
+       'asahi_get_params',
+]
+
+foreach prog : asahi_progs
+       test_executables += executable(prog,
+                                      prog + '.c',
+                                      dependencies : test_deps,
+                                      install_dir : asahidir,
+                                      install_rpath : asahi_rpathdir,
+                                      install : true)
+       test_list += join_paths('asahi', prog)
+endforeach
diff --git a/tests/meson.build b/tests/meson.build
index 
169340d7d0937020f04b1720d5570619ce0d3591..ba69c56e7f872cb0050f6508d91318e000be6e97
 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -491,6 +491,8 @@ endif
 
 subdir('amdgpu')
 
+subdir('asahi')
+
 subdir('msm')
 
 subdir('panfrost')

-- 
2.52.0

Reply via email to