[igt-dev] [PATCH i-g-t] tests/i915_query: Test new DRM_I915_QUERY_GEOMETRY_SUBSLICES query
Lucas De Marchi
lucas.demarchi at intel.com
Wed Apr 13 00:00:06 UTC 2022
On Mon, Apr 11, 2022 at 08:28:19PM -0700, Matt Roper wrote:
>Ensure we get sensible responses for both valid and invalid usage of
>this query item.
>
>Note that unlike the traditional topology query we do not try to compare
>the values returned against the old I915_PARAM ioctl. Xe_HP already
>uses a full 32-bit mask for subslices and we expect upcoming platforms
>to increase the mask size to 64 or beyond (i.e., the hardware starts
>using multiple registers to express the mask); since the old I915_PARAM
>ioctl can only return a 32-bit value it will be unable to express the
>full mask for upcoming platforms.
Are you adding a "Test-with" in a patch series to kernel?
>
>Cc: Matt Atwood <matthew.s.atwood at intel.com>
>Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
>---
> lib/i915/i915_drm_local.h | 2 ++
> tests/i915/i915_query.c | 75 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 77 insertions(+)
>
>diff --git a/lib/i915/i915_drm_local.h b/lib/i915/i915_drm_local.h
>index 9e82c9688b..9a2273c4e4 100644
>--- a/lib/i915/i915_drm_local.h
>+++ b/lib/i915/i915_drm_local.h
>@@ -21,6 +21,8 @@ extern "C" {
> */
> #define I915_ENGINE_CLASS_COMPUTE 4
>
>+#define DRM_I915_QUERY_GEOMETRY_SUBSLICES 6
>+
> #if defined(__cplusplus)
> }
> #endif
>diff --git a/tests/i915/i915_query.c b/tests/i915/i915_query.c
>index 3c791b8ba5..246a979af7 100644
>--- a/tests/i915/i915_query.c
>+++ b/tests/i915/i915_query.c
>@@ -244,6 +244,15 @@ static bool query_topology_supported(int fd)
> return __i915_query_items(fd, &item, 1) == 0 && item.length > 0;
> }
>
>+static bool query_geometry_subslices_supported(int fd)
>+{
>+ struct drm_i915_query_item item = {
>+ .query_id= DRM_I915_QUERY_GEOMETRY_SUBSLICES,
>+ };
>+
>+ return __i915_query_items(fd, &item, 1) == 0 && item.length > 0;
>+}
>+
> static void test_query_topology_unsupported(int fd)
> {
> struct drm_i915_query_item item = {
>@@ -842,6 +851,67 @@ static void engines(int fd)
> free(engines);
> }
>
>+static void test_query_geometry_subslices(int fd)
>+{
>+ const struct intel_execution_engine2 *e;
>+ struct drm_i915_query_item item = {};
>+ struct drm_i915_query_topology_info *topo_info;
>+
>+ /*
>+ * Submit an initial request with an invalid engine. Should return
>+ * -EINVAL via item.length.
>+ */
>+ item.query_id = DRM_I915_QUERY_GEOMETRY_SUBSLICES;
>+ item.flags = ~0;
>+ i915_query_items(fd, &item, 1);
>+ igt_assert_eq(item.length, -EINVAL);
>+
>+ for_each_physical_engine(fd, e) {
>+ memset(&item, 0, sizeof(item));
>+
>+ /* Obtain the necessary topology buffer size */
>+ item.query_id = DRM_I915_QUERY_GEOMETRY_SUBSLICES;
>+ item.flags = e->class | (e->instance << 16);
maybe we also need a test with inexistent class / instance?
Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
Lucas De Marchi
>+ i915_query_items(fd, &item, 1);
>+
>+ /* Non-render engines should return -EINVAL */
>+ if (e->class != I915_ENGINE_CLASS_RENDER) {
>+ igt_assert_eq(item.length, -EINVAL);
>+ continue;
>+ }
>+ igt_assert(item.length > 0);
>+
>+ /* Re-submit with a properly allocated buffer */
>+ topo_info = calloc(1, item.length);
>+ igt_assert(topo_info);
>+ item.data_ptr = to_user_pointer(topo_info);
>+ i915_query_items(fd, &item, 1);
>+
>+ igt_assert(topo_info->max_subslices > 0);
>+ igt_assert(topo_info->max_eus_per_subslice > 0);
>+
>+ igt_assert(topo_info->subslice_offset >=
>+ DIV_ROUND_UP(topo_info->max_slices, 8));
>+ igt_assert(topo_info->eu_offset >=
>+ topo_info->subslice_offset + DIV_ROUND_UP(topo_info->max_subslices, 8));
>+
>+ igt_assert(topo_info->subslice_stride >=
>+ DIV_ROUND_UP(topo_info->max_subslices, 8));
>+ igt_assert(topo_info->eu_stride >=
>+ DIV_ROUND_UP(topo_info->max_eus_per_subslice, 8));
>+
>+ /*
>+ * This query is only supported on Xe_HP and beyond, and all
>+ * such platforms don't have slices; we should just get a
>+ * hardcoded 0x1 for the slice mask.
>+ */
>+ igt_assert_eq(topo_info->max_slices, 1);
>+ igt_assert_eq(((char*)topo_info->data)[0], 0x1);
>+
>+ free(topo_info);
>+ }
>+}
>+
> igt_main
> {
> int fd = -1;
>@@ -889,6 +959,11 @@ igt_main
> test_query_topology_known_pci_ids(fd, devid);
> }
>
>+ igt_subtest("test-query-geometry-subslices") {
>+ igt_require(query_geometry_subslices_supported(fd));
>+ test_query_geometry_subslices(fd);
>+ }
>+
> igt_subtest("query-regions-garbage-items") {
> igt_require(query_regions_supported(fd));
> test_query_regions_garbage_items(fd);
>--
>2.34.1
>
More information about the igt-dev
mailing list