* [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test
@ 2026-04-01 8:58 Jeevan B
2026-04-01 8:58 ` [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers Jeevan B
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Jeevan B @ 2026-04-01 8:58 UTC (permalink / raw)
To: igt-dev; +Cc: uma.shankar, Jeevan B
This series adds a new helper for querying driver-supported format
modifiers and a temporary test to verify that the helper outputs the
expected modifier list.
Jeevan B (2):
lib: Add modifier helper for querying driver-supported modifiers
DONT_MERGE: Add kms_modifier_list test to verify new modifier helper
lib/igt_modifier.c | 310 ++++++++++++++++++++++++++++++++++++++
lib/igt_modifier.h | 35 +++++
lib/meson.build | 1 +
tests/kms_modifier_list.c | 144 ++++++++++++++++++
tests/meson.build | 1 +
5 files changed, 491 insertions(+)
create mode 100644 lib/igt_modifier.c
create mode 100644 lib/igt_modifier.h
create mode 100644 tests/kms_modifier_list.c
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
@ 2026-04-01 8:58 ` Jeevan B
2026-04-01 10:14 ` Jani Nikula
2026-04-01 8:58 ` [PATCH i-g-t 2/2] DONT_MERGE: Add kms_modifier_list test to verify new modifier helper Jeevan B
` (3 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Jeevan B @ 2026-04-01 8:58 UTC (permalink / raw)
To: igt-dev; +Cc: uma.shankar, Jeevan B
Introduce a new helper library that collects DRM format modifiers
reported by KMS planes via the IN_FORMATS property. Two functions are
added:
- igt_get_all_supported_modifiers()
- igt_get_basic_tiling_modifiers()
These helpers return unique modifier lists for a given format and will
be used by modifier-related tests.
Signed-off-by: Jeevan B <jeevan.b@intel.com>
---
lib/igt_modifier.c | 310 +++++++++++++++++++++++++++++++++++++++++++++
lib/igt_modifier.h | 35 +++++
lib/meson.build | 1 +
3 files changed, 346 insertions(+)
create mode 100644 lib/igt_modifier.c
create mode 100644 lib/igt_modifier.h
diff --git a/lib/igt_modifier.c b/lib/igt_modifier.c
new file mode 100644
index 000000000..561afb346
--- /dev/null
+++ b/lib/igt_modifier.c
@@ -0,0 +1,310 @@
+/*
+ * Copyright © 2026 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.
+ */
+
+/**
+ * SECTION:igt_modifier
+ * @short_description: Helpers to query supported DRM format modifiers
+ * @title: IGT Modifier Helpers
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <errno.h>
+
+#include <drm_fourcc.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include "drmtest.h"
+#include "igt_modifier.h"
+#include "igt_core.h"
+
+/*
+ * Basic tiling modifier candidates. Only those reported as actually
+ * supported by the driver for the requested format will be returned by
+ * igt_get_basic_tiling_modifiers().
+ */
+static const uint64_t basic_modifier_candidates[] = {
+ DRM_FORMAT_MOD_LINEAR,
+ I915_FORMAT_MOD_X_TILED,
+ I915_FORMAT_MOD_Y_TILED,
+ I915_FORMAT_MOD_4_TILED,
+};
+
+static inline const uint32_t *
+blob_formats_ptr(const struct drm_format_modifier_blob *blob)
+{
+ return (const uint32_t *)((const char *)blob + blob->formats_offset);
+}
+
+static inline const struct drm_format_modifier *
+blob_modifiers_ptr(const struct drm_format_modifier_blob *blob)
+{
+ return (const struct drm_format_modifier *)
+ ((const char *)blob + blob->modifiers_offset);
+}
+
+/*
+ * append_unique_modifier - add @mod to @list if not already present.
+ *
+ * @list: pointer to the growing array (may be reallocated).
+ * @count: current number of entries.
+ * @mod: modifier to add.
+ *
+ * Returns the new count.
+ */
+static int append_unique_modifier(uint64_t **list, int count, uint64_t mod)
+{
+ for (int i = 0; i < count; i++) {
+ if ((*list)[i] == mod)
+ return count;
+ }
+
+ *list = realloc(*list, (count + 1) * sizeof(**list));
+ igt_assert(*list);
+ (*list)[count] = mod;
+ return count + 1;
+}
+
+/*
+ * collect_modifiers_from_blob - parse an IN_FORMATS blob and collect every
+ * modifier that is paired with @format into @list.
+ *
+ * Returns the updated count of unique modifiers in @list.
+ */
+static int collect_modifiers_from_blob(const struct drm_format_modifier_blob *blob,
+ uint32_t format,
+ uint64_t **list, int count)
+{
+ const uint32_t *formats = blob_formats_ptr(blob);
+ const struct drm_format_modifier *mods = blob_modifiers_ptr(blob);
+
+ /* Find the index of @format in the blob's format array. */
+ int fmt_idx = -1;
+
+ for (uint32_t f = 0; f < blob->count_formats; f++) {
+ if (formats[f] == format) {
+ fmt_idx = (int)f;
+ break;
+ }
+ }
+
+ if (fmt_idx < 0)
+ return count;
+
+ /*
+ * Each drm_format_modifier entry covers a window of 64 formats
+ * starting at modifier.offset. Check whether our format index falls
+ * inside the window and whether the corresponding bit is set.
+ */
+ for (uint32_t m = 0; m < blob->count_modifiers; m++) {
+ const struct drm_format_modifier *entry = &mods[m];
+ int rel = fmt_idx - (int)entry->offset;
+
+ if (rel < 0 || rel >= 64)
+ continue;
+
+ if (!(entry->formats & (UINT64_C(1) << rel)))
+ continue;
+
+ count = append_unique_modifier(list, count, entry->modifier);
+ }
+
+ return count;
+}
+
+/*
+ * query_plane_modifiers - iterate all KMS planes and collect supported
+ * modifiers for @format via the IN_FORMATS property blob.
+ *
+ * Falls back to DRM_FORMAT_MOD_LINEAR when a plane supports @format in the
+ * legacy format list but exposes no IN_FORMATS blob.
+ *
+ * Returns the number of unique modifiers written into *modifiers_out (>=0).
+ * The caller must free() the returned array.
+ */
+static int query_plane_modifiers(int drm_fd, uint32_t format,
+ uint64_t **modifiers_out)
+{
+ drmModePlaneResPtr plane_res;
+ uint64_t *list = NULL;
+ int count = 0;
+
+ /* Universal planes capability is needed to see overlay and cursor planes. */
+ drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+
+ plane_res = drmModeGetPlaneResources(drm_fd);
+ if (!plane_res)
+ goto out;
+
+ for (uint32_t p = 0; p < plane_res->count_planes; p++) {
+ drmModePlanePtr plane;
+ drmModeObjectPropertiesPtr props;
+ drmModePropertyBlobPtr blob = NULL;
+ bool format_in_plane = false;
+
+ plane = drmModeGetPlane(drm_fd, plane_res->planes[p]);
+ if (!plane)
+ continue;
+
+ /* Check whether this plane supports @format at all. */
+ for (uint32_t f = 0; f < plane->count_formats; f++) {
+ if (plane->formats[f] == format) {
+ format_in_plane = true;
+ break;
+ }
+ }
+
+ if (!format_in_plane) {
+ drmModeFreePlane(plane);
+ continue;
+ }
+
+ props = drmModeObjectGetProperties(drm_fd, plane->plane_id,
+ DRM_MODE_OBJECT_PLANE);
+ if (props) {
+ for (uint32_t i = 0; i < props->count_props; i++) {
+ drmModePropertyPtr prop =
+ drmModeGetProperty(drm_fd, props->props[i]);
+ if (!prop)
+ continue;
+
+ if (strcmp(prop->name, "IN_FORMATS") == 0 &&
+ drm_property_type_is(prop, DRM_MODE_PROP_BLOB) &&
+ props->prop_values[i] != 0) {
+ blob = drmModeGetPropertyBlob(
+ drm_fd, props->prop_values[i]);
+ }
+
+ drmModeFreeProperty(prop);
+
+ if (blob)
+ break;
+ }
+ drmModeFreeObjectProperties(props);
+ }
+
+ if (blob) {
+ const struct drm_format_modifier_blob *blob_data =
+ (const struct drm_format_modifier_blob *)blob->data;
+
+ count = collect_modifiers_from_blob(blob_data, format,
+ &list, count);
+ drmModeFreePropertyBlob(blob);
+ } else {
+ /*
+ * No IN_FORMATS blob: we know the format is supported
+ * but not which modifiers; assume linear only.
+ */
+ count = append_unique_modifier(&list, count,
+ DRM_FORMAT_MOD_LINEAR);
+ }
+
+ drmModeFreePlane(plane);
+ }
+
+ drmModeFreePlaneResources(plane_res);
+
+out:
+ if (count == 0)
+ count = append_unique_modifier(&list, count,
+ DRM_FORMAT_MOD_LINEAR);
+
+ *modifiers_out = list;
+ return count;
+}
+
+/**
+ * igt_get_all_supported_modifiers:
+ * @drm_fd: open DRM file descriptor for the device under test
+ * @format: DRM FOURCC pixel format (e.g. %DRM_FORMAT_XRGB8888)
+ * @modifiers_out: output pointer; set to a malloc'd array of unique modifiers
+ * on success. The caller must free() this array.
+ *
+ * Returns the number of modifiers in the returned array (always >= 1 because
+ * %DRM_FORMAT_MOD_LINEAR is used as a fallback). The list is deduplicated
+ * across all KMS planes; it covers every modifier reported in the %IN_FORMATS
+ * plane property for the given @format on the running platform.
+ *
+ * Returns: number of entries in @modifiers_out (>= 1).
+ */
+int igt_get_all_supported_modifiers(int drm_fd, uint32_t format,
+ uint64_t **modifiers_out)
+{
+ igt_assert(modifiers_out);
+ return query_plane_modifiers(drm_fd, format, modifiers_out);
+}
+
+/**
+ * igt_get_basic_tiling_modifiers:
+ * @drm_fd: open DRM file descriptor for the device under test
+ * @format: DRM FOURCC pixel format (e.g. %DRM_FORMAT_XRGB8888)
+ * @modifiers_out: output pointer; set to a malloc'd array of unique modifiers
+ * on success. The caller must free() this array.
+ *
+ * Returns the subset of the "basic" tiling modifiers that are actually
+ * supported by the driver for @format. The basic set comprises:
+ *
+ * - %DRM_FORMAT_MOD_LINEAR
+ * - %I915_FORMAT_MOD_X_TILED
+ * - %I915_FORMAT_MOD_Y_TILED
+ * - %I915_FORMAT_MOD_4_TILED
+ *
+ * Only modifiers that are actually reported by the driver via the %IN_FORMATS
+ * KMS plane property are included in the result.
+ *
+ * Returns: number of entries in @modifiers_out (>= 1, since at least
+ * %DRM_FORMAT_MOD_LINEAR is always included as a fallback).
+ */
+int igt_get_basic_tiling_modifiers(int drm_fd, uint32_t format,
+ uint64_t **modifiers_out)
+{
+ uint64_t *all = NULL;
+ uint64_t *basic = NULL;
+ int all_count, basic_count = 0;
+
+ igt_assert(modifiers_out);
+
+ all_count = query_plane_modifiers(drm_fd, format, &all);
+
+ for (int i = 0; i < all_count; i++) {
+ for (int j = 0; j < (int)ARRAY_SIZE(basic_modifier_candidates); j++) {
+ if (all[i] == basic_modifier_candidates[j]) {
+ basic_count = append_unique_modifier(&basic,
+ basic_count,
+ all[i]);
+ break;
+ }
+ }
+ }
+
+ free(all);
+
+ if (basic_count == 0)
+ basic_count = append_unique_modifier(&basic, basic_count,
+ DRM_FORMAT_MOD_LINEAR);
+
+ *modifiers_out = basic;
+ return basic_count;
+}
diff --git a/lib/igt_modifier.h b/lib/igt_modifier.h
new file mode 100644
index 000000000..48ce769f5
--- /dev/null
+++ b/lib/igt_modifier.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2026 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.
+ */
+
+#ifndef __IGT_MODIFIER_H__
+#define __IGT_MODIFIER_H__
+
+#include <stdint.h>
+
+int igt_get_all_supported_modifiers(int drm_fd, uint32_t format,
+ uint64_t **modifiers_out);
+
+int igt_get_basic_tiling_modifiers(int drm_fd, uint32_t format,
+ uint64_t **modifiers_out);
+
+#endif /* __IGT_MODIFIER_H__ */
diff --git a/lib/meson.build b/lib/meson.build
index 5c4829345..ca2867eed 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -99,6 +99,7 @@ lib_sources = [
'igt_draw.c',
'igt_list.c',
'igt_map.c',
+ 'igt_modifier.c',
'igt_panel.c',
'igt_pm.c',
'igt_dummyload.c',
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH i-g-t 2/2] DONT_MERGE: Add kms_modifier_list test to verify new modifier helper
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
2026-04-01 8:58 ` [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers Jeevan B
@ 2026-04-01 8:58 ` Jeevan B
2026-04-01 14:52 ` ✓ Xe.CI.BAT: success for RFC: Add modifier helper and temporary test Patchwork
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Jeevan B @ 2026-04-01 8:58 UTC (permalink / raw)
To: igt-dev; +Cc: uma.shankar, Jeevan B
Temporary test to check that the new lib modifier functions work and
print all supported modifiers.
Signed-off-by: Jeevan B <jeevan.b@intel.com>
---
tests/kms_modifier_list.c | 144 ++++++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
2 files changed, 145 insertions(+)
create mode 100644 tests/kms_modifier_list.c
diff --git a/tests/kms_modifier_list.c b/tests/kms_modifier_list.c
new file mode 100644
index 000000000..c294e88fd
--- /dev/null
+++ b/tests/kms_modifier_list.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright © 2026 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"
+#include "igt_modifier.h"
+#include <drm_fourcc.h>
+#include <inttypes.h>
+
+IGT_TEST_DESCRIPTION("Validate igt_get_basic_tiling_modifiers() and "
+ "igt_get_all_supported_modifiers().");
+
+/**
+ * TEST: kms modifier list
+ * Category: Display
+ * Description: Validate the igt_get_basic_tiling_modifiers() and
+ * igt_get_all_supported_modifiers() helper functions.
+ * Driver requirement: i915, xe
+ * Mega feature: General Display Features
+ */
+
+/**
+ * SUBTEST: basic-modifiers-nonempty
+ * Description: Verify that igt_get_basic_tiling_modifiers() returns a
+ * non-empty list for DRM_FORMAT_XRGB8888.
+ *
+ * SUBTEST: all-modifiers-nonempty
+ * Description: Verify that igt_get_all_supported_modifiers() returns a
+ * non-empty list for DRM_FORMAT_XRGB8888.
+ *
+ * SUBTEST: basic-subset-of-all
+ * Description: Verify that every modifier in the basic list is also present
+ * in the all-modifiers list.
+ */
+
+static int drm_fd;
+static igt_display_t display;
+
+int igt_main()
+{
+ igt_fixture() {
+ drm_fd = drm_open_driver_master(DRIVER_ANY);
+ igt_display_require(&display, drm_fd);
+ }
+
+ igt_subtest("basic-modifiers-nonempty") {
+ uint64_t *mods = NULL;
+ int count;
+
+ count = igt_get_basic_tiling_modifiers(drm_fd,
+ DRM_FORMAT_XRGB8888,
+ &mods);
+ igt_assert_f(count > 0,
+ "igt_get_basic_tiling_modifiers() returned empty list\n");
+
+ igt_info("Basic modifiers (%d):\n", count);
+ for (int i = 0; i < count; i++) {
+ const char *name = igt_fb_modifier_name(mods[i]);
+ igt_info(" [basic] 0x%" PRIx64 " (%s)\n", mods[i], name);
+ }
+ free(mods);
+ }
+
+ igt_subtest("all-modifiers-nonempty") {
+ uint64_t *mods = NULL;
+ int count;
+
+ count = igt_get_all_supported_modifiers(drm_fd,
+ DRM_FORMAT_XRGB8888,
+ &mods);
+ igt_assert_f(count > 0,
+ "igt_get_all_supported_modifiers() returned empty list\n");
+
+ igt_info("All supported modifiers (%d):\n", count);
+ for (int i = 0; i < count; i++) {
+ const char *name = igt_fb_modifier_name(mods[i]);
+ igt_info(" [all] 0x%" PRIx64 " (%s)\n", mods[i], name);
+ }
+
+ free(mods);
+ }
+
+ igt_subtest("basic-subset-of-all") {
+ uint64_t *basic = NULL, *all = NULL;
+ int basic_count, all_count;
+
+ basic_count = igt_get_basic_tiling_modifiers(drm_fd,
+ DRM_FORMAT_XRGB8888,
+ &basic);
+ all_count = igt_get_all_supported_modifiers(drm_fd,
+ DRM_FORMAT_XRGB8888,
+ &all);
+
+ igt_assert(basic_count > 0);
+ igt_assert(all_count > 0);
+
+ igt_info("Checking: basic-subset-of-all\n");
+ for (int i = 0; i < basic_count; i++) {
+ bool found = false;
+ const char *name = igt_fb_modifier_name(basic[i]);
+
+ for (int j = 0; j < all_count; j++) {
+ if (basic[i] == all[j]) {
+ found = true;
+ break;
+ }
+ }
+
+ igt_info(" [basic] 0x%" PRIx64 " (%s) -> %s\n",
+ basic[i], name, found ? "FOUND" : "NOT FOUND");
+
+ igt_assert_f(found,
+ "basic modifier 0x%"PRIx64" not in all-modifiers list\n",
+ basic[i]);
+ }
+
+ free(basic);
+ free(all);
+ }
+
+ igt_fixture() {
+ igt_display_fini(&display);
+ drm_close_driver(drm_fd);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index cecb4a8ae..348cb9c74 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -46,6 +46,7 @@ test_progs = [
'kms_hdr',
'kms_invalid_mode',
'kms_lease',
+ 'kms_modifier_list',
'kms_multipipe_modeset',
'kms_panel_fitting',
'kms_pipe_crc_basic',
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers
2026-04-01 8:58 ` [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers Jeevan B
@ 2026-04-01 10:14 ` Jani Nikula
0 siblings, 0 replies; 7+ messages in thread
From: Jani Nikula @ 2026-04-01 10:14 UTC (permalink / raw)
To: Jeevan B, igt-dev; +Cc: uma.shankar, Jeevan B
On Wed, 01 Apr 2026, Jeevan B <jeevan.b@intel.com> wrote:
> Introduce a new helper library that collects DRM format modifiers
> reported by KMS planes via the IN_FORMATS property. Two functions are
> added:
>
> - igt_get_all_supported_modifiers()
> - igt_get_basic_tiling_modifiers()
>
> These helpers return unique modifier lists for a given format and will
> be used by modifier-related tests.
>
> Signed-off-by: Jeevan B <jeevan.b@intel.com>
> ---
> lib/igt_modifier.c | 310 +++++++++++++++++++++++++++++++++++++++++++++
> lib/igt_modifier.h | 35 +++++
> lib/meson.build | 1 +
> 3 files changed, 346 insertions(+)
> create mode 100644 lib/igt_modifier.c
> create mode 100644 lib/igt_modifier.h
>
> diff --git a/lib/igt_modifier.c b/lib/igt_modifier.c
> new file mode 100644
> index 000000000..561afb346
> --- /dev/null
> +++ b/lib/igt_modifier.c
> @@ -0,0 +1,310 @@
> +/*
> + * Copyright © 2026 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.
> + */
// SPDX-License-Identifier: MIT
for new files?
> +
> +/**
> + * SECTION:igt_modifier
> + * @short_description: Helpers to query supported DRM format modifiers
> + * @title: IGT Modifier Helpers
> + */
> +
> +#include <stdlib.h>
> +#include <string.h>
> +#include <stdbool.h>
> +#include <errno.h>
> +
> +#include <drm_fourcc.h>
> +#include <xf86drm.h>
> +#include <xf86drmMode.h>
> +
> +#include "drmtest.h"
> +#include "igt_modifier.h"
> +#include "igt_core.h"
> +
> +/*
> + * Basic tiling modifier candidates. Only those reported as actually
> + * supported by the driver for the requested format will be returned by
> + * igt_get_basic_tiling_modifiers().
> + */
> +static const uint64_t basic_modifier_candidates[] = {
> + DRM_FORMAT_MOD_LINEAR,
> + I915_FORMAT_MOD_X_TILED,
> + I915_FORMAT_MOD_Y_TILED,
> + I915_FORMAT_MOD_4_TILED,
> +};
> +
> +static inline const uint32_t *
There's not a whole lot using inline in .c files brings you. Just let
the compiler do its job.
> +blob_formats_ptr(const struct drm_format_modifier_blob *blob)
> +{
> + return (const uint32_t *)((const char *)blob + blob->formats_offset);
> +}
> +
> +static inline const struct drm_format_modifier *
> +blob_modifiers_ptr(const struct drm_format_modifier_blob *blob)
> +{
> + return (const struct drm_format_modifier *)
> + ((const char *)blob + blob->modifiers_offset);
> +}
> +
> +/*
> + * append_unique_modifier - add @mod to @list if not already present.
> + *
> + * @list: pointer to the growing array (may be reallocated).
> + * @count: current number of entries.
> + * @mod: modifier to add.
> + *
> + * Returns the new count.
> + */
> +static int append_unique_modifier(uint64_t **list, int count, uint64_t mod)
> +{
> + for (int i = 0; i < count; i++) {
> + if ((*list)[i] == mod)
> + return count;
> + }
> +
> + *list = realloc(*list, (count + 1) * sizeof(**list));
> + igt_assert(*list);
> + (*list)[count] = mod;
> + return count + 1;
I'm not saying you have to, but if I were doing this, I'd add some
struct for this, so that 1) you can just pass the struct pointer around,
without the count, and 2) you can track allocation size and number of
elements separately.
struct modifiers {
uint64_t *array;
int alloc_size;
int nelems;
};
Cook up better names for the members if you like.
Then you can have something like this:
static void has_modifier(struct modifiers *modifiers, uint64_t mod)
{
for (int i = 0; i < modifiers->nelems; i++)
if (modifiers->array[i] == mod)
return true;
return false;
}
static void append_unique_modifier(struct modifiers *modifiers, uint64_t mod)
{
if (has_modifier(modifiers, mod))
return;
if (modifiers->nelems == modifiers->alloc_size) {
/* arbitrary initial size of 8 */
modifiers->alloc_size = modifiers->alloc_size ? modifiers->alloc_size * 2 : 8;
modifiers->array = realloc(modifiers->array, modifiers->alloc_size * sizeof(modifiers->array[0]));
}
modifiers->array[modifiers->nelems++] = mod;
}
Crucially, when there's not enough space, you can e.g. double the
allocation size, so you don't have to realloc for every single element
you add to the array.
In the end, you can realloc trim to number of elements, but even that
doesn't really matter all that much.
> +}
> +
> +/*
> + * collect_modifiers_from_blob - parse an IN_FORMATS blob and collect every
> + * modifier that is paired with @format into @list.
> + *
> + * Returns the updated count of unique modifiers in @list.
> + */
> +static int collect_modifiers_from_blob(const struct drm_format_modifier_blob *blob,
> + uint32_t format,
> + uint64_t **list, int count)
> +{
> + const uint32_t *formats = blob_formats_ptr(blob);
> + const struct drm_format_modifier *mods = blob_modifiers_ptr(blob);
> +
> + /* Find the index of @format in the blob's format array. */
> + int fmt_idx = -1;
> +
> + for (uint32_t f = 0; f < blob->count_formats; f++) {
Please just use int for looping.
> + if (formats[f] == format) {
> + fmt_idx = (int)f;
And then you also don't need to use the icky cast.
> + break;
> + }
> + }
> +
> + if (fmt_idx < 0)
> + return count;
> +
> + /*
> + * Each drm_format_modifier entry covers a window of 64 formats
> + * starting at modifier.offset. Check whether our format index falls
> + * inside the window and whether the corresponding bit is set.
> + */
> + for (uint32_t m = 0; m < blob->count_modifiers; m++) {
> + const struct drm_format_modifier *entry = &mods[m];
> + int rel = fmt_idx - (int)entry->offset;
What's with the cast?
> +
> + if (rel < 0 || rel >= 64)
> + continue;
> +
> + if (!(entry->formats & (UINT64_C(1) << rel)))
> + continue;
> +
> + count = append_unique_modifier(list, count, entry->modifier);
> + }
> +
> + return count;
> +}
> +
> +/*
> + * query_plane_modifiers - iterate all KMS planes and collect supported
> + * modifiers for @format via the IN_FORMATS property blob.
> + *
> + * Falls back to DRM_FORMAT_MOD_LINEAR when a plane supports @format in the
> + * legacy format list but exposes no IN_FORMATS blob.
> + *
> + * Returns the number of unique modifiers written into *modifiers_out (>=0).
> + * The caller must free() the returned array.
> + */
> +static int query_plane_modifiers(int drm_fd, uint32_t format,
> + uint64_t **modifiers_out)
> +{
> + drmModePlaneResPtr plane_res;
> + uint64_t *list = NULL;
> + int count = 0;
> +
> + /* Universal planes capability is needed to see overlay and cursor planes. */
> + drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> +
> + plane_res = drmModeGetPlaneResources(drm_fd);
> + if (!plane_res)
> + goto out;
> +
> + for (uint32_t p = 0; p < plane_res->count_planes; p++) {
Please just use int for loops.
> + drmModePlanePtr plane;
> + drmModeObjectPropertiesPtr props;
> + drmModePropertyBlobPtr blob = NULL;
> + bool format_in_plane = false;
> +
> + plane = drmModeGetPlane(drm_fd, plane_res->planes[p]);
> + if (!plane)
> + continue;
> +
> + /* Check whether this plane supports @format at all. */
> + for (uint32_t f = 0; f < plane->count_formats; f++) {
Ditto.
> + if (plane->formats[f] == format) {
> + format_in_plane = true;
> + break;
> + }
> + }
> +
> + if (!format_in_plane) {
> + drmModeFreePlane(plane);
> + continue;
> + }
> +
> + props = drmModeObjectGetProperties(drm_fd, plane->plane_id,
> + DRM_MODE_OBJECT_PLANE);
> + if (props) {
> + for (uint32_t i = 0; i < props->count_props; i++) {
Ditto.
> + drmModePropertyPtr prop =
> + drmModeGetProperty(drm_fd, props->props[i]);
> + if (!prop)
> + continue;
> +
> + if (strcmp(prop->name, "IN_FORMATS") == 0 &&
> + drm_property_type_is(prop, DRM_MODE_PROP_BLOB) &&
> + props->prop_values[i] != 0) {
> + blob = drmModeGetPropertyBlob(
> + drm_fd, props->prop_values[i]);
> + }
> +
> + drmModeFreeProperty(prop);
> +
> + if (blob)
> + break;
> + }
> + drmModeFreeObjectProperties(props);
> + }
> +
> + if (blob) {
> + const struct drm_format_modifier_blob *blob_data =
> + (const struct drm_format_modifier_blob *)blob->data;
> +
> + count = collect_modifiers_from_blob(blob_data, format,
> + &list, count);
> + drmModeFreePropertyBlob(blob);
> + } else {
> + /*
> + * No IN_FORMATS blob: we know the format is supported
> + * but not which modifiers; assume linear only.
> + */
> + count = append_unique_modifier(&list, count,
> + DRM_FORMAT_MOD_LINEAR);
> + }
> +
> + drmModeFreePlane(plane);
> + }
> +
> + drmModeFreePlaneResources(plane_res);
> +
> +out:
> + if (count == 0)
> + count = append_unique_modifier(&list, count,
> + DRM_FORMAT_MOD_LINEAR);
> +
> + *modifiers_out = list;
> + return count;
> +}
> +
> +/**
> + * igt_get_all_supported_modifiers:
> + * @drm_fd: open DRM file descriptor for the device under test
> + * @format: DRM FOURCC pixel format (e.g. %DRM_FORMAT_XRGB8888)
> + * @modifiers_out: output pointer; set to a malloc'd array of unique modifiers
> + * on success. The caller must free() this array.
> + *
> + * Returns the number of modifiers in the returned array (always >= 1 because
> + * %DRM_FORMAT_MOD_LINEAR is used as a fallback). The list is deduplicated
> + * across all KMS planes; it covers every modifier reported in the %IN_FORMATS
> + * plane property for the given @format on the running platform.
> + *
> + * Returns: number of entries in @modifiers_out (>= 1).
> + */
> +int igt_get_all_supported_modifiers(int drm_fd, uint32_t format,
> + uint64_t **modifiers_out)
> +{
So you'd have
struct modifiers modifiers = {};
here and pass &modifiers around.
In the end, you can just *modifiers = modifiers->array; and return
modifiers->nelems; or something.
> + igt_assert(modifiers_out);
> + return query_plane_modifiers(drm_fd, format, modifiers_out);
> +}
> +
> +/**
> + * igt_get_basic_tiling_modifiers:
> + * @drm_fd: open DRM file descriptor for the device under test
> + * @format: DRM FOURCC pixel format (e.g. %DRM_FORMAT_XRGB8888)
> + * @modifiers_out: output pointer; set to a malloc'd array of unique modifiers
> + * on success. The caller must free() this array.
> + *
> + * Returns the subset of the "basic" tiling modifiers that are actually
> + * supported by the driver for @format. The basic set comprises:
> + *
> + * - %DRM_FORMAT_MOD_LINEAR
> + * - %I915_FORMAT_MOD_X_TILED
> + * - %I915_FORMAT_MOD_Y_TILED
> + * - %I915_FORMAT_MOD_4_TILED
> + *
> + * Only modifiers that are actually reported by the driver via the %IN_FORMATS
> + * KMS plane property are included in the result.
> + *
> + * Returns: number of entries in @modifiers_out (>= 1, since at least
> + * %DRM_FORMAT_MOD_LINEAR is always included as a fallback).
> + */
> +int igt_get_basic_tiling_modifiers(int drm_fd, uint32_t format,
> + uint64_t **modifiers_out)
> +{
> + uint64_t *all = NULL;
> + uint64_t *basic = NULL;
> + int all_count, basic_count = 0;
> +
> + igt_assert(modifiers_out);
> +
> + all_count = query_plane_modifiers(drm_fd, format, &all);
> +
> + for (int i = 0; i < all_count; i++) {
> + for (int j = 0; j < (int)ARRAY_SIZE(basic_modifier_candidates); j++) {
> + if (all[i] == basic_modifier_candidates[j]) {
> + basic_count = append_unique_modifier(&basic,
> + basic_count,
> + all[i]);
> + break;
> + }
> + }
> + }
And you could store basic_modifier_candidates in a static const struct
modifier too, and add generic set intersection operation for struct
modifier, so this is not all so specific.
> +
> + free(all);
> +
> + if (basic_count == 0)
> + basic_count = append_unique_modifier(&basic, basic_count,
> + DRM_FORMAT_MOD_LINEAR);
> +
> + *modifiers_out = basic;
> + return basic_count;
> +}
> diff --git a/lib/igt_modifier.h b/lib/igt_modifier.h
> new file mode 100644
> index 000000000..48ce769f5
> --- /dev/null
> +++ b/lib/igt_modifier.h
> @@ -0,0 +1,35 @@
> +/*
> + * Copyright © 2026 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.
> + */
SPDX.
> +
> +#ifndef __IGT_MODIFIER_H__
> +#define __IGT_MODIFIER_H__
> +
> +#include <stdint.h>
> +
> +int igt_get_all_supported_modifiers(int drm_fd, uint32_t format,
> + uint64_t **modifiers_out);
> +
> +int igt_get_basic_tiling_modifiers(int drm_fd, uint32_t format,
> + uint64_t **modifiers_out);
> +
> +#endif /* __IGT_MODIFIER_H__ */
> diff --git a/lib/meson.build b/lib/meson.build
> index 5c4829345..ca2867eed 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -99,6 +99,7 @@ lib_sources = [
> 'igt_draw.c',
> 'igt_list.c',
> 'igt_map.c',
> + 'igt_modifier.c',
> 'igt_panel.c',
> 'igt_pm.c',
> 'igt_dummyload.c',
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✓ Xe.CI.BAT: success for RFC: Add modifier helper and temporary test
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
2026-04-01 8:58 ` [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers Jeevan B
2026-04-01 8:58 ` [PATCH i-g-t 2/2] DONT_MERGE: Add kms_modifier_list test to verify new modifier helper Jeevan B
@ 2026-04-01 14:52 ` Patchwork
2026-04-01 15:27 ` ✗ i915.CI.BAT: failure " Patchwork
2026-04-01 19:23 ` ✓ Xe.CI.FULL: success " Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-04-01 14:52 UTC (permalink / raw)
To: Jeevan B; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1267 bytes --]
== Series Details ==
Series: RFC: Add modifier helper and temporary test
URL : https://patchwork.freedesktop.org/series/164225/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_8840_BAT -> XEIGTPW_14903_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (14 -> 14)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in XEIGTPW_14903_BAT that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@xe_waitfence@engine:
- bat-dg2-oem2: [PASS][1] -> [FAIL][2] ([Intel XE#6519])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8840/bat-dg2-oem2/igt@xe_waitfence@engine.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/bat-dg2-oem2/igt@xe_waitfence@engine.html
[Intel XE#6519]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6519
Build changes
-------------
* IGT: IGT_8840 -> IGTPW_14903
IGTPW_14903: 14903
IGT_8840: 8840
xe-4833-5d36e6d54e963f0c1137aaf2249d2baa781f08c2: 5d36e6d54e963f0c1137aaf2249d2baa781f08c2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/index.html
[-- Attachment #2: Type: text/html, Size: 1829 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✗ i915.CI.BAT: failure for RFC: Add modifier helper and temporary test
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
` (2 preceding siblings ...)
2026-04-01 14:52 ` ✓ Xe.CI.BAT: success for RFC: Add modifier helper and temporary test Patchwork
@ 2026-04-01 15:27 ` Patchwork
2026-04-01 19:23 ` ✓ Xe.CI.FULL: success " Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-04-01 15:27 UTC (permalink / raw)
To: Jeevan B; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 3788 bytes --]
== Series Details ==
Series: RFC: Add modifier helper and temporary test
URL : https://patchwork.freedesktop.org/series/164225/
State : failure
== Summary ==
CI Bug Log - changes from IGT_8840 -> IGTPW_14903
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_14903 absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_14903, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/index.html
Participating hosts (42 -> 39)
------------------------------
Missing (3): bat-dg2-8 fi-snb-2520m bat-dg2-13
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_14903:
### IGT changes ###
#### Possible regressions ####
* igt@i915_selftest@live@hugepages:
- bat-rpls-4: [PASS][1] -> [INCOMPLETE][2] +1 other test incomplete
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/bat-rpls-4/igt@i915_selftest@live@hugepages.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/bat-rpls-4/igt@i915_selftest@live@hugepages.html
Known issues
------------
Here are the changes found in IGTPW_14903 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@i915_selftest@live:
- bat-mtlp-8: [PASS][3] -> [DMESG-FAIL][4] ([i915#12061]) +1 other test dmesg-fail
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/bat-mtlp-8/igt@i915_selftest@live.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/bat-mtlp-8/igt@i915_selftest@live.html
* igt@i915_selftest@live@workarounds:
- bat-mtlp-9: [PASS][5] -> [DMESG-FAIL][6] ([i915#12061]) +1 other test dmesg-fail
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
* igt@kms_hdmi_inject@inject-audio:
- fi-tgl-1115g4: [PASS][7] -> [FAIL][8] ([i915#14867])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/fi-tgl-1115g4/igt@kms_hdmi_inject@inject-audio.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/fi-tgl-1115g4/igt@kms_hdmi_inject@inject-audio.html
* igt@vgem_basic@unload:
- fi-skl-6600u: [PASS][9] -> [INCOMPLETE][10] ([i915#15844])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/fi-skl-6600u/igt@vgem_basic@unload.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/fi-skl-6600u/igt@vgem_basic@unload.html
#### Possible fixes ####
* igt@i915_selftest@live@workarounds:
- bat-arlh-3: [DMESG-FAIL][11] ([i915#12061]) -> [PASS][12] +1 other test pass
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8840/bat-arlh-3/igt@i915_selftest@live@workarounds.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/bat-arlh-3/igt@i915_selftest@live@workarounds.html
[i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
[i915#14867]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14867
[i915#15844]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15844
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_8840 -> IGTPW_14903
CI-20190529: 20190529
CI_DRM_18262: 5d36e6d54e963f0c1137aaf2249d2baa781f08c2 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_14903: 14903
IGT_8840: 8840
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14903/index.html
[-- Attachment #2: Type: text/html, Size: 4683 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✓ Xe.CI.FULL: success for RFC: Add modifier helper and temporary test
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
` (3 preceding siblings ...)
2026-04-01 15:27 ` ✗ i915.CI.BAT: failure " Patchwork
@ 2026-04-01 19:23 ` Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-04-01 19:23 UTC (permalink / raw)
To: Jeevan B; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 9620 bytes --]
== Series Details ==
Series: RFC: Add modifier helper and temporary test
URL : https://patchwork.freedesktop.org/series/164225/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_8840_FULL -> XEIGTPW_14903_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
New tests
---------
New tests have been introduced between XEIGT_8840_FULL and XEIGTPW_14903_FULL:
### New IGT tests (3) ###
* igt@kms_modifier_list@all-modifiers-nonempty:
- Statuses : 1 pass(s)
- Exec time: [0.00] s
* igt@kms_modifier_list@basic-modifiers-nonempty:
- Statuses : 1 pass(s)
- Exec time: [0.00] s
* igt@kms_modifier_list@basic-subset-of-all:
- Statuses : 1 pass(s)
- Exec time: [0.00] s
Known issues
------------
Here are the changes found in XEIGTPW_14903_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip:
- shard-lnl: NOTRUN -> [SKIP][1] ([Intel XE#1407])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_ccs@crc-primary-basic-yf-tiled-ccs:
- shard-lnl: NOTRUN -> [SKIP][2] ([Intel XE#2887])
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-5/igt@kms_ccs@crc-primary-basic-yf-tiled-ccs.html
* igt@kms_chamelium_hpd@dp-hpd-after-hibernate:
- shard-lnl: NOTRUN -> [SKIP][3] ([Intel XE#373])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-6/igt@kms_chamelium_hpd@dp-hpd-after-hibernate.html
* igt@kms_content_protection@atomic:
- shard-lnl: NOTRUN -> [SKIP][4] ([Intel XE#7642])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-2/igt@kms_content_protection@atomic.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
- shard-lnl: NOTRUN -> [SKIP][5] ([Intel XE#309] / [Intel XE#7343])
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling:
- shard-lnl: NOTRUN -> [SKIP][6] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode:
- shard-lnl: NOTRUN -> [SKIP][7] ([Intel XE#1397] / [Intel XE#7385])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tile-downscaling@pipe-a-default-mode.html
* igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling:
- shard-lnl: NOTRUN -> [SKIP][8] ([Intel XE#7178] / [Intel XE#7351])
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-2/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html
* igt@kms_frontbuffer_tracking@drrs-1p-rte:
- shard-lnl: NOTRUN -> [SKIP][9] ([Intel XE#6312] / [Intel XE#651])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-6/igt@kms_frontbuffer_tracking@drrs-1p-rte.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][10] ([Intel XE#656])
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-5/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-render.html
* igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping:
- shard-lnl: NOTRUN -> [SKIP][11] ([Intel XE#7283])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-3/igt@kms_plane@pixel-format-y-tiled-gen12-mc-ccs-modifier-source-clamping.html
* igt@kms_plane_lowres@tiling-x@pipe-b-edp-1:
- shard-lnl: NOTRUN -> [SKIP][12] ([Intel XE#599] / [Intel XE#7382]) +3 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-2/igt@kms_plane_lowres@tiling-x@pipe-b-edp-1.html
* igt@xe_eudebug@vm-bind-clear-faultable:
- shard-lnl: NOTRUN -> [SKIP][13] ([Intel XE#7636]) +1 other test skip
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@xe_eudebug@vm-bind-clear-faultable.html
* igt@xe_evict@evict-small-external-multi-queue-cm:
- shard-lnl: NOTRUN -> [SKIP][14] ([Intel XE#6540] / [Intel XE#688])
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@xe_evict@evict-small-external-multi-queue-cm.html
* igt@xe_exec_basic@multigpu-once-basic-defer-mmap:
- shard-lnl: NOTRUN -> [SKIP][15] ([Intel XE#1392])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-1/igt@xe_exec_basic@multigpu-once-basic-defer-mmap.html
* igt@xe_exec_fault_mode@twice-multi-queue-rebind-imm:
- shard-lnl: NOTRUN -> [SKIP][16] ([Intel XE#7136]) +2 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@xe_exec_fault_mode@twice-multi-queue-rebind-imm.html
* igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-basic-smem:
- shard-lnl: NOTRUN -> [SKIP][17] ([Intel XE#6874]) +2 other tests skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-2/igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-basic-smem.html
* igt@xe_exec_threads@threads-multi-queue-fd-userptr-rebind:
- shard-lnl: NOTRUN -> [SKIP][18] ([Intel XE#7138])
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-5/igt@xe_exec_threads@threads-multi-queue-fd-userptr-rebind.html
* igt@xe_multigpu_svm@mgpu-latency-basic:
- shard-lnl: NOTRUN -> [SKIP][19] ([Intel XE#6964])
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-8/igt@xe_multigpu_svm@mgpu-latency-basic.html
* igt@xe_pm@d3cold-basic:
- shard-lnl: NOTRUN -> [SKIP][20] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-3/igt@xe_pm@d3cold-basic.html
* igt@xe_query@multigpu-query-topology:
- shard-lnl: NOTRUN -> [SKIP][21] ([Intel XE#944]) +1 other test skip
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-1/igt@xe_query@multigpu-query-topology.html
#### Possible fixes ####
* igt@kms_pm_dc@dc5-dpms:
- shard-lnl: [FAIL][22] ([Intel XE#7340] / [Intel XE#7504]) -> [PASS][23]
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8840/shard-lnl-7/igt@kms_pm_dc@dc5-dpms.html
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/shard-lnl-7/igt@kms_pm_dc@dc5-dpms.html
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
[Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
[Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
[Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136
[Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
[Intel XE#7340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7340
[Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
[Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7382]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7382
[Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
[Intel XE#7504]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7504
[Intel XE#7636]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7636
[Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
Build changes
-------------
* IGT: IGT_8840 -> IGTPW_14903
IGTPW_14903: 14903
IGT_8840: 8840
xe-4833-5d36e6d54e963f0c1137aaf2249d2baa781f08c2: 5d36e6d54e963f0c1137aaf2249d2baa781f08c2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14903/index.html
[-- Attachment #2: Type: text/html, Size: 10846 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-04-01 19:23 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-01 8:58 [PATCH i-g-t 0/2] RFC: Add modifier helper and temporary test Jeevan B
2026-04-01 8:58 ` [PATCH i-g-t 1/2] lib: Add modifier helper for querying driver-supported modifiers Jeevan B
2026-04-01 10:14 ` Jani Nikula
2026-04-01 8:58 ` [PATCH i-g-t 2/2] DONT_MERGE: Add kms_modifier_list test to verify new modifier helper Jeevan B
2026-04-01 14:52 ` ✓ Xe.CI.BAT: success for RFC: Add modifier helper and temporary test Patchwork
2026-04-01 15:27 ` ✗ i915.CI.BAT: failure " Patchwork
2026-04-01 19:23 ` ✓ Xe.CI.FULL: success " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox