Test that the call succeeds, to subsequent calls do not produce the same
timestamps and invalid flag values are rejected.

Signed-off-by: Janne Grunau <[email protected]>
---
 lib/igt_asahi.c              | 14 ++++++++++
 lib/igt_asahi.h              |  3 +++
 tests/asahi/asahi_get_time.c | 63 ++++++++++++++++++++++++++++++++++++++++++++
 tests/asahi/meson.build      |  1 +
 4 files changed, 81 insertions(+)

diff --git a/lib/igt_asahi.c b/lib/igt_asahi.c
index 
90d2c190f0dd05e372af0eefaed22d2b2a26eb71..17ac60749a3a5b03722403386f8b16cc0caeff3c
 100644
--- a/lib/igt_asahi.c
+++ b/lib/igt_asahi.c
@@ -42,3 +42,17 @@ void igt_asahi_get_params(int fd, uint32_t param_group, void 
*params, size_t siz
        else
                do_ioctl(fd, DRM_IOCTL_ASAHI_GET_PARAMS, &get_params);
 }
+
+/**
+ * igt_asahi_get_time:
+ * @fd: device file descriptor
+ * @get_time: pointer to drm_asahi_get_time struct
+ * @err: expected error code, 0 for success
+ */
+void igt_asahi_get_time(int fd, struct drm_asahi_get_time *get_time, int err)
+{
+       if (err)
+               do_ioctl_err(fd, DRM_IOCTL_ASAHI_GET_TIME, get_time, err);
+       else
+               do_ioctl(fd, DRM_IOCTL_ASAHI_GET_TIME, get_time);
+}
diff --git a/lib/igt_asahi.h b/lib/igt_asahi.h
index 
f0ac3fbf428a8050957eab0e9b259f68b5ecd0cd..a15acc5a08092fae0b3a569c527087082e6fc05c
 100644
--- a/lib/igt_asahi.h
+++ b/lib/igt_asahi.h
@@ -7,6 +7,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include "asahi_drm.h"
+
 void igt_asahi_get_params(int fd, uint32_t param_group, void *data, size_t 
size, int err);
+void igt_asahi_get_time(int fd, struct drm_asahi_get_time *get_time, int err);
 
 #endif /* ASAHI_IOCTL_H */
diff --git a/tests/asahi/asahi_get_time.c b/tests/asahi/asahi_get_time.c
new file mode 100644
index 
0000000000000000000000000000000000000000..91c865d0f8c65b410771b491758a81b4d4a96044
--- /dev/null
+++ b/tests/asahi/asahi_get_time.c
@@ -0,0 +1,63 @@
+// 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 GPU device time.");
+       igt_subtest("get-time") {
+               struct drm_asahi_get_time time = {};
+
+               igt_asahi_get_time(fd, &time, 0);
+               // Nothing to assert on, the timestamp could have any value
+       }
+
+       igt_describe("Query GPU device time twice and compare timestamps.");
+       igt_subtest("get-time-compare") {
+               struct drm_asahi_get_time time1 = {};
+               struct drm_asahi_get_time time2 = {};
+
+               igt_asahi_get_time(fd, &time1, 0);
+
+               // sleep for 100 micro seconds to ensure
+               usleep(100);
+
+               igt_asahi_get_time(fd, &time2, 0);
+
+               // assert that the timestamps are different
+               igt_assert(time1.gpu_timestamp != time2.gpu_timestamp);
+       }
+
+       igt_describe("Query GPU device time with invalid flags values.");
+       igt_subtest_group() {
+               struct drm_asahi_get_time time = {};
+
+               igt_subtest("get-time-flags-1") {
+                       time.flags = 1;
+                       igt_asahi_get_time(fd, &time, EINVAL);
+               }
+               igt_subtest("get-time-flags-2") {
+                       time.flags = 2;
+                       igt_asahi_get_time(fd, &time, EINVAL);
+               }
+               igt_subtest("get-time-flags-uint64-max") {
+                       time.flags = UINT64_MAX;
+                       igt_asahi_get_time(fd, &time, EINVAL);
+               }
+       }
+
+       igt_fixture() {
+               drm_close_driver(fd);
+       }
+}
diff --git a/tests/asahi/meson.build b/tests/asahi/meson.build
index 
909e146295e83f558ef7378f814ded55adaafe2b..2997017924f72443a7b5ad907c52a9976f464810
 100644
--- a/tests/asahi/meson.build
+++ b/tests/asahi/meson.build
@@ -1,5 +1,6 @@
 asahi_progs = [
        'asahi_get_params',
+       'asahi_get_time',
 ]
 
 foreach prog : asahi_progs

-- 
2.52.0

Reply via email to