[Intel-gfx] [PATCH i-g-t 1/3] tests: Test the new query info uAPI
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed Nov 8 16:24:09 UTC 2017
From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Test that the new query info uAPI.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
tests/Makefile.sources | 1 +
tests/meson.build | 1 +
tests/query_info.c | 225 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 227 insertions(+)
create mode 100644 tests/query_info.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 2313c12b..aca53837 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -228,6 +228,7 @@ TESTS_progs = \
prime_self_import \
prime_udl \
prime_vgem \
+ query_info \
sw_sync \
syncobj_basic \
syncobj_wait \
diff --git a/tests/meson.build b/tests/meson.build
index c3d5372f..96b5b538 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -208,6 +208,7 @@ test_progs = [
'prime_self_import',
'prime_udl',
'prime_vgem',
+ 'query_info',
'sw_sync',
'syncobj_basic',
'syncobj_wait',
diff --git a/tests/query_info.c b/tests/query_info.c
new file mode 100644
index 00000000..642ba104
--- /dev/null
+++ b/tests/query_info.c
@@ -0,0 +1,225 @@
+/*
+ * Copyright © 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+
+IGT_TEST_DESCRIPTION("Testing the engine info uAPI.");
+
+#ifndef DRM_I915_QUERY_INFO
+#define DRM_I915_QUERY_INFO 0x39
+#define DRM_IOCTL_I915_QUERY_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_QUERY_INFO, struct local_drm_i915_query_info)
+#endif
+
+#ifndef I915_QUERY_INFO_ENGINE
+#define I915_QUERY_INFO_ENGINE 0
+#endif
+
+enum local_drm_i915_engine_class {
+ LOCAL_I915_ENGINE_CLASS_OTHER = 0,
+ LOCAL_I915_ENGINE_CLASS_RENDER = 1,
+ LOCAL_I915_ENGINE_CLASS_COPY = 2,
+ LOCAL_I915_ENGINE_CLASS_VIDEO = 3,
+ LOCAL_I915_ENGINE_CLASS_VIDEO_ENHANCE = 4,
+ I915_ENGINE_CLASS_MAX /* non-ABI */
+};
+
+struct local_drm_i915_engine_info {
+ /** Engine instance number. */
+ __u8 instance;
+
+ /** Engine specific info. */
+#define I915_VCS_HAS_HEVC BIT(0)
+ __u8 info;
+
+ __u8 rsvd[6];
+};
+
+struct local_drm_i915_query_info {
+ /* in/out: Protocol version requested/supported. When set to 0, the
+ * kernel set this field to the current supported version. EINVAL will
+ * be return if version is greater than what the kernel supports.
+ */
+ __u32 version;
+
+ /* in: Query to perform on the engine (use one of
+ * I915_QUERY_INFO_* define).
+ */
+ __u32 query;
+
+ /** in: Parameters associated with the query (refer to each
+ * I915_QUERY_INFO_* define)
+ */
+ __u32 query_params[3];
+
+ /* in/out: Size of the data to be copied into info_ptr. When set to 0,
+ * the kernel set this field to the size to be copied into info_ptr.
+ * Call this one more time with the correct value set to make the
+ * kernel copy the data into info_ptr.
+ */
+ __u32 info_ptr_len;
+
+ /** in/out: Pointer to the data filled for the query (pointer set by
+ * the caller, data written by the callee).
+ */
+ __u64 info_ptr;
+};
+
+static bool query_info_supports(int fd, int version)
+{
+ struct local_drm_i915_query_info info = {};
+
+ if (igt_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info))
+ return false;
+
+ return info.version >= version;
+}
+
+static void test_query_version(int fd)
+{
+ struct local_drm_i915_query_info info = {};
+
+ info.version = 0;
+ do_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info);
+ igt_assert_lte(1, info.version);
+
+ info.version++;
+ do_ioctl_err(fd, DRM_IOCTL_I915_QUERY_INFO, &info, EINVAL);
+}
+
+static void test_query_garbage(int fd)
+{
+ struct local_drm_i915_query_info info;
+
+ memset(&info, 0, sizeof(info));
+ info.version = 1;
+ info.query = 0xffffffff;
+ do_ioctl_err(fd, DRM_IOCTL_I915_QUERY_INFO, &info, EINVAL);
+
+ memset(&info, 0, sizeof(info));
+ info.version = 1;
+ info.query = I915_QUERY_INFO_ENGINE;
+ do_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info);
+
+ info.info_ptr_len += 42;
+ do_ioctl_err(fd, DRM_IOCTL_I915_QUERY_INFO, &info, EINVAL);
+}
+
+static void test_query_null_array(int fd)
+{
+ struct local_drm_i915_query_info info = {};
+
+ info.version = 1;
+ info.query = I915_QUERY_INFO_ENGINE;
+ do_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info);
+
+ info.info_ptr = 0;
+ do_ioctl_err(fd, DRM_IOCTL_I915_QUERY_INFO, &info, EFAULT);
+}
+
+static unsigned int legacy_count_engines(int fd)
+{
+ unsigned int total = 0;
+ const struct intel_execution_engine *e;
+
+ for (e = intel_execution_engines; e->name; e++) {
+ if (e->exec_id == 0)
+ continue;
+
+ if (!gem_has_ring(fd, e->exec_id | e->flags))
+ continue;
+
+ if (e->exec_id == I915_EXEC_BSD) {
+ int is_bsd2 = e->flags != 0;
+ if (gem_has_bsd2(fd) != is_bsd2)
+ continue;
+ }
+
+ total++;
+ }
+
+ return total;
+}
+
+static void test_query_engine_classes(int fd)
+{
+ unsigned int legacy_num_engines = legacy_count_engines(fd);
+ unsigned int num_engines = 0;
+ enum local_drm_i915_engine_class class;
+
+ for (class = 0; class < I915_ENGINE_CLASS_MAX; class++) {
+ struct local_drm_i915_query_info info;
+ struct local_drm_i915_engine_info *engines;
+ unsigned i, j, num_class_engines;
+
+ memset(&info, 0, sizeof(info));
+ info.version = 1;
+ info.query = I915_QUERY_INFO_ENGINE;
+ info.query_params[0] = class;
+
+ do_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info);
+
+ num_class_engines = info.info_ptr_len / sizeof(struct local_drm_i915_engine_info);
+
+ engines = calloc(num_class_engines, sizeof(struct local_drm_i915_engine_info));
+ info.info_ptr = to_user_pointer(engines);
+ do_ioctl(fd, DRM_IOCTL_I915_QUERY_INFO, &info);
+
+ for (i = 0; i < info.info_ptr_len / sizeof(struct local_drm_i915_engine_info); i++) {
+ for (j = 0; j < ARRAY_SIZE(engines[0].rsvd); j++)
+ igt_assert_eq(engines[i].rsvd[j], 0);
+ }
+ free(engines);
+
+ num_engines += num_class_engines;
+ }
+
+ igt_debug("num_engines=%u/%u\n", num_engines, legacy_num_engines);
+
+ igt_assert_eq(num_engines, legacy_num_engines);
+}
+
+igt_main
+{
+ int fd = -1;
+
+ igt_fixture {
+ fd = drm_open_driver(DRIVER_INTEL);
+ igt_require(query_info_supports(fd, 1 /* version */));
+ }
+
+ igt_subtest("query-version")
+ test_query_version(fd);
+
+ igt_subtest("query-garbage")
+ test_query_garbage(fd);
+
+ igt_subtest("query-null-array")
+ test_query_null_array(fd);
+
+ igt_subtest("query-engine-classes")
+ test_query_engine_classes(fd);
+
+ igt_fixture {
+ close(fd);
+ }
+}
--
2.15.0
More information about the Intel-gfx
mailing list