public inbox for igt-dev@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
@ 2026-03-17 17:51 Alex Hung
  2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Alex Hung @ 2026-03-17 17:51 UTC (permalink / raw)
  To: igt-dev; +Cc: wayne.lin, Mark.Broadworth, Alex Hung

Move HDR utility functions from kms_hdr test into a reusable library
module. This includes metadata filling, EDID parsing, and conversion
functions.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 lib/igt_hdr.c   | 220 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_hdr.h   |  58 +++++++++++++
 lib/meson.build |   1 +
 tests/kms_hdr.c | 179 ++-------------------------------------
 4 files changed, 287 insertions(+), 171 deletions(-)
 create mode 100644 lib/igt_hdr.c
 create mode 100644 lib/igt_hdr.h

diff --git a/lib/igt_hdr.c b/lib/igt_hdr.c
new file mode 100644
index 000000000..6368ae78b
--- /dev/null
+++ b/lib/igt_hdr.c
@@ -0,0 +1,220 @@
+/*
+ * Copyright © 2026 Advanced Micro Devices, Inc.
+ *
+ * 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 <string.h>
+#include <drm.h>
+#include <drm_mode.h>
+
+#include "igt.h"
+#include "igt_hdr.h"
+#include "igt_edid.h"
+
+/**
+ * SECTION:igt_hdr
+ * @short_description: HDR (High Dynamic Range) helper library
+ * @title: HDR
+ * @include: igt_hdr.h
+ *
+ * This library provides helper functions for working with HDR metadata
+ * and HDR display capabilities.
+ */
+
+/**
+ * igt_hdr_calc_hdr_float:
+ * @val: The value to convert
+ *
+ * Converts a double to 861-G spec FP format
+ *
+ * Returns: The value converted to HDR floating point format
+ */
+uint16_t igt_hdr_calc_hdr_float(double val)
+{
+	return (uint16_t)(val * 50000.0);
+}
+
+/**
+ * igt_hdr_fill_output_metadata_st2084:
+ * @meta: Pointer to hdr_output_metadata structure to fill
+ *
+ * Fills HDR output metadata structure with test values for ST2084 (PQ) EOTF.
+ * Uses Rec. 2020 color primaries and typical HDR mastering display characteristics.
+ *
+ * Note: there isn't really a standard for what the metadata is supposed
+ * to do on the display side of things. The display is free to ignore it
+ * and clip the output, use it to help tonemap to the content range,
+ * or do anything they want, really.
+ */
+void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta)
+{
+	memset(meta, 0, sizeof(*meta));
+
+	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
+	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
+
+	/* Rec. 2020 */
+	meta->hdmi_metadata_type1.display_primaries[0].x =
+		igt_hdr_calc_hdr_float(0.708); /* Red */
+	meta->hdmi_metadata_type1.display_primaries[0].y =
+		igt_hdr_calc_hdr_float(0.292);
+	meta->hdmi_metadata_type1.display_primaries[1].x =
+		igt_hdr_calc_hdr_float(0.170); /* Green */
+	meta->hdmi_metadata_type1.display_primaries[1].y =
+		igt_hdr_calc_hdr_float(0.797);
+	meta->hdmi_metadata_type1.display_primaries[2].x =
+		igt_hdr_calc_hdr_float(0.131); /* Blue */
+	meta->hdmi_metadata_type1.display_primaries[2].y =
+		igt_hdr_calc_hdr_float(0.046);
+	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
+	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
+
+	meta->hdmi_metadata_type1.max_display_mastering_luminance =
+		1000; /* 1000 nits */
+	meta->hdmi_metadata_type1.min_display_mastering_luminance =
+		500;				   /* 0.05 nits */
+	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
+	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
+}
+
+/**
+ * igt_hdr_fill_output_metadata_sdr:
+ * @meta: Pointer to hdr_output_metadata structure to fill
+ *
+ * Fills HDR output metadata structure with test values targeting SDR.
+ */
+void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta)
+{
+	memset(meta, 0, sizeof(*meta));
+
+	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
+	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
+
+	/* Rec. 709 */
+	meta->hdmi_metadata_type1.display_primaries[0].x =
+		igt_hdr_calc_hdr_float(0.640); /* Red */
+	meta->hdmi_metadata_type1.display_primaries[0].y =
+		igt_hdr_calc_hdr_float(0.330);
+	meta->hdmi_metadata_type1.display_primaries[1].x =
+		igt_hdr_calc_hdr_float(0.300); /* Green */
+	meta->hdmi_metadata_type1.display_primaries[1].y =
+		igt_hdr_calc_hdr_float(0.600);
+	meta->hdmi_metadata_type1.display_primaries[2].x =
+		igt_hdr_calc_hdr_float(0.150); /* Blue */
+	meta->hdmi_metadata_type1.display_primaries[2].y =
+		igt_hdr_calc_hdr_float(0.006);
+	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
+	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
+
+	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
+	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
+	meta->hdmi_metadata_type1.max_fall = 0;
+	meta->hdmi_metadata_type1.max_cll = 0;
+}
+
+/**
+ * igt_hdr_cta_block_has_hdr:
+ * @edid_ext: Pointer to CTA extension block data
+ *
+ * Checks if a CTA extension block indicates HDR support.
+ *
+ * Byte 1: 0x07 indicates Extended Tag
+ * Byte 2: 0x06 indicates HDMI Static Metadata Block
+ * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
+ *         where ET_0: Traditional Gamma - SDR Luminance Range
+ *               ET_1: Traditional Gamma - HDR Luminance Range
+ *               ET_2: SMPTE ST 2084
+ *               ET_3: Hybrid Log-Gamma (HLG)
+ *               ET_4 to ET_5: Reserved for future use
+ *
+ * Returns: true if the block indicates HDR support, false otherwise
+ */
+bool igt_hdr_cta_block_has_hdr(const char *edid_ext)
+{
+	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
+	     (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
+	    ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
+	     (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
+			return true;
+
+	return false;
+}
+
+/**
+ * igt_hdr_is_panel_hdr:
+ * @drm_fd: DRM file descriptor
+ * @connector_id: KMS connector ID
+ *
+ * Checks if a panel/display supports HDR by parsing its EDID.
+ * Looks for HDR Static Metadata Block in CTA extension.
+ *
+ * Returns: true if the panel supports HDR, false otherwise
+ */
+bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id)
+{
+	bool ok;
+	int i, j, offset;
+	uint64_t edid_blob_id;
+	drmModePropertyBlobRes *edid_blob;
+	const struct edid_ext *edid_ext;
+	const struct edid *edid;
+	const struct edid_cea *edid_cea;
+	const char *cea_data;
+	bool ret = false;
+
+	ok = kmstest_get_property(drm_fd, connector_id,
+			DRM_MODE_OBJECT_CONNECTOR, "EDID",
+			NULL, &edid_blob_id, NULL);
+
+	if (!ok || !edid_blob_id)
+		return ret;
+
+	edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
+	igt_assert(edid_blob);
+
+	edid = (const struct edid *) edid_blob->data;
+	igt_assert(edid);
+
+	drmModeFreePropertyBlob(edid_blob);
+
+	for (i = 0; i < edid->extensions_len; i++) {
+		edid_ext = &edid->extensions[i];
+		edid_cea = &edid_ext->data.cea;
+
+		/* HDR not defined in CTA Extension Version < 3. */
+		if ((edid_ext->tag != EDID_EXT_CEA) ||
+		    (edid_cea->revision != CTA_EXTENSION_VERSION))
+				continue;
+		else {
+			offset = edid_cea->dtd_start;
+			cea_data = edid_cea->data;
+
+			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
+				ret = igt_hdr_cta_block_has_hdr(cea_data + j);
+
+				if (ret)
+					break;
+			}
+		}
+	}
+
+	return ret;
+}
diff --git a/lib/igt_hdr.h b/lib/igt_hdr.h
new file mode 100644
index 000000000..a6faef443
--- /dev/null
+++ b/lib/igt_hdr.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2026 Advanced Micro Devices, Inc.
+ *
+ * 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_HDR_H
+#define IGT_HDR_H
+
+#include "config.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <linux/types.h>
+
+struct hdr_output_metadata;
+struct igt_fb;
+
+/* HDR EDID parsing. */
+#define CTA_EXTENSION_VERSION		0x03
+#define HDR_STATIC_METADATA_BLOCK       0x06
+#define USE_EXTENDED_TAG		0x07
+
+/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
+enum hdmi_metadata_type {
+	HDMI_STATIC_METADATA_TYPE1 = 0,
+};
+
+enum hdmi_eotf {
+	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
+	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
+	HDMI_EOTF_SMPTE_ST2084,
+};
+
+uint16_t igt_hdr_calc_hdr_float(double val);
+void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta);
+void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta);
+bool igt_hdr_cta_block_has_hdr(const char *edid_ext);
+bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id);
+
+#endif /* IGT_HDR_H */
diff --git a/lib/meson.build b/lib/meson.build
index cd03e8f63..71ca60e66 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -114,6 +114,7 @@ lib_sources = [
 	'igt_psr.c',
 	'igt_amd.c',
 	'igt_edid.c',
+	'igt_hdr.c',
 	'igt_eld.c',
 	'igt_infoframe.c',
 	'igt_color.c',
diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c
index f30902b72..382fcd823 100644
--- a/tests/kms_hdr.c
+++ b/tests/kms_hdr.c
@@ -33,6 +33,7 @@
 #include <termios.h>
 #include <unistd.h>
 #include "igt_edid.h"
+#include "igt_hdr.h"
 
 /**
  * SUBTEST: bpc-switch
@@ -70,24 +71,8 @@
 
 IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
 
-/* HDR EDID parsing. */
-#define CTA_EXTENSION_VERSION		0x03
-#define HDR_STATIC_METADATA_BLOCK       0x06
-#define USE_EXTENDED_TAG		0x07
-
 #define BACKLIGHT_PATH "/sys/class/backlight"
 
-/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
-enum hdmi_metadata_type {
-	HDMI_STATIC_METADATA_TYPE1 = 0,
-};
-
-enum hdmi_eotf {
-	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
-	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
-	HDMI_EOTF_SMPTE_ST2084,
-};
-
 /* Test flags. */
 enum {
 	TEST_NONE = 1 << 0,
@@ -148,50 +133,6 @@ static void draw_hdr_pattern(igt_fb_t *fb)
 	igt_paint_test_pattern_color_fb(fb->fd, fb, 1.0, 1.0, 1.0);
 }
 
-/* Converts a double to 861-G spec FP format. */
-static uint16_t calc_hdr_float(double val)
-{
-	return (uint16_t)(val * 50000.0);
-}
-
-/* Fills some test values for ST2084 HDR output metadata.
- *
- * Note: there isn't really a standard for what the metadata is supposed
- * to do on the display side of things. The display is free to ignore it
- * and clip the output, use it to help tonemap to the content range,
- * or do anything they want, really.
- */
-static void fill_hdr_output_metadata_st2084(struct hdr_output_metadata *meta)
-{
-	memset(meta, 0, sizeof(*meta));
-
-	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
-	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
-
-	/* Rec. 2020 */
-	meta->hdmi_metadata_type1.display_primaries[0].x =
-		calc_hdr_float(0.708); /* Red */
-	meta->hdmi_metadata_type1.display_primaries[0].y =
-		calc_hdr_float(0.292);
-	meta->hdmi_metadata_type1.display_primaries[1].x =
-		calc_hdr_float(0.170); /* Green */
-	meta->hdmi_metadata_type1.display_primaries[1].y =
-		calc_hdr_float(0.797);
-	meta->hdmi_metadata_type1.display_primaries[2].x =
-		calc_hdr_float(0.131); /* Blue */
-	meta->hdmi_metadata_type1.display_primaries[2].y =
-		calc_hdr_float(0.046);
-	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
-	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
-
-	meta->hdmi_metadata_type1.max_display_mastering_luminance =
-		1000; /* 1000 nits */
-	meta->hdmi_metadata_type1.min_display_mastering_luminance =
-		500;				   /* 0.05 nits */
-	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
-	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
-}
-
 /* Sets the HDR output metadata prop. */
 static void set_hdr_output_metadata(data_t *data,
 				    struct hdr_output_metadata const *meta)
@@ -365,80 +306,6 @@ static void test_bpc_switch(data_t *data, uint32_t flags)
 	}
 }
 
-static bool cta_block(const char *edid_ext)
-{
-	/*
-	 * Byte 1: 0x07 indicates Extended Tag
-	 * Byte 2: 0x06 indicates HDMI Static Metadata Block
-	 * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
-	 *	       where ET_0: Traditional Gamma - SDR Luminance Range
-	 *	             ET_1: Traditional Gamma - HDR Luminance Range
-	 *	             ET_2: SMPTE ST 2084
-	 *	             ET_3: Hybrid Log-Gamma (HLG)
-	 *	             ET_4 to ET_5: Reserved for future use
-	 */
-
-	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
-	      (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
-	     ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
-	      (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
-			return true;
-
-	return false;
-}
-
-/* Returns true if panel supports HDR. */
-static bool is_panel_hdr(data_t *data, igt_output_t *output)
-{
-	bool ok;
-	int i, j, offset;
-	uint64_t edid_blob_id;
-	drmModePropertyBlobRes *edid_blob;
-	const struct edid_ext *edid_ext;
-	const struct edid *edid;
-	const struct edid_cea *edid_cea;
-	const char *cea_data;
-	bool ret = false;
-
-	ok = kmstest_get_property(data->fd, output->id,
-			DRM_MODE_OBJECT_CONNECTOR, "EDID",
-			NULL, &edid_blob_id, NULL);
-
-	if (!ok || !edid_blob_id)
-		return ret;
-
-	edid_blob = drmModeGetPropertyBlob(data->fd, edid_blob_id);
-	igt_assert(edid_blob);
-
-	edid = (const struct edid *) edid_blob->data;
-	igt_assert(edid);
-
-	drmModeFreePropertyBlob(edid_blob);
-
-	for (i = 0; i < edid->extensions_len; i++) {
-		edid_ext = &edid->extensions[i];
-		edid_cea = &edid_ext->data.cea;
-
-		/* HDR not defined in CTA Extension Version < 3. */
-		if ((edid_ext->tag != EDID_EXT_CEA) ||
-		    (edid_cea->revision != CTA_EXTENSION_VERSION))
-				continue;
-		else {
-			offset = edid_cea->dtd_start;
-			cea_data = edid_cea->data;
-
-			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
-				ret = cta_block(cea_data + j);
-
-				if (ret)
-					break;
-			}
-		}
-	}
-
-	return ret;
-}
-
 /* Sets the HDR output metadata prop with invalid size. */
 static int set_invalid_hdr_output_metadata(data_t *data,
 					   struct hdr_output_metadata const *meta,
@@ -490,7 +357,7 @@ static void test_static_toggle(data_t *data, igt_crtc_t *crtc,
 
 	draw_hdr_pattern(&afb);
 
-	fill_hdr_output_metadata_st2084(&hdr);
+	igt_hdr_fill_output_metadata_st2084(&hdr);
 
 	/* Start with no metadata. */
 	igt_plane_set_fb(data->primary, &afb);
@@ -559,36 +426,6 @@ cleanup:
 	igt_remove_fb(data->fd, &afb);
 }
 
-/* Fills some test values for HDR metadata targeting SDR. */
-static void fill_hdr_output_metadata_sdr(struct hdr_output_metadata *meta)
-{
-	memset(meta, 0, sizeof(*meta));
-
-	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
-	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
-
-	/* Rec. 709 */
-	meta->hdmi_metadata_type1.display_primaries[0].x =
-		calc_hdr_float(0.640); /* Red */
-	meta->hdmi_metadata_type1.display_primaries[0].y =
-		calc_hdr_float(0.330);
-	meta->hdmi_metadata_type1.display_primaries[1].x =
-		calc_hdr_float(0.300); /* Green */
-	meta->hdmi_metadata_type1.display_primaries[1].y =
-		calc_hdr_float(0.600);
-	meta->hdmi_metadata_type1.display_primaries[2].x =
-		calc_hdr_float(0.150); /* Blue */
-	meta->hdmi_metadata_type1.display_primaries[2].y =
-		calc_hdr_float(0.006);
-	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
-	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
-
-	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
-	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
-	meta->hdmi_metadata_type1.max_fall = 0;
-	meta->hdmi_metadata_type1.max_cll = 0;
-}
-
 static void test_static_swap(data_t *data, igt_crtc_t *crtc,
 			     igt_output_t *output, uint32_t flags)
 {
@@ -625,7 +462,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
 	}
 
 	/* Enter HDR, a modeset is allowed here. */
-	fill_hdr_output_metadata_st2084(&hdr);
+	igt_hdr_fill_output_metadata_st2084(&hdr);
 	set_hdr_output_metadata(data, &hdr);
 	igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
 	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
@@ -654,7 +491,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
 	/* Enter SDR via metadata, no modeset allowed for
 	 * amd driver, whereas a modeset is required for
 	 * intel driver. */
-	fill_hdr_output_metadata_sdr(&hdr);
+	igt_hdr_fill_output_metadata_sdr(&hdr);
 	set_hdr_output_metadata(data, &hdr);
 	if (is_amdgpu_device(data->fd))
 		igt_display_commit_atomic(display, 0, NULL);
@@ -687,7 +524,7 @@ static void test_invalid_metadata_sizes(data_t *data, igt_output_t *output)
 	struct hdr_output_metadata hdr;
 	size_t metadata_size = sizeof(hdr);
 
-	fill_hdr_output_metadata_st2084(&hdr);
+	igt_hdr_fill_output_metadata_st2084(&hdr);
 
 	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, 1), -EINVAL);
 	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, metadata_size + 1), -EINVAL);
@@ -725,13 +562,13 @@ static void test_hdr(data_t *data, uint32_t flags)
 		}
 
 		/* For negative test, panel should be non-hdr. */
-		if ((flags & TEST_INVALID_HDR) && is_panel_hdr(data, output)) {
+		if ((flags & TEST_INVALID_HDR) && igt_hdr_is_panel_hdr(data->fd, output->id)) {
 			igt_info("%s: Can't run negative test on HDR panel.\n",
 				 igt_output_name(output));
 			continue;
 		}
 
-		if ((flags & ~TEST_INVALID_HDR) && !is_panel_hdr(data, output)) {
+		if ((flags & ~TEST_INVALID_HDR) && !igt_hdr_is_panel_hdr(data->fd, output->id)) {
 			igt_info("%s: Can't run HDR tests on non-HDR panel.\n",
 				 igt_output_name(output));
 			continue;
@@ -760,7 +597,7 @@ static void test_hdr(data_t *data, uint32_t flags)
 				     crtc);
 
 			/* Signal HDR requirement via metadata */
-			fill_hdr_output_metadata_st2084(&hdr);
+			igt_hdr_fill_output_metadata_st2084(&hdr);
 			set_hdr_output_metadata(data, &hdr);
 			if (igt_display_try_commit2(display, display->is_atomic ?
 						    COMMIT_ATOMIC : COMMIT_LEGACY)) {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
@ 2026-03-17 17:51 ` Alex Hung
  2026-03-18  9:52   ` Kamil Konieczny
  2026-03-19  8:54   ` Jani Nikula
  2026-03-17 17:51 ` [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking Alex Hung
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 14+ messages in thread
From: Alex Hung @ 2026-03-17 17:51 UTC (permalink / raw)
  To: igt-dev; +Cc: wayne.lin, Mark.Broadworth, Alex Hung

From: Wayne Lin <wayne.lin@amd.com>

Add a visual verification tool for AMD HDR display output. This tool
displays HDR test patterns with different metadata types and waits for
user confirmation, enabling manual inspection of HDR output quality.

Subtests:
- static-swap-smpte2084: Display with SMPTE ST2084 (PQ) HDR metadata
- static-swap-traditional-sdr: Display with traditional SDR gamma metadata

Co-developed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
---
 tools/amd_hdr_visual.c | 372 +++++++++++++++++++++++++++++++++++++++++
 tools/meson.build      |   5 +
 2 files changed, 377 insertions(+)
 create mode 100644 tools/amd_hdr_visual.c

diff --git a/tools/amd_hdr_visual.c b/tools/amd_hdr_visual.c
new file mode 100644
index 000000000..58decb356
--- /dev/null
+++ b/tools/amd_hdr_visual.c
@@ -0,0 +1,372 @@
+/*
+ * Copyright 2026 Advanced Micro Devices, Inc.
+ *
+ * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 <fcntl.h>
+#include <termios.h>
+#include <unistd.h>
+#include "igt_edid.h"
+#include "igt_hdr.h"
+
+IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
+
+/* Test flags. */
+enum {
+	TEST_NONE = 1 << 0,
+	TEST_DPMS = 1 << 1,
+	TEST_SUSPEND = 1 << 2,
+	TEST_SWAP = 1 << 3,
+};
+
+/* BPC connector state. */
+typedef struct output_bpc {
+	unsigned int current;
+	unsigned int maximum;
+} output_bpc_t;
+
+/* Common test data. */
+typedef struct data {
+	igt_display_t display;
+	igt_plane_t *primary;
+	igt_output_t *output;
+	igt_crtc_t *pipe;
+	igt_pipe_crc_t *pipe_crc;
+	drmModeModeInfo *mode;
+	enum pipe pipe_id;
+	int fd;
+	int w;
+	int h;
+} data_t;
+
+/* Common test cleanup. */
+static void test_fini(data_t *data)
+{
+	igt_pipe_crc_free(data->pipe_crc);
+	igt_display_reset(&data->display);
+}
+
+static void test_cycle_flags(data_t *data, uint32_t test_flags)
+{
+	if (test_flags & TEST_DPMS) {
+		kmstest_set_connector_dpms(data->fd,
+					   data->output->config.connector,
+					   DRM_MODE_DPMS_OFF);
+		kmstest_set_connector_dpms(data->fd,
+					   data->output->config.connector,
+					   DRM_MODE_DPMS_ON);
+	}
+
+	if (test_flags & TEST_SUSPEND)
+		igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
+					      SUSPEND_TEST_NONE);
+}
+
+/* Returns the current and maximum bpc from the connector debugfs. */
+static output_bpc_t get_output_bpc(data_t *data)
+{
+	char buf[256];
+	char *start_loc;
+	int fd, res;
+	output_bpc_t info;
+
+	fd = igt_debugfs_connector_dir(data->fd, data->output->name, O_RDONLY);
+	igt_assert(fd >= 0);
+
+	res = igt_debugfs_simple_read(fd, "output_bpc", buf, sizeof(buf));
+
+	igt_require(res > 0);
+
+	close(fd);
+
+	igt_assert(start_loc = strstr(buf, "Current: "));
+	igt_assert_eq(sscanf(start_loc, "Current: %u", &info.current), 1);
+
+	igt_assert(start_loc = strstr(buf, "Maximum: "));
+	igt_assert_eq(sscanf(start_loc, "Maximum: %u", &info.maximum), 1);
+
+	return info;
+}
+
+/* Verifies that connector has the correct output bpc. */
+static void assert_output_bpc(data_t *data, unsigned int bpc)
+{
+	output_bpc_t info = get_output_bpc(data);
+
+	igt_require_f(info.maximum >= bpc,
+		      "Monitor doesn't support %u bpc, max is %u\n", bpc,
+		      info.maximum);
+
+	igt_assert_eq(info.current, bpc);
+}
+
+/* Fills the FB with a test HDR pattern. */
+static void draw_hdr_pattern(igt_fb_t *fb)
+{
+	cairo_t *cr = igt_get_cairo_ctx(fb->fd, fb);
+
+	igt_paint_color(cr, 0, 0, fb->width, fb->height, 1.0, 1.0, 1.0);
+	igt_paint_test_pattern(cr, fb->width, fb->height);
+
+	igt_put_cairo_ctx(cr);
+}
+
+/* Prepare test data. */
+static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
+{
+	igt_display_t *display = &data->display;
+
+	data->pipe_id = pipe;
+	data->pipe = &data->display.crtcs[data->pipe_id];
+	igt_assert(data->pipe);
+
+	igt_display_reset(display);
+
+	data->output = output;
+	igt_assert(data->output);
+
+	data->mode = igt_output_get_mode(data->output);
+	igt_assert(data->mode);
+
+	data->primary =
+		igt_crtc_get_plane_type(data->pipe, DRM_PLANE_TYPE_PRIMARY);
+
+	data->pipe_crc = igt_pipe_crc_new(data->fd, data->pipe_id,
+					  IGT_PIPE_CRC_SOURCE_AUTO);
+
+	igt_output_set_crtc(data->output, igt_crtc_for_pipe(display, data->pipe_id));
+
+	data->w = data->mode->hdisplay;
+	data->h = data->mode->vdisplay;
+}
+
+static bool igt_crtc_is_free(igt_display_t *display, igt_crtc_t *crtc)
+{
+	int i;
+
+	for (i = 0; i < display->n_outputs; i++)
+		if (display->outputs[i].pending_crtc == crtc)
+			return false;
+
+	return true;
+}
+
+/* Returns true if an output supports max bpc property. */
+static bool has_max_bpc(igt_output_t *output)
+{
+	return igt_output_has_prop(output, IGT_CONNECTOR_MAX_BPC) &&
+	       igt_output_get_prop(output, IGT_CONNECTOR_MAX_BPC);
+}
+
+
+
+/* Sets the HDR output metadata prop. */
+static void set_hdr_output_metadata(data_t *data,
+				    struct hdr_output_metadata const *meta)
+{
+	igt_output_replace_prop_blob(data->output,
+				     IGT_CONNECTOR_HDR_OUTPUT_METADATA, meta,
+				     meta ? sizeof(*meta) : 0);
+}
+
+
+
+static void test_static_toggle(data_t *data, igt_output_t *output,
+			       uint32_t flags)
+{
+	igt_display_t *display = &data->display;
+	struct hdr_output_metadata hdr;
+	igt_crc_t ref_crc, new_crc;
+	igt_crtc_t *crtc;
+	igt_fb_t afb;
+	int afb_id;
+
+	for_each_crtc(display, crtc) {
+		if (!igt_crtc_connector_valid(crtc, output))
+			continue;
+
+		if (!igt_crtc_is_free(display, crtc))
+			continue;
+
+		prepare_test(data, output, crtc->pipe);
+
+		/* 10-bit formats are slow, so limit the size. */
+		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
+		igt_assert(afb_id);
+
+		draw_hdr_pattern(&afb);
+
+		igt_hdr_fill_output_metadata_st2084(&hdr);
+
+		/* Start with no metadata. */
+		igt_plane_set_fb(data->primary, &afb);
+		igt_plane_set_size(data->primary, data->w, data->h);
+		set_hdr_output_metadata(data, NULL);
+		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
+		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+		if (is_amdgpu_device(data->fd))
+			assert_output_bpc(data, 8);
+
+		/* Apply HDR metadata and 10bpc. We expect a modeset for entering. */
+		set_hdr_output_metadata(data, &hdr);
+		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
+		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+		if (is_amdgpu_device(data->fd))
+			assert_output_bpc(data, 10);
+
+		/* Verify that the CRC are equal after DPMS or suspend. */
+		igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc);
+		test_cycle_flags(data, flags);
+		igt_pipe_crc_collect_crc(data->pipe_crc, &new_crc);
+
+		/* Disable HDR metadata and drop back to 8bpc. We expect a modeset for exiting. */
+		set_hdr_output_metadata(data, NULL);
+		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
+		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+		if (is_amdgpu_device(data->fd))
+			assert_output_bpc(data, 8);
+
+		igt_assert_crc_equal(&ref_crc, &new_crc);
+
+		test_fini(data);
+		igt_remove_fb(data->fd, &afb);
+
+		break;
+	}
+}
+
+static void test_static_swap(data_t *data, igt_output_t *output,
+			     void (*fill_metadata)(struct hdr_output_metadata *),
+			     const char *mode_name)
+{
+	igt_display_t *display = &data->display;
+	igt_crtc_t *crtc;
+	igt_fb_t afb;
+	int afb_id;
+	struct hdr_output_metadata hdr;
+
+	for_each_crtc(display, crtc) {
+		if (!igt_crtc_connector_valid(crtc, output))
+			continue;
+
+		if (!igt_crtc_is_free(display, crtc))
+			continue;
+
+		prepare_test(data, output, crtc->pipe);
+
+		/* 10-bit formats are slow, so limit the size. */
+		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
+		igt_assert(afb_id);
+
+		draw_hdr_pattern(&afb);
+
+		/* Start in the specified HDR mode. */
+		igt_plane_set_fb(data->primary, &afb);
+		igt_plane_set_size(data->primary, data->w, data->h);
+		fill_metadata(&hdr);
+		set_hdr_output_metadata(data, &hdr);
+		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
+		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+
+		igt_info("wait %s!\n", mode_name);
+		igt_debug_wait_for_keypress(mode_name);
+
+		/* Exit HDR mode and enter 8bpc, cleanup. */
+		set_hdr_output_metadata(data, NULL);
+		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
+		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+
+		test_fini(data);
+		igt_remove_fb(data->fd, &afb);
+
+		break;
+	}
+}
+
+/* Returns true if an output supports HDR metadata property. */
+static bool has_hdr(igt_output_t *output)
+{
+	return igt_output_has_prop(output, IGT_CONNECTOR_HDR_OUTPUT_METADATA);
+}
+
+static void test_hdr(data_t *data, const char *test_name, uint32_t flags,
+		    void (*fill_metadata)(struct hdr_output_metadata *),
+		    const char *mode_name)
+{
+	igt_output_t *output;
+	int valid_tests = 0;
+
+	for_each_connected_output(&data->display, output) {
+		/* To test HDR, 10 bpc is required, so we need to
+		 * set MAX_BPC property to 10bpc prior to setting
+		 * HDR metadata property. Therefore, checking.
+		 */
+		if (!has_max_bpc(output) || !has_hdr(output)) {
+			igt_info("%s connector not found with HDR metadata/max_bpc connector property\n", output->name);
+			continue;
+		}
+
+		if (!igt_hdr_is_panel_hdr(data->fd, output->id)) {
+			igt_info("Panel attached via %s connector is non-HDR\n", output->name);
+			continue;
+		}
+
+		igt_info("HDR %s test execution on %s\n", test_name, output->name);
+		if (flags & TEST_NONE || flags & TEST_DPMS || flags & TEST_SUSPEND)
+			test_static_toggle(data, output, flags);
+		if (flags & TEST_SWAP)
+			test_static_swap(data, output, fill_metadata, mode_name);
+
+		valid_tests++;
+	}
+
+	igt_require_f(valid_tests, "No connector found with HDR metadata/max_bpc connector property (or) panel is non-HDR\n");
+}
+
+int igt_main()
+{
+	data_t data = { 0 };
+
+	igt_fixture() {
+		data.fd = drm_open_driver_master(DRIVER_AMDGPU);
+
+		kmstest_set_vt_graphics_mode();
+
+		igt_display_require(&data.display, data.fd);
+		igt_require(data.display.is_atomic);
+
+		igt_display_require_output(&data.display);
+	}
+
+	igt_describe("Tests swapping to SMPTE ST2084 HDR metadata");
+	igt_subtest("static-swap-smpte2084")
+		test_hdr(&data, "static-swap-smpte2084", TEST_SWAP,
+			 igt_hdr_fill_output_metadata_st2084, "smpte2084");
+
+	igt_describe("Tests swapping to traditional SDR gamma HDR metadata");
+	igt_subtest("static-swap-traditional-sdr")
+		test_hdr(&data, "static-swap-traditional-sdr", TEST_SWAP,
+			 igt_hdr_fill_output_metadata_sdr, "traditional-sdr");
+
+	igt_fixture() {
+		igt_display_fini(&data.display);
+	}
+}
diff --git a/tools/meson.build b/tools/meson.build
index 8185ba160..9612acd83 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -104,6 +104,11 @@ executable('amd_hdmi_compliance', 'amd_hdmi_compliance.c',
 	   install_rpath : bindir_rpathdir,
 	   install : true)
 
+executable('amd_hdr_visual', 'amd_hdr_visual.c',
+	   dependencies : [tool_deps],
+	   install_rpath : bindir_rpathdir,
+	   install : true)
+
 if libudev.found()
 	msm_dp_compliance_src = [
 		'msm_dp_compliance.c',
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
  2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
@ 2026-03-17 17:51 ` Alex Hung
  2026-03-18  9:55   ` Kamil Konieczny
  2026-03-18  0:50 ` ✓ Xe.CI.BAT: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Patchwork
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Alex Hung @ 2026-03-17 17:51 UTC (permalink / raw)
  To: igt-dev; +Cc: wayne.lin, Mark.Broadworth, Alex Hung

EOTF values are bit positions, not masks. Use (1 << value) to create
proper bit masks when checking HDR support in CTA-861 EDID blocks.

Signed-off-by: Alex Hung <alex.hung@amd.com>
---
 lib/igt_hdr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/igt_hdr.c b/lib/igt_hdr.c
index 6368ae78b..e1bd69087 100644
--- a/lib/igt_hdr.c
+++ b/lib/igt_hdr.c
@@ -151,8 +151,8 @@ bool igt_hdr_cta_block_has_hdr(const char *edid_ext)
 {
 	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
 	     (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
-	    ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
-	     (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
+	    ((edid_ext[2] & (1 << HDMI_EOTF_TRADITIONAL_GAMMA_HDR)) ||
+	     (edid_ext[2] & (1 << HDMI_EOTF_SMPTE_ST2084))))
 			return true;
 
 	return false;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* ✓ Xe.CI.BAT: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
  2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
  2026-03-17 17:51 ` [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking Alex Hung
@ 2026-03-18  0:50 ` Patchwork
  2026-03-18  1:04 ` ✓ i915.CI.BAT: " Patchwork
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2026-03-18  0:50 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 6124 bytes --]

== Series Details ==

Series: series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
URL   : https://patchwork.freedesktop.org/series/163396/
State : success

== Summary ==

CI Bug Log - changes from XEIGT_8807_BAT -> XEIGTPW_14795_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (12 -> 14)
------------------------------

  Additional (2): bat-adlp-7 bat-bmg-3 

Known issues
------------

  Here are the changes found in XEIGTPW_14795_BAT that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_dsc@dsc-basic:
    - bat-adlp-7:         NOTRUN -> [SKIP][1] ([Intel XE#2244] / [Intel XE#455])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@kms_dsc@dsc-basic.html

  * igt@kms_flip@basic-flip-vs-dpms:
    - bat-adlp-7:         NOTRUN -> [DMESG-WARN][2] ([Intel XE#7483]) +12 other tests dmesg-warn
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@kms_flip@basic-flip-vs-dpms.html

  * igt@xe_evict@evict-beng-small:
    - bat-adlp-7:         NOTRUN -> [SKIP][3] ([Intel XE#261] / [Intel XE#5564] / [Intel XE#688]) +9 other tests skip
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_evict@evict-beng-small.html

  * igt@xe_evict_ccs@evict-overcommit-parallel-nofree-samefd:
    - bat-adlp-7:         NOTRUN -> [SKIP][4] ([Intel XE#5563] / [Intel XE#688]) +1 other test skip
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_evict_ccs@evict-overcommit-parallel-nofree-samefd.html

  * igt@xe_exec_balancer@twice-cm-virtual-userptr:
    - bat-adlp-7:         NOTRUN -> [SKIP][5] ([Intel XE#7482]) +17 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_exec_balancer@twice-cm-virtual-userptr.html

  * igt@xe_exec_fault_mode@twice-rebind-prefetch:
    - bat-adlp-7:         NOTRUN -> [SKIP][6] ([Intel XE#288] / [Intel XE#5561]) +32 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_exec_fault_mode@twice-rebind-prefetch.html

  * igt@xe_live_ktest@xe_bo:
    - bat-adlp-7:         NOTRUN -> [SKIP][7] ([Intel XE#2229] / [Intel XE#455]) +2 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_live_ktest@xe_bo.html

  * igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit:
    - bat-adlp-7:         NOTRUN -> [SKIP][8] ([Intel XE#2229] / [Intel XE#5488])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_live_ktest@xe_migrate@xe_validate_ccs_kunit.html

  * igt@xe_mmap@vram:
    - bat-adlp-7:         NOTRUN -> [SKIP][9] ([Intel XE#1008] / [Intel XE#5591])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_mmap@vram.html

  * igt@xe_pat@pat-index-xe2:
    - bat-adlp-7:         NOTRUN -> [SKIP][10] ([Intel XE#977])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_pat@pat-index-xe2.html

  * igt@xe_pat@pat-index-xehpc:
    - bat-adlp-7:         NOTRUN -> [SKIP][11] ([Intel XE#2838] / [Intel XE#979])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_pat@pat-index-xehpc.html

  * igt@xe_pat@pat-index-xelpg:
    - bat-adlp-7:         NOTRUN -> [SKIP][12] ([Intel XE#979])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-adlp-7/igt@xe_pat@pat-index-xelpg.html

  * igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p:
    - bat-bmg-3:          NOTRUN -> [SKIP][13] ([Intel XE#6566]) +3 other tests skip
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-bmg-3/igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p.html

  * igt@xe_waitfence@abstime:
    - bat-dg2-oem2:       [PASS][14] -> [TIMEOUT][15] ([Intel XE#6506])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/bat-dg2-oem2/igt@xe_waitfence@abstime.html
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/bat-dg2-oem2/igt@xe_waitfence@abstime.html

  
  [Intel XE#1008]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1008
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
  [Intel XE#2838]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2838
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#5488]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5488
  [Intel XE#5561]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5561
  [Intel XE#5563]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5563
  [Intel XE#5564]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5564
  [Intel XE#5591]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5591
  [Intel XE#6506]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6506
  [Intel XE#6566]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6566
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
  [Intel XE#7483]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7483
  [Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
  [Intel XE#979]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/979


Build changes
-------------

  * IGT: IGT_8807 -> IGTPW_14795
  * Linux: xe-4735-113073d07f958385b5b80d29b62e10d2cf0181d6 -> xe-4740-c479cdf62a3f9a6101dd020abbc471f35142b3d1

  IGTPW_14795: 14795
  IGT_8807: 7f44d96d705f1583d689f1f8c2275b685b4ca11d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4735-113073d07f958385b5b80d29b62e10d2cf0181d6: 113073d07f958385b5b80d29b62e10d2cf0181d6
  xe-4740-c479cdf62a3f9a6101dd020abbc471f35142b3d1: c479cdf62a3f9a6101dd020abbc471f35142b3d1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/index.html

[-- Attachment #2: Type: text/html, Size: 7253 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* ✓ i915.CI.BAT: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
                   ` (2 preceding siblings ...)
  2026-03-18  0:50 ` ✓ Xe.CI.BAT: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Patchwork
@ 2026-03-18  1:04 ` Patchwork
  2026-03-18  7:34 ` [PATCH 1/3] " Sharma, Swati2
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2026-03-18  1:04 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 2486 bytes --]

== Series Details ==

Series: series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
URL   : https://patchwork.freedesktop.org/series/163396/
State : success

== Summary ==

CI Bug Log - changes from IGT_8807 -> IGTPW_14795
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14795/index.html

Participating hosts (42 -> 40)
------------------------------

  Missing    (2): bat-dg2-13 fi-snb-2520m 

Known issues
------------

  Here are the changes found in IGTPW_14795 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@i915_selftest@live:
    - bat-mtlp-8:         [PASS][1] -> [DMESG-FAIL][2] ([i915#12061]) +1 other test dmesg-fail
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8807/bat-mtlp-8/igt@i915_selftest@live.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14795/bat-mtlp-8/igt@i915_selftest@live.html

  * igt@i915_selftest@live@workarounds:
    - bat-dg2-14:         [PASS][3] -> [DMESG-FAIL][4] ([i915#12061]) +1 other test dmesg-fail
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8807/bat-dg2-14/igt@i915_selftest@live@workarounds.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14795/bat-dg2-14/igt@i915_selftest@live@workarounds.html

  
#### Possible fixes ####

  * igt@i915_pm_rpm@module-reload:
    - bat-adlp-6:         [DMESG-WARN][5] ([i915#15673]) -> [PASS][6] +78 other tests pass
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8807/bat-adlp-6/igt@i915_pm_rpm@module-reload.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14795/bat-adlp-6/igt@i915_pm_rpm@module-reload.html

  
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#15673]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15673


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_8807 -> IGTPW_14795
  * Linux: CI_DRM_18164 -> CI_DRM_18169

  CI-20190529: 20190529
  CI_DRM_18164: 113073d07f958385b5b80d29b62e10d2cf0181d6 @ git://anongit.freedesktop.org/gfx-ci/linux
  CI_DRM_18169: c479cdf62a3f9a6101dd020abbc471f35142b3d1 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_14795: 14795
  IGT_8807: 7f44d96d705f1583d689f1f8c2275b685b4ca11d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14795/index.html

[-- Attachment #2: Type: text/html, Size: 3226 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
                   ` (3 preceding siblings ...)
  2026-03-18  1:04 ` ✓ i915.CI.BAT: " Patchwork
@ 2026-03-18  7:34 ` Sharma, Swati2
  2026-03-18 18:40   ` Alex Hung
  2026-03-18  9:30 ` Kamil Konieczny
  2026-03-19 13:42 ` ✓ Xe.CI.FULL: success for series starting with [1/3] " Patchwork
  6 siblings, 1 reply; 14+ messages in thread
From: Sharma, Swati2 @ 2026-03-18  7:34 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: wayne.lin, Mark.Broadworth

Hi Alex,

We already ahve patch series to extract HDR in separate lib

https://patchwork.freedesktop.org/series/158425/

Series is reviewed. Need to fix CI regression.

Can you please add your patches on top of this?

On 17-03-2026 11:21 pm, Alex Hung wrote:
> Move HDR utility functions from kms_hdr test into a reusable library
> module. This includes metadata filling, EDID parsing, and conversion
> functions.
>
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> ---
>   lib/igt_hdr.c   | 220 ++++++++++++++++++++++++++++++++++++++++++++++++
>   lib/igt_hdr.h   |  58 +++++++++++++
>   lib/meson.build |   1 +
>   tests/kms_hdr.c | 179 ++-------------------------------------
>   4 files changed, 287 insertions(+), 171 deletions(-)
>   create mode 100644 lib/igt_hdr.c
>   create mode 100644 lib/igt_hdr.h
>
> diff --git a/lib/igt_hdr.c b/lib/igt_hdr.c
> new file mode 100644
> index 000000000..6368ae78b
> --- /dev/null
> +++ b/lib/igt_hdr.c
> @@ -0,0 +1,220 @@
> +/*
> + * Copyright © 2026 Advanced Micro Devices, Inc.
> + *
> + * 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 <string.h>
> +#include <drm.h>
> +#include <drm_mode.h>
> +
> +#include "igt.h"
> +#include "igt_hdr.h"
> +#include "igt_edid.h"
> +
> +/**
> + * SECTION:igt_hdr
> + * @short_description: HDR (High Dynamic Range) helper library
> + * @title: HDR
> + * @include: igt_hdr.h
> + *
> + * This library provides helper functions for working with HDR metadata
> + * and HDR display capabilities.
> + */
> +
> +/**
> + * igt_hdr_calc_hdr_float:
> + * @val: The value to convert
> + *
> + * Converts a double to 861-G spec FP format
> + *
> + * Returns: The value converted to HDR floating point format
> + */
> +uint16_t igt_hdr_calc_hdr_float(double val)
> +{
> +	return (uint16_t)(val * 50000.0);
> +}
> +
> +/**
> + * igt_hdr_fill_output_metadata_st2084:
> + * @meta: Pointer to hdr_output_metadata structure to fill
> + *
> + * Fills HDR output metadata structure with test values for ST2084 (PQ) EOTF.
> + * Uses Rec. 2020 color primaries and typical HDR mastering display characteristics.
> + *
> + * Note: there isn't really a standard for what the metadata is supposed
> + * to do on the display side of things. The display is free to ignore it
> + * and clip the output, use it to help tonemap to the content range,
> + * or do anything they want, really.
> + */
> +void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta)
> +{
> +	memset(meta, 0, sizeof(*meta));
> +
> +	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> +	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
> +
> +	/* Rec. 2020 */
> +	meta->hdmi_metadata_type1.display_primaries[0].x =
> +		igt_hdr_calc_hdr_float(0.708); /* Red */
> +	meta->hdmi_metadata_type1.display_primaries[0].y =
> +		igt_hdr_calc_hdr_float(0.292);
> +	meta->hdmi_metadata_type1.display_primaries[1].x =
> +		igt_hdr_calc_hdr_float(0.170); /* Green */
> +	meta->hdmi_metadata_type1.display_primaries[1].y =
> +		igt_hdr_calc_hdr_float(0.797);
> +	meta->hdmi_metadata_type1.display_primaries[2].x =
> +		igt_hdr_calc_hdr_float(0.131); /* Blue */
> +	meta->hdmi_metadata_type1.display_primaries[2].y =
> +		igt_hdr_calc_hdr_float(0.046);
> +	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
> +	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
> +
> +	meta->hdmi_metadata_type1.max_display_mastering_luminance =
> +		1000; /* 1000 nits */
> +	meta->hdmi_metadata_type1.min_display_mastering_luminance =
> +		500;				   /* 0.05 nits */
> +	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
> +	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
> +}
> +
> +/**
> + * igt_hdr_fill_output_metadata_sdr:
> + * @meta: Pointer to hdr_output_metadata structure to fill
> + *
> + * Fills HDR output metadata structure with test values targeting SDR.
> + */
> +void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta)
> +{
> +	memset(meta, 0, sizeof(*meta));
> +
> +	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> +	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
> +
> +	/* Rec. 709 */
> +	meta->hdmi_metadata_type1.display_primaries[0].x =
> +		igt_hdr_calc_hdr_float(0.640); /* Red */
> +	meta->hdmi_metadata_type1.display_primaries[0].y =
> +		igt_hdr_calc_hdr_float(0.330);
> +	meta->hdmi_metadata_type1.display_primaries[1].x =
> +		igt_hdr_calc_hdr_float(0.300); /* Green */
> +	meta->hdmi_metadata_type1.display_primaries[1].y =
> +		igt_hdr_calc_hdr_float(0.600);
> +	meta->hdmi_metadata_type1.display_primaries[2].x =
> +		igt_hdr_calc_hdr_float(0.150); /* Blue */
> +	meta->hdmi_metadata_type1.display_primaries[2].y =
> +		igt_hdr_calc_hdr_float(0.006);
> +	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
> +	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
> +
> +	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
> +	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
> +	meta->hdmi_metadata_type1.max_fall = 0;
> +	meta->hdmi_metadata_type1.max_cll = 0;
> +}
> +
> +/**
> + * igt_hdr_cta_block_has_hdr:
> + * @edid_ext: Pointer to CTA extension block data
> + *
> + * Checks if a CTA extension block indicates HDR support.
> + *
> + * Byte 1: 0x07 indicates Extended Tag
> + * Byte 2: 0x06 indicates HDMI Static Metadata Block
> + * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
> + *         where ET_0: Traditional Gamma - SDR Luminance Range
> + *               ET_1: Traditional Gamma - HDR Luminance Range
> + *               ET_2: SMPTE ST 2084
> + *               ET_3: Hybrid Log-Gamma (HLG)
> + *               ET_4 to ET_5: Reserved for future use
> + *
> + * Returns: true if the block indicates HDR support, false otherwise
> + */
> +bool igt_hdr_cta_block_has_hdr(const char *edid_ext)
> +{
> +	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
> +	     (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> +	    ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> +	     (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> +			return true;
> +
> +	return false;
> +}
> +
> +/**
> + * igt_hdr_is_panel_hdr:
> + * @drm_fd: DRM file descriptor
> + * @connector_id: KMS connector ID
> + *
> + * Checks if a panel/display supports HDR by parsing its EDID.
> + * Looks for HDR Static Metadata Block in CTA extension.
> + *
> + * Returns: true if the panel supports HDR, false otherwise
> + */
> +bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id)
> +{
> +	bool ok;
> +	int i, j, offset;
> +	uint64_t edid_blob_id;
> +	drmModePropertyBlobRes *edid_blob;
> +	const struct edid_ext *edid_ext;
> +	const struct edid *edid;
> +	const struct edid_cea *edid_cea;
> +	const char *cea_data;
> +	bool ret = false;
> +
> +	ok = kmstest_get_property(drm_fd, connector_id,
> +			DRM_MODE_OBJECT_CONNECTOR, "EDID",
> +			NULL, &edid_blob_id, NULL);
> +
> +	if (!ok || !edid_blob_id)
> +		return ret;
> +
> +	edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
> +	igt_assert(edid_blob);
> +
> +	edid = (const struct edid *) edid_blob->data;
> +	igt_assert(edid);
> +
> +	drmModeFreePropertyBlob(edid_blob);
> +
> +	for (i = 0; i < edid->extensions_len; i++) {
> +		edid_ext = &edid->extensions[i];
> +		edid_cea = &edid_ext->data.cea;
> +
> +		/* HDR not defined in CTA Extension Version < 3. */
> +		if ((edid_ext->tag != EDID_EXT_CEA) ||
> +		    (edid_cea->revision != CTA_EXTENSION_VERSION))
> +				continue;
> +		else {
> +			offset = edid_cea->dtd_start;
> +			cea_data = edid_cea->data;
> +
> +			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
> +				ret = igt_hdr_cta_block_has_hdr(cea_data + j);
> +
> +				if (ret)
> +					break;
> +			}
> +		}
> +	}
> +
> +	return ret;
> +}
> diff --git a/lib/igt_hdr.h b/lib/igt_hdr.h
> new file mode 100644
> index 000000000..a6faef443
> --- /dev/null
> +++ b/lib/igt_hdr.h
> @@ -0,0 +1,58 @@
> +/*
> + * Copyright © 2026 Advanced Micro Devices, Inc.
> + *
> + * 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_HDR_H
> +#define IGT_HDR_H
> +
> +#include "config.h"
> +
> +#include <stdbool.h>
> +#include <stdint.h>
> +#include <linux/types.h>
> +
> +struct hdr_output_metadata;
> +struct igt_fb;
> +
> +/* HDR EDID parsing. */
> +#define CTA_EXTENSION_VERSION		0x03
> +#define HDR_STATIC_METADATA_BLOCK       0x06
> +#define USE_EXTENDED_TAG		0x07
> +
> +/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
> +enum hdmi_metadata_type {
> +	HDMI_STATIC_METADATA_TYPE1 = 0,
> +};
> +
> +enum hdmi_eotf {
> +	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
> +	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
> +	HDMI_EOTF_SMPTE_ST2084,
> +};
> +
> +uint16_t igt_hdr_calc_hdr_float(double val);
> +void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta);
> +void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta);
> +bool igt_hdr_cta_block_has_hdr(const char *edid_ext);
> +bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id);
> +
> +#endif /* IGT_HDR_H */
> diff --git a/lib/meson.build b/lib/meson.build
> index cd03e8f63..71ca60e66 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -114,6 +114,7 @@ lib_sources = [
>   	'igt_psr.c',
>   	'igt_amd.c',
>   	'igt_edid.c',
> +	'igt_hdr.c',
>   	'igt_eld.c',
>   	'igt_infoframe.c',
>   	'igt_color.c',
> diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c
> index f30902b72..382fcd823 100644
> --- a/tests/kms_hdr.c
> +++ b/tests/kms_hdr.c
> @@ -33,6 +33,7 @@
>   #include <termios.h>
>   #include <unistd.h>
>   #include "igt_edid.h"
> +#include "igt_hdr.h"
>   
>   /**
>    * SUBTEST: bpc-switch
> @@ -70,24 +71,8 @@
>   
>   IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
>   
> -/* HDR EDID parsing. */
> -#define CTA_EXTENSION_VERSION		0x03
> -#define HDR_STATIC_METADATA_BLOCK       0x06
> -#define USE_EXTENDED_TAG		0x07
> -
>   #define BACKLIGHT_PATH "/sys/class/backlight"
>   
> -/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
> -enum hdmi_metadata_type {
> -	HDMI_STATIC_METADATA_TYPE1 = 0,
> -};
> -
> -enum hdmi_eotf {
> -	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
> -	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
> -	HDMI_EOTF_SMPTE_ST2084,
> -};
> -
>   /* Test flags. */
>   enum {
>   	TEST_NONE = 1 << 0,
> @@ -148,50 +133,6 @@ static void draw_hdr_pattern(igt_fb_t *fb)
>   	igt_paint_test_pattern_color_fb(fb->fd, fb, 1.0, 1.0, 1.0);
>   }
>   
> -/* Converts a double to 861-G spec FP format. */
> -static uint16_t calc_hdr_float(double val)
> -{
> -	return (uint16_t)(val * 50000.0);
> -}
> -
> -/* Fills some test values for ST2084 HDR output metadata.
> - *
> - * Note: there isn't really a standard for what the metadata is supposed
> - * to do on the display side of things. The display is free to ignore it
> - * and clip the output, use it to help tonemap to the content range,
> - * or do anything they want, really.
> - */
> -static void fill_hdr_output_metadata_st2084(struct hdr_output_metadata *meta)
> -{
> -	memset(meta, 0, sizeof(*meta));
> -
> -	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> -	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
> -
> -	/* Rec. 2020 */
> -	meta->hdmi_metadata_type1.display_primaries[0].x =
> -		calc_hdr_float(0.708); /* Red */
> -	meta->hdmi_metadata_type1.display_primaries[0].y =
> -		calc_hdr_float(0.292);
> -	meta->hdmi_metadata_type1.display_primaries[1].x =
> -		calc_hdr_float(0.170); /* Green */
> -	meta->hdmi_metadata_type1.display_primaries[1].y =
> -		calc_hdr_float(0.797);
> -	meta->hdmi_metadata_type1.display_primaries[2].x =
> -		calc_hdr_float(0.131); /* Blue */
> -	meta->hdmi_metadata_type1.display_primaries[2].y =
> -		calc_hdr_float(0.046);
> -	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
> -	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
> -
> -	meta->hdmi_metadata_type1.max_display_mastering_luminance =
> -		1000; /* 1000 nits */
> -	meta->hdmi_metadata_type1.min_display_mastering_luminance =
> -		500;				   /* 0.05 nits */
> -	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
> -	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
> -}
> -
>   /* Sets the HDR output metadata prop. */
>   static void set_hdr_output_metadata(data_t *data,
>   				    struct hdr_output_metadata const *meta)
> @@ -365,80 +306,6 @@ static void test_bpc_switch(data_t *data, uint32_t flags)
>   	}
>   }
>   
> -static bool cta_block(const char *edid_ext)
> -{
> -	/*
> -	 * Byte 1: 0x07 indicates Extended Tag
> -	 * Byte 2: 0x06 indicates HDMI Static Metadata Block
> -	 * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
> -	 *	       where ET_0: Traditional Gamma - SDR Luminance Range
> -	 *	             ET_1: Traditional Gamma - HDR Luminance Range
> -	 *	             ET_2: SMPTE ST 2084
> -	 *	             ET_3: Hybrid Log-Gamma (HLG)
> -	 *	             ET_4 to ET_5: Reserved for future use
> -	 */
> -
> -	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
> -	      (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> -	     ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> -	      (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> -			return true;
> -
> -	return false;
> -}
> -
> -/* Returns true if panel supports HDR. */
> -static bool is_panel_hdr(data_t *data, igt_output_t *output)
> -{
> -	bool ok;
> -	int i, j, offset;
> -	uint64_t edid_blob_id;
> -	drmModePropertyBlobRes *edid_blob;
> -	const struct edid_ext *edid_ext;
> -	const struct edid *edid;
> -	const struct edid_cea *edid_cea;
> -	const char *cea_data;
> -	bool ret = false;
> -
> -	ok = kmstest_get_property(data->fd, output->id,
> -			DRM_MODE_OBJECT_CONNECTOR, "EDID",
> -			NULL, &edid_blob_id, NULL);
> -
> -	if (!ok || !edid_blob_id)
> -		return ret;
> -
> -	edid_blob = drmModeGetPropertyBlob(data->fd, edid_blob_id);
> -	igt_assert(edid_blob);
> -
> -	edid = (const struct edid *) edid_blob->data;
> -	igt_assert(edid);
> -
> -	drmModeFreePropertyBlob(edid_blob);
> -
> -	for (i = 0; i < edid->extensions_len; i++) {
> -		edid_ext = &edid->extensions[i];
> -		edid_cea = &edid_ext->data.cea;
> -
> -		/* HDR not defined in CTA Extension Version < 3. */
> -		if ((edid_ext->tag != EDID_EXT_CEA) ||
> -		    (edid_cea->revision != CTA_EXTENSION_VERSION))
> -				continue;
> -		else {
> -			offset = edid_cea->dtd_start;
> -			cea_data = edid_cea->data;
> -
> -			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
> -				ret = cta_block(cea_data + j);
> -
> -				if (ret)
> -					break;
> -			}
> -		}
> -	}
> -
> -	return ret;
> -}
> -
>   /* Sets the HDR output metadata prop with invalid size. */
>   static int set_invalid_hdr_output_metadata(data_t *data,
>   					   struct hdr_output_metadata const *meta,
> @@ -490,7 +357,7 @@ static void test_static_toggle(data_t *data, igt_crtc_t *crtc,
>   
>   	draw_hdr_pattern(&afb);
>   
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>   
>   	/* Start with no metadata. */
>   	igt_plane_set_fb(data->primary, &afb);
> @@ -559,36 +426,6 @@ cleanup:
>   	igt_remove_fb(data->fd, &afb);
>   }
>   
> -/* Fills some test values for HDR metadata targeting SDR. */
> -static void fill_hdr_output_metadata_sdr(struct hdr_output_metadata *meta)
> -{
> -	memset(meta, 0, sizeof(*meta));
> -
> -	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> -	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
> -
> -	/* Rec. 709 */
> -	meta->hdmi_metadata_type1.display_primaries[0].x =
> -		calc_hdr_float(0.640); /* Red */
> -	meta->hdmi_metadata_type1.display_primaries[0].y =
> -		calc_hdr_float(0.330);
> -	meta->hdmi_metadata_type1.display_primaries[1].x =
> -		calc_hdr_float(0.300); /* Green */
> -	meta->hdmi_metadata_type1.display_primaries[1].y =
> -		calc_hdr_float(0.600);
> -	meta->hdmi_metadata_type1.display_primaries[2].x =
> -		calc_hdr_float(0.150); /* Blue */
> -	meta->hdmi_metadata_type1.display_primaries[2].y =
> -		calc_hdr_float(0.006);
> -	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
> -	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
> -
> -	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
> -	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
> -	meta->hdmi_metadata_type1.max_fall = 0;
> -	meta->hdmi_metadata_type1.max_cll = 0;
> -}
> -
>   static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>   			     igt_output_t *output, uint32_t flags)
>   {
> @@ -625,7 +462,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>   	}
>   
>   	/* Enter HDR, a modeset is allowed here. */
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>   	set_hdr_output_metadata(data, &hdr);
>   	igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
>   	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> @@ -654,7 +491,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>   	/* Enter SDR via metadata, no modeset allowed for
>   	 * amd driver, whereas a modeset is required for
>   	 * intel driver. */
> -	fill_hdr_output_metadata_sdr(&hdr);
> +	igt_hdr_fill_output_metadata_sdr(&hdr);
>   	set_hdr_output_metadata(data, &hdr);
>   	if (is_amdgpu_device(data->fd))
>   		igt_display_commit_atomic(display, 0, NULL);
> @@ -687,7 +524,7 @@ static void test_invalid_metadata_sizes(data_t *data, igt_output_t *output)
>   	struct hdr_output_metadata hdr;
>   	size_t metadata_size = sizeof(hdr);
>   
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>   
>   	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, 1), -EINVAL);
>   	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, metadata_size + 1), -EINVAL);
> @@ -725,13 +562,13 @@ static void test_hdr(data_t *data, uint32_t flags)
>   		}
>   
>   		/* For negative test, panel should be non-hdr. */
> -		if ((flags & TEST_INVALID_HDR) && is_panel_hdr(data, output)) {
> +		if ((flags & TEST_INVALID_HDR) && igt_hdr_is_panel_hdr(data->fd, output->id)) {
>   			igt_info("%s: Can't run negative test on HDR panel.\n",
>   				 igt_output_name(output));
>   			continue;
>   		}
>   
> -		if ((flags & ~TEST_INVALID_HDR) && !is_panel_hdr(data, output)) {
> +		if ((flags & ~TEST_INVALID_HDR) && !igt_hdr_is_panel_hdr(data->fd, output->id)) {
>   			igt_info("%s: Can't run HDR tests on non-HDR panel.\n",
>   				 igt_output_name(output));
>   			continue;
> @@ -760,7 +597,7 @@ static void test_hdr(data_t *data, uint32_t flags)
>   				     crtc);
>   
>   			/* Signal HDR requirement via metadata */
> -			fill_hdr_output_metadata_st2084(&hdr);
> +			igt_hdr_fill_output_metadata_st2084(&hdr);
>   			set_hdr_output_metadata(data, &hdr);
>   			if (igt_display_try_commit2(display, display->is_atomic ?
>   						    COMMIT_ATOMIC : COMMIT_LEGACY)) {

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
                   ` (4 preceding siblings ...)
  2026-03-18  7:34 ` [PATCH 1/3] " Sharma, Swati2
@ 2026-03-18  9:30 ` Kamil Konieczny
  2026-03-19 13:42 ` ✓ Xe.CI.FULL: success for series starting with [1/3] " Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Kamil Konieczny @ 2026-03-18  9:30 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, wayne.lin, Mark.Broadworth

Hi Alex,
On 2026-03-17 at 11:51:30 -0600, Alex Hung wrote:
> Move HDR utility functions from kms_hdr test into a reusable library
> module. This includes metadata filling, EDID parsing, and conversion
> functions.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> ---
>  lib/igt_hdr.c   | 220 ++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_hdr.h   |  58 +++++++++++++
>  lib/meson.build |   1 +
>  tests/kms_hdr.c | 179 ++-------------------------------------
>  4 files changed, 287 insertions(+), 171 deletions(-)
>  create mode 100644 lib/igt_hdr.c
>  create mode 100644 lib/igt_hdr.h
> 
> diff --git a/lib/igt_hdr.c b/lib/igt_hdr.c
> new file mode 100644
> index 000000000..6368ae78b
> --- /dev/null
> +++ b/lib/igt_hdr.c
> @@ -0,0 +1,220 @@
> +/*

Add SPDX here.

> + * Copyright © 2026 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Remove this and below text, we use now SPDX instead.

> + * 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 <string.h>
> +#include <drm.h>
> +#include <drm_mode.h>
> +
> +#include "igt.h"
> +#include "igt_hdr.h"
> +#include "igt_edid.h"
> +
> +/**
> + * SECTION:igt_hdr
> + * @short_description: HDR (High Dynamic Range) helper library
> + * @title: HDR
> + * @include: igt_hdr.h
> + *
> + * This library provides helper functions for working with HDR metadata
> + * and HDR display capabilities.
> + */
> +
> +/**
> + * igt_hdr_calc_hdr_float:
> + * @val: The value to convert
> + *
> + * Converts a double to 861-G spec FP format
> + *
> + * Returns: The value converted to HDR floating point format
> + */
> +uint16_t igt_hdr_calc_hdr_float(double val)
> +{
> +	return (uint16_t)(val * 50000.0);
> +}
> +
> +/**
> + * igt_hdr_fill_output_metadata_st2084:
> + * @meta: Pointer to hdr_output_metadata structure to fill
> + *
> + * Fills HDR output metadata structure with test values for ST2084 (PQ) EOTF.
> + * Uses Rec. 2020 color primaries and typical HDR mastering display characteristics.
> + *
> + * Note: there isn't really a standard for what the metadata is supposed
> + * to do on the display side of things. The display is free to ignore it
> + * and clip the output, use it to help tonemap to the content range,
> + * or do anything they want, really.
> + */
> +void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta)
> +{
> +	memset(meta, 0, sizeof(*meta));
> +
> +	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> +	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
> +
> +	/* Rec. 2020 */
> +	meta->hdmi_metadata_type1.display_primaries[0].x =
> +		igt_hdr_calc_hdr_float(0.708); /* Red */
> +	meta->hdmi_metadata_type1.display_primaries[0].y =
> +		igt_hdr_calc_hdr_float(0.292);
> +	meta->hdmi_metadata_type1.display_primaries[1].x =
> +		igt_hdr_calc_hdr_float(0.170); /* Green */
> +	meta->hdmi_metadata_type1.display_primaries[1].y =
> +		igt_hdr_calc_hdr_float(0.797);
> +	meta->hdmi_metadata_type1.display_primaries[2].x =
> +		igt_hdr_calc_hdr_float(0.131); /* Blue */
> +	meta->hdmi_metadata_type1.display_primaries[2].y =
> +		igt_hdr_calc_hdr_float(0.046);
> +	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
> +	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
> +
> +	meta->hdmi_metadata_type1.max_display_mastering_luminance =
> +		1000; /* 1000 nits */
> +	meta->hdmi_metadata_type1.min_display_mastering_luminance =
> +		500;				   /* 0.05 nits */
> +	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
> +	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
> +}
> +
> +/**
> + * igt_hdr_fill_output_metadata_sdr:
> + * @meta: Pointer to hdr_output_metadata structure to fill
> + *
> + * Fills HDR output metadata structure with test values targeting SDR.
> + */
> +void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta)
> +{
> +	memset(meta, 0, sizeof(*meta));
> +
> +	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> +	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
> +
> +	/* Rec. 709 */
> +	meta->hdmi_metadata_type1.display_primaries[0].x =
> +		igt_hdr_calc_hdr_float(0.640); /* Red */
> +	meta->hdmi_metadata_type1.display_primaries[0].y =
> +		igt_hdr_calc_hdr_float(0.330);
> +	meta->hdmi_metadata_type1.display_primaries[1].x =
> +		igt_hdr_calc_hdr_float(0.300); /* Green */
> +	meta->hdmi_metadata_type1.display_primaries[1].y =
> +		igt_hdr_calc_hdr_float(0.600);
> +	meta->hdmi_metadata_type1.display_primaries[2].x =
> +		igt_hdr_calc_hdr_float(0.150); /* Blue */
> +	meta->hdmi_metadata_type1.display_primaries[2].y =
> +		igt_hdr_calc_hdr_float(0.006);
> +	meta->hdmi_metadata_type1.white_point.x = igt_hdr_calc_hdr_float(0.3127);
> +	meta->hdmi_metadata_type1.white_point.y = igt_hdr_calc_hdr_float(0.3290);
> +
> +	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
> +	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
> +	meta->hdmi_metadata_type1.max_fall = 0;
> +	meta->hdmi_metadata_type1.max_cll = 0;
> +}
> +
> +/**
> + * igt_hdr_cta_block_has_hdr:
> + * @edid_ext: Pointer to CTA extension block data
> + *
> + * Checks if a CTA extension block indicates HDR support.
> + *
> + * Byte 1: 0x07 indicates Extended Tag
> + * Byte 2: 0x06 indicates HDMI Static Metadata Block
> + * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
> + *         where ET_0: Traditional Gamma - SDR Luminance Range
> + *               ET_1: Traditional Gamma - HDR Luminance Range
> + *               ET_2: SMPTE ST 2084
> + *               ET_3: Hybrid Log-Gamma (HLG)
> + *               ET_4 to ET_5: Reserved for future use
> + *
> + * Returns: true if the block indicates HDR support, false otherwise
> + */
> +bool igt_hdr_cta_block_has_hdr(const char *edid_ext)
> +{
> +	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
> +	     (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> +	    ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> +	     (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> +			return true;
> +
> +	return false;
> +}
> +
> +/**
> + * igt_hdr_is_panel_hdr:
> + * @drm_fd: DRM file descriptor
> + * @connector_id: KMS connector ID
> + *
> + * Checks if a panel/display supports HDR by parsing its EDID.
> + * Looks for HDR Static Metadata Block in CTA extension.
> + *
> + * Returns: true if the panel supports HDR, false otherwise
> + */
> +bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id)
> +{
> +	bool ok;
> +	int i, j, offset;
> +	uint64_t edid_blob_id;
> +	drmModePropertyBlobRes *edid_blob;
> +	const struct edid_ext *edid_ext;
> +	const struct edid *edid;
> +	const struct edid_cea *edid_cea;
> +	const char *cea_data;
> +	bool ret = false;
> +
> +	ok = kmstest_get_property(drm_fd, connector_id,
> +			DRM_MODE_OBJECT_CONNECTOR, "EDID",
> +			NULL, &edid_blob_id, NULL);
> +
> +	if (!ok || !edid_blob_id)
> +		return ret;
> +
> +	edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
> +	igt_assert(edid_blob);
> +
> +	edid = (const struct edid *) edid_blob->data;
> +	igt_assert(edid);
> +
> +	drmModeFreePropertyBlob(edid_blob);
> +
> +	for (i = 0; i < edid->extensions_len; i++) {
> +		edid_ext = &edid->extensions[i];
> +		edid_cea = &edid_ext->data.cea;
> +
> +		/* HDR not defined in CTA Extension Version < 3. */
> +		if ((edid_ext->tag != EDID_EXT_CEA) ||
> +		    (edid_cea->revision != CTA_EXTENSION_VERSION))
> +				continue;
> +		else {
> +			offset = edid_cea->dtd_start;
> +			cea_data = edid_cea->data;
> +
> +			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
> +				ret = igt_hdr_cta_block_has_hdr(cea_data + j);
> +
> +				if (ret)
> +					break;
> +			}
> +		}
> +	}
> +
> +	return ret;
> +}
> diff --git a/lib/igt_hdr.h b/lib/igt_hdr.h
> new file mode 100644
> index 000000000..a6faef443
> --- /dev/null
> +++ b/lib/igt_hdr.h
> @@ -0,0 +1,58 @@
> +/*

Same here, add SPDX.

> + * Copyright © 2026 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Same here, remove it.

> + * 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_HDR_H
> +#define IGT_HDR_H
> +
> +#include "config.h"

Why this header here?

> +
> +#include <stdbool.h>
> +#include <stdint.h>
> +#include <linux/types.h>
> +
> +struct hdr_output_metadata;
> +struct igt_fb;
> +
> +/* HDR EDID parsing. */
> +#define CTA_EXTENSION_VERSION		0x03
> +#define HDR_STATIC_METADATA_BLOCK       0x06
> +#define USE_EXTENDED_TAG		0x07
> +
> +/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
> +enum hdmi_metadata_type {
> +	HDMI_STATIC_METADATA_TYPE1 = 0,
> +};
> +
> +enum hdmi_eotf {
> +	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
> +	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
> +	HDMI_EOTF_SMPTE_ST2084,
> +};
> +
> +uint16_t igt_hdr_calc_hdr_float(double val);
> +void igt_hdr_fill_output_metadata_st2084(struct hdr_output_metadata *meta);
> +void igt_hdr_fill_output_metadata_sdr(struct hdr_output_metadata *meta);
> +bool igt_hdr_cta_block_has_hdr(const char *edid_ext);
> +bool igt_hdr_is_panel_hdr(int drm_fd, uint32_t connector_id);
> +
> +#endif /* IGT_HDR_H */
> diff --git a/lib/meson.build b/lib/meson.build
> index cd03e8f63..71ca60e66 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -114,6 +114,7 @@ lib_sources = [
>  	'igt_psr.c',
>  	'igt_amd.c',
>  	'igt_edid.c',
> +	'igt_hdr.c',

Sort alphabetically, so after igt_eld.c

I know that it is already not sorted but lets try to cleanup it.

Regards,
Kamil

>  	'igt_eld.c',
>  	'igt_infoframe.c',
>  	'igt_color.c',
> diff --git a/tests/kms_hdr.c b/tests/kms_hdr.c
> index f30902b72..382fcd823 100644
> --- a/tests/kms_hdr.c
> +++ b/tests/kms_hdr.c
> @@ -33,6 +33,7 @@
>  #include <termios.h>
>  #include <unistd.h>
>  #include "igt_edid.h"
> +#include "igt_hdr.h"
>  
>  /**
>   * SUBTEST: bpc-switch
> @@ -70,24 +71,8 @@
>  
>  IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
>  
> -/* HDR EDID parsing. */
> -#define CTA_EXTENSION_VERSION		0x03
> -#define HDR_STATIC_METADATA_BLOCK       0x06
> -#define USE_EXTENDED_TAG		0x07
> -
>  #define BACKLIGHT_PATH "/sys/class/backlight"
>  
> -/* DRM HDR definitions. Not in the UAPI header, unfortunately. */
> -enum hdmi_metadata_type {
> -	HDMI_STATIC_METADATA_TYPE1 = 0,
> -};
> -
> -enum hdmi_eotf {
> -	HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
> -	HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
> -	HDMI_EOTF_SMPTE_ST2084,
> -};
> -
>  /* Test flags. */
>  enum {
>  	TEST_NONE = 1 << 0,
> @@ -148,50 +133,6 @@ static void draw_hdr_pattern(igt_fb_t *fb)
>  	igt_paint_test_pattern_color_fb(fb->fd, fb, 1.0, 1.0, 1.0);
>  }
>  
> -/* Converts a double to 861-G spec FP format. */
> -static uint16_t calc_hdr_float(double val)
> -{
> -	return (uint16_t)(val * 50000.0);
> -}
> -
> -/* Fills some test values for ST2084 HDR output metadata.
> - *
> - * Note: there isn't really a standard for what the metadata is supposed
> - * to do on the display side of things. The display is free to ignore it
> - * and clip the output, use it to help tonemap to the content range,
> - * or do anything they want, really.
> - */
> -static void fill_hdr_output_metadata_st2084(struct hdr_output_metadata *meta)
> -{
> -	memset(meta, 0, sizeof(*meta));
> -
> -	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> -	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_SMPTE_ST2084;
> -
> -	/* Rec. 2020 */
> -	meta->hdmi_metadata_type1.display_primaries[0].x =
> -		calc_hdr_float(0.708); /* Red */
> -	meta->hdmi_metadata_type1.display_primaries[0].y =
> -		calc_hdr_float(0.292);
> -	meta->hdmi_metadata_type1.display_primaries[1].x =
> -		calc_hdr_float(0.170); /* Green */
> -	meta->hdmi_metadata_type1.display_primaries[1].y =
> -		calc_hdr_float(0.797);
> -	meta->hdmi_metadata_type1.display_primaries[2].x =
> -		calc_hdr_float(0.131); /* Blue */
> -	meta->hdmi_metadata_type1.display_primaries[2].y =
> -		calc_hdr_float(0.046);
> -	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
> -	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
> -
> -	meta->hdmi_metadata_type1.max_display_mastering_luminance =
> -		1000; /* 1000 nits */
> -	meta->hdmi_metadata_type1.min_display_mastering_luminance =
> -		500;				   /* 0.05 nits */
> -	meta->hdmi_metadata_type1.max_fall = 1000; /* 1000 nits */
> -	meta->hdmi_metadata_type1.max_cll = 500;   /* 500 nits */
> -}
> -
>  /* Sets the HDR output metadata prop. */
>  static void set_hdr_output_metadata(data_t *data,
>  				    struct hdr_output_metadata const *meta)
> @@ -365,80 +306,6 @@ static void test_bpc_switch(data_t *data, uint32_t flags)
>  	}
>  }
>  
> -static bool cta_block(const char *edid_ext)
> -{
> -	/*
> -	 * Byte 1: 0x07 indicates Extended Tag
> -	 * Byte 2: 0x06 indicates HDMI Static Metadata Block
> -	 * Byte 3: bits 0 to 5 identify EOTF functions supported by sink
> -	 *	       where ET_0: Traditional Gamma - SDR Luminance Range
> -	 *	             ET_1: Traditional Gamma - HDR Luminance Range
> -	 *	             ET_2: SMPTE ST 2084
> -	 *	             ET_3: Hybrid Log-Gamma (HLG)
> -	 *	             ET_4 to ET_5: Reserved for future use
> -	 */
> -
> -	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
> -	      (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> -	     ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> -	      (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> -			return true;
> -
> -	return false;
> -}
> -
> -/* Returns true if panel supports HDR. */
> -static bool is_panel_hdr(data_t *data, igt_output_t *output)
> -{
> -	bool ok;
> -	int i, j, offset;
> -	uint64_t edid_blob_id;
> -	drmModePropertyBlobRes *edid_blob;
> -	const struct edid_ext *edid_ext;
> -	const struct edid *edid;
> -	const struct edid_cea *edid_cea;
> -	const char *cea_data;
> -	bool ret = false;
> -
> -	ok = kmstest_get_property(data->fd, output->id,
> -			DRM_MODE_OBJECT_CONNECTOR, "EDID",
> -			NULL, &edid_blob_id, NULL);
> -
> -	if (!ok || !edid_blob_id)
> -		return ret;
> -
> -	edid_blob = drmModeGetPropertyBlob(data->fd, edid_blob_id);
> -	igt_assert(edid_blob);
> -
> -	edid = (const struct edid *) edid_blob->data;
> -	igt_assert(edid);
> -
> -	drmModeFreePropertyBlob(edid_blob);
> -
> -	for (i = 0; i < edid->extensions_len; i++) {
> -		edid_ext = &edid->extensions[i];
> -		edid_cea = &edid_ext->data.cea;
> -
> -		/* HDR not defined in CTA Extension Version < 3. */
> -		if ((edid_ext->tag != EDID_EXT_CEA) ||
> -		    (edid_cea->revision != CTA_EXTENSION_VERSION))
> -				continue;
> -		else {
> -			offset = edid_cea->dtd_start;
> -			cea_data = edid_cea->data;
> -
> -			for (j = 0; j < offset; j += (cea_data[j] & 0x1f) + 1) {
> -				ret = cta_block(cea_data + j);
> -
> -				if (ret)
> -					break;
> -			}
> -		}
> -	}
> -
> -	return ret;
> -}
> -
>  /* Sets the HDR output metadata prop with invalid size. */
>  static int set_invalid_hdr_output_metadata(data_t *data,
>  					   struct hdr_output_metadata const *meta,
> @@ -490,7 +357,7 @@ static void test_static_toggle(data_t *data, igt_crtc_t *crtc,
>  
>  	draw_hdr_pattern(&afb);
>  
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>  
>  	/* Start with no metadata. */
>  	igt_plane_set_fb(data->primary, &afb);
> @@ -559,36 +426,6 @@ cleanup:
>  	igt_remove_fb(data->fd, &afb);
>  }
>  
> -/* Fills some test values for HDR metadata targeting SDR. */
> -static void fill_hdr_output_metadata_sdr(struct hdr_output_metadata *meta)
> -{
> -	memset(meta, 0, sizeof(*meta));
> -
> -	meta->metadata_type = HDMI_STATIC_METADATA_TYPE1;
> -	meta->hdmi_metadata_type1.eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
> -
> -	/* Rec. 709 */
> -	meta->hdmi_metadata_type1.display_primaries[0].x =
> -		calc_hdr_float(0.640); /* Red */
> -	meta->hdmi_metadata_type1.display_primaries[0].y =
> -		calc_hdr_float(0.330);
> -	meta->hdmi_metadata_type1.display_primaries[1].x =
> -		calc_hdr_float(0.300); /* Green */
> -	meta->hdmi_metadata_type1.display_primaries[1].y =
> -		calc_hdr_float(0.600);
> -	meta->hdmi_metadata_type1.display_primaries[2].x =
> -		calc_hdr_float(0.150); /* Blue */
> -	meta->hdmi_metadata_type1.display_primaries[2].y =
> -		calc_hdr_float(0.006);
> -	meta->hdmi_metadata_type1.white_point.x = calc_hdr_float(0.3127);
> -	meta->hdmi_metadata_type1.white_point.y = calc_hdr_float(0.3290);
> -
> -	meta->hdmi_metadata_type1.max_display_mastering_luminance = 0;
> -	meta->hdmi_metadata_type1.min_display_mastering_luminance = 0;
> -	meta->hdmi_metadata_type1.max_fall = 0;
> -	meta->hdmi_metadata_type1.max_cll = 0;
> -}
> -
>  static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>  			     igt_output_t *output, uint32_t flags)
>  {
> @@ -625,7 +462,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>  	}
>  
>  	/* Enter HDR, a modeset is allowed here. */
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>  	set_hdr_output_metadata(data, &hdr);
>  	igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
>  	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> @@ -654,7 +491,7 @@ static void test_static_swap(data_t *data, igt_crtc_t *crtc,
>  	/* Enter SDR via metadata, no modeset allowed for
>  	 * amd driver, whereas a modeset is required for
>  	 * intel driver. */
> -	fill_hdr_output_metadata_sdr(&hdr);
> +	igt_hdr_fill_output_metadata_sdr(&hdr);
>  	set_hdr_output_metadata(data, &hdr);
>  	if (is_amdgpu_device(data->fd))
>  		igt_display_commit_atomic(display, 0, NULL);
> @@ -687,7 +524,7 @@ static void test_invalid_metadata_sizes(data_t *data, igt_output_t *output)
>  	struct hdr_output_metadata hdr;
>  	size_t metadata_size = sizeof(hdr);
>  
> -	fill_hdr_output_metadata_st2084(&hdr);
> +	igt_hdr_fill_output_metadata_st2084(&hdr);
>  
>  	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, 1), -EINVAL);
>  	igt_assert_eq(set_invalid_hdr_output_metadata(data, &hdr, metadata_size + 1), -EINVAL);
> @@ -725,13 +562,13 @@ static void test_hdr(data_t *data, uint32_t flags)
>  		}
>  
>  		/* For negative test, panel should be non-hdr. */
> -		if ((flags & TEST_INVALID_HDR) && is_panel_hdr(data, output)) {
> +		if ((flags & TEST_INVALID_HDR) && igt_hdr_is_panel_hdr(data->fd, output->id)) {
>  			igt_info("%s: Can't run negative test on HDR panel.\n",
>  				 igt_output_name(output));
>  			continue;
>  		}
>  
> -		if ((flags & ~TEST_INVALID_HDR) && !is_panel_hdr(data, output)) {
> +		if ((flags & ~TEST_INVALID_HDR) && !igt_hdr_is_panel_hdr(data->fd, output->id)) {
>  			igt_info("%s: Can't run HDR tests on non-HDR panel.\n",
>  				 igt_output_name(output));
>  			continue;
> @@ -760,7 +597,7 @@ static void test_hdr(data_t *data, uint32_t flags)
>  				     crtc);
>  
>  			/* Signal HDR requirement via metadata */
> -			fill_hdr_output_metadata_st2084(&hdr);
> +			igt_hdr_fill_output_metadata_st2084(&hdr);
>  			set_hdr_output_metadata(data, &hdr);
>  			if (igt_display_try_commit2(display, display->is_atomic ?
>  						    COMMIT_ATOMIC : COMMIT_LEGACY)) {
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification
  2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
@ 2026-03-18  9:52   ` Kamil Konieczny
  2026-03-18 20:13     ` vitaly prosyak
  2026-03-19  8:54   ` Jani Nikula
  1 sibling, 1 reply; 14+ messages in thread
From: Kamil Konieczny @ 2026-03-18  9:52 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, wayne.lin, Mark.Broadworth, Vitaly Prosyak

Hi Alex,
On 2026-03-17 at 11:51:31 -0600, Alex Hung wrote:
> From: Wayne Lin <wayne.lin@amd.com>
> 
> Add a visual verification tool for AMD HDR display output. This tool
> displays HDR test patterns with different metadata types and waits for
> user confirmation, enabling manual inspection of HDR output quality.
> 
> Subtests:
> - static-swap-smpte2084: Display with SMPTE ST2084 (PQ) HDR metadata
> - static-swap-traditional-sdr: Display with traditional SDR gamma metadata
> 
> Co-developed-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Wayne Lin <wayne.lin@amd.com>
> ---
>  tools/amd_hdr_visual.c | 372 +++++++++++++++++++++++++++++++++++++++++
>  tools/meson.build      |   5 +
>  2 files changed, 377 insertions(+)
>  create mode 100644 tools/amd_hdr_visual.c
> 
> diff --git a/tools/amd_hdr_visual.c b/tools/amd_hdr_visual.c
> new file mode 100644
> index 000000000..58decb356
> --- /dev/null
> +++ b/tools/amd_hdr_visual.c
> @@ -0,0 +1,372 @@
> +/*

Add SPDX here, look into other C files and use Linux script
checkpatch.pl for verifing.

> + * Copyright 2026 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a

Remove this text, it is replaced by SPDX.

> + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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"

Why igt.h here? It should be after system headers but also
try to decouple it from big test libs. Tools should at least 
try to be tools, not tests.

> +#include <fcntl.h>
> +#include <termios.h>
> +#include <unistd.h>

Add newline here.

> +#include "igt_edid.h"
> +#include "igt_hdr.h"
> +
> +IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");

Not needed in tools, remove it. Or did you mean a test, not a tool?
+cc Vitaly
Cc: Vitaly Prosyak <vitaly.prosyak@amd.com>

Regards,
Kamil

> +
> +/* Test flags. */
> +enum {
> +	TEST_NONE = 1 << 0,
> +	TEST_DPMS = 1 << 1,
> +	TEST_SUSPEND = 1 << 2,
> +	TEST_SWAP = 1 << 3,
> +};
> +
> +/* BPC connector state. */
> +typedef struct output_bpc {
> +	unsigned int current;
> +	unsigned int maximum;
> +} output_bpc_t;
> +
> +/* Common test data. */
> +typedef struct data {
> +	igt_display_t display;
> +	igt_plane_t *primary;
> +	igt_output_t *output;
> +	igt_crtc_t *pipe;
> +	igt_pipe_crc_t *pipe_crc;
> +	drmModeModeInfo *mode;
> +	enum pipe pipe_id;
> +	int fd;
> +	int w;
> +	int h;
> +} data_t;
> +
> +/* Common test cleanup. */
> +static void test_fini(data_t *data)
> +{
> +	igt_pipe_crc_free(data->pipe_crc);
> +	igt_display_reset(&data->display);
> +}
> +
> +static void test_cycle_flags(data_t *data, uint32_t test_flags)
> +{
> +	if (test_flags & TEST_DPMS) {
> +		kmstest_set_connector_dpms(data->fd,
> +					   data->output->config.connector,
> +					   DRM_MODE_DPMS_OFF);
> +		kmstest_set_connector_dpms(data->fd,
> +					   data->output->config.connector,
> +					   DRM_MODE_DPMS_ON);
> +	}
> +
> +	if (test_flags & TEST_SUSPEND)
> +		igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
> +					      SUSPEND_TEST_NONE);
> +}
> +
> +/* Returns the current and maximum bpc from the connector debugfs. */
> +static output_bpc_t get_output_bpc(data_t *data)
> +{
> +	char buf[256];
> +	char *start_loc;
> +	int fd, res;
> +	output_bpc_t info;
> +
> +	fd = igt_debugfs_connector_dir(data->fd, data->output->name, O_RDONLY);
> +	igt_assert(fd >= 0);
> +
> +	res = igt_debugfs_simple_read(fd, "output_bpc", buf, sizeof(buf));
> +
> +	igt_require(res > 0);
> +
> +	close(fd);
> +
> +	igt_assert(start_loc = strstr(buf, "Current: "));
> +	igt_assert_eq(sscanf(start_loc, "Current: %u", &info.current), 1);
> +
> +	igt_assert(start_loc = strstr(buf, "Maximum: "));
> +	igt_assert_eq(sscanf(start_loc, "Maximum: %u", &info.maximum), 1);
> +
> +	return info;
> +}
> +
> +/* Verifies that connector has the correct output bpc. */
> +static void assert_output_bpc(data_t *data, unsigned int bpc)
> +{
> +	output_bpc_t info = get_output_bpc(data);
> +
> +	igt_require_f(info.maximum >= bpc,
> +		      "Monitor doesn't support %u bpc, max is %u\n", bpc,
> +		      info.maximum);
> +
> +	igt_assert_eq(info.current, bpc);
> +}
> +
> +/* Fills the FB with a test HDR pattern. */
> +static void draw_hdr_pattern(igt_fb_t *fb)
> +{
> +	cairo_t *cr = igt_get_cairo_ctx(fb->fd, fb);
> +
> +	igt_paint_color(cr, 0, 0, fb->width, fb->height, 1.0, 1.0, 1.0);
> +	igt_paint_test_pattern(cr, fb->width, fb->height);
> +
> +	igt_put_cairo_ctx(cr);
> +}
> +
> +/* Prepare test data. */
> +static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> +{
> +	igt_display_t *display = &data->display;
> +
> +	data->pipe_id = pipe;
> +	data->pipe = &data->display.crtcs[data->pipe_id];
> +	igt_assert(data->pipe);
> +
> +	igt_display_reset(display);
> +
> +	data->output = output;
> +	igt_assert(data->output);
> +
> +	data->mode = igt_output_get_mode(data->output);
> +	igt_assert(data->mode);
> +
> +	data->primary =
> +		igt_crtc_get_plane_type(data->pipe, DRM_PLANE_TYPE_PRIMARY);
> +
> +	data->pipe_crc = igt_pipe_crc_new(data->fd, data->pipe_id,
> +					  IGT_PIPE_CRC_SOURCE_AUTO);
> +
> +	igt_output_set_crtc(data->output, igt_crtc_for_pipe(display, data->pipe_id));
> +
> +	data->w = data->mode->hdisplay;
> +	data->h = data->mode->vdisplay;
> +}
> +
> +static bool igt_crtc_is_free(igt_display_t *display, igt_crtc_t *crtc)
> +{
> +	int i;
> +
> +	for (i = 0; i < display->n_outputs; i++)
> +		if (display->outputs[i].pending_crtc == crtc)
> +			return false;
> +
> +	return true;
> +}
> +
> +/* Returns true if an output supports max bpc property. */
> +static bool has_max_bpc(igt_output_t *output)
> +{
> +	return igt_output_has_prop(output, IGT_CONNECTOR_MAX_BPC) &&
> +	       igt_output_get_prop(output, IGT_CONNECTOR_MAX_BPC);
> +}
> +
> +
> +
> +/* Sets the HDR output metadata prop. */
> +static void set_hdr_output_metadata(data_t *data,
> +				    struct hdr_output_metadata const *meta)
> +{
> +	igt_output_replace_prop_blob(data->output,
> +				     IGT_CONNECTOR_HDR_OUTPUT_METADATA, meta,
> +				     meta ? sizeof(*meta) : 0);
> +}
> +
> +
> +
> +static void test_static_toggle(data_t *data, igt_output_t *output,
> +			       uint32_t flags)
> +{
> +	igt_display_t *display = &data->display;
> +	struct hdr_output_metadata hdr;
> +	igt_crc_t ref_crc, new_crc;
> +	igt_crtc_t *crtc;
> +	igt_fb_t afb;
> +	int afb_id;
> +
> +	for_each_crtc(display, crtc) {
> +		if (!igt_crtc_connector_valid(crtc, output))
> +			continue;
> +
> +		if (!igt_crtc_is_free(display, crtc))
> +			continue;
> +
> +		prepare_test(data, output, crtc->pipe);
> +
> +		/* 10-bit formats are slow, so limit the size. */
> +		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
> +		igt_assert(afb_id);
> +
> +		draw_hdr_pattern(&afb);
> +
> +		igt_hdr_fill_output_metadata_st2084(&hdr);
> +
> +		/* Start with no metadata. */
> +		igt_plane_set_fb(data->primary, &afb);
> +		igt_plane_set_size(data->primary, data->w, data->h);
> +		set_hdr_output_metadata(data, NULL);
> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +		if (is_amdgpu_device(data->fd))
> +			assert_output_bpc(data, 8);
> +
> +		/* Apply HDR metadata and 10bpc. We expect a modeset for entering. */
> +		set_hdr_output_metadata(data, &hdr);
> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +		if (is_amdgpu_device(data->fd))
> +			assert_output_bpc(data, 10);
> +
> +		/* Verify that the CRC are equal after DPMS or suspend. */
> +		igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc);
> +		test_cycle_flags(data, flags);
> +		igt_pipe_crc_collect_crc(data->pipe_crc, &new_crc);
> +
> +		/* Disable HDR metadata and drop back to 8bpc. We expect a modeset for exiting. */
> +		set_hdr_output_metadata(data, NULL);
> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +		if (is_amdgpu_device(data->fd))
> +			assert_output_bpc(data, 8);
> +
> +		igt_assert_crc_equal(&ref_crc, &new_crc);
> +
> +		test_fini(data);
> +		igt_remove_fb(data->fd, &afb);
> +
> +		break;
> +	}
> +}
> +
> +static void test_static_swap(data_t *data, igt_output_t *output,
> +			     void (*fill_metadata)(struct hdr_output_metadata *),
> +			     const char *mode_name)
> +{
> +	igt_display_t *display = &data->display;
> +	igt_crtc_t *crtc;
> +	igt_fb_t afb;
> +	int afb_id;
> +	struct hdr_output_metadata hdr;
> +
> +	for_each_crtc(display, crtc) {
> +		if (!igt_crtc_connector_valid(crtc, output))
> +			continue;
> +
> +		if (!igt_crtc_is_free(display, crtc))
> +			continue;
> +
> +		prepare_test(data, output, crtc->pipe);
> +
> +		/* 10-bit formats are slow, so limit the size. */
> +		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
> +		igt_assert(afb_id);
> +
> +		draw_hdr_pattern(&afb);
> +
> +		/* Start in the specified HDR mode. */
> +		igt_plane_set_fb(data->primary, &afb);
> +		igt_plane_set_size(data->primary, data->w, data->h);
> +		fill_metadata(&hdr);
> +		set_hdr_output_metadata(data, &hdr);
> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +
> +		igt_info("wait %s!\n", mode_name);
> +		igt_debug_wait_for_keypress(mode_name);
> +
> +		/* Exit HDR mode and enter 8bpc, cleanup. */
> +		set_hdr_output_metadata(data, NULL);
> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +
> +		test_fini(data);
> +		igt_remove_fb(data->fd, &afb);
> +
> +		break;
> +	}
> +}
> +
> +/* Returns true if an output supports HDR metadata property. */
> +static bool has_hdr(igt_output_t *output)
> +{
> +	return igt_output_has_prop(output, IGT_CONNECTOR_HDR_OUTPUT_METADATA);
> +}
> +
> +static void test_hdr(data_t *data, const char *test_name, uint32_t flags,
> +		    void (*fill_metadata)(struct hdr_output_metadata *),
> +		    const char *mode_name)
> +{
> +	igt_output_t *output;
> +	int valid_tests = 0;
> +
> +	for_each_connected_output(&data->display, output) {
> +		/* To test HDR, 10 bpc is required, so we need to
> +		 * set MAX_BPC property to 10bpc prior to setting
> +		 * HDR metadata property. Therefore, checking.
> +		 */
> +		if (!has_max_bpc(output) || !has_hdr(output)) {
> +			igt_info("%s connector not found with HDR metadata/max_bpc connector property\n", output->name);
> +			continue;
> +		}
> +
> +		if (!igt_hdr_is_panel_hdr(data->fd, output->id)) {
> +			igt_info("Panel attached via %s connector is non-HDR\n", output->name);
> +			continue;
> +		}
> +
> +		igt_info("HDR %s test execution on %s\n", test_name, output->name);
> +		if (flags & TEST_NONE || flags & TEST_DPMS || flags & TEST_SUSPEND)
> +			test_static_toggle(data, output, flags);
> +		if (flags & TEST_SWAP)
> +			test_static_swap(data, output, fill_metadata, mode_name);
> +
> +		valid_tests++;
> +	}
> +
> +	igt_require_f(valid_tests, "No connector found with HDR metadata/max_bpc connector property (or) panel is non-HDR\n");
> +}
> +
> +int igt_main()
> +{
> +	data_t data = { 0 };
> +
> +	igt_fixture() {
> +		data.fd = drm_open_driver_master(DRIVER_AMDGPU);
> +
> +		kmstest_set_vt_graphics_mode();
> +
> +		igt_display_require(&data.display, data.fd);
> +		igt_require(data.display.is_atomic);
> +
> +		igt_display_require_output(&data.display);
> +	}
> +
> +	igt_describe("Tests swapping to SMPTE ST2084 HDR metadata");
> +	igt_subtest("static-swap-smpte2084")
> +		test_hdr(&data, "static-swap-smpte2084", TEST_SWAP,
> +			 igt_hdr_fill_output_metadata_st2084, "smpte2084");
> +
> +	igt_describe("Tests swapping to traditional SDR gamma HDR metadata");
> +	igt_subtest("static-swap-traditional-sdr")
> +		test_hdr(&data, "static-swap-traditional-sdr", TEST_SWAP,
> +			 igt_hdr_fill_output_metadata_sdr, "traditional-sdr");
> +
> +	igt_fixture() {
> +		igt_display_fini(&data.display);
> +	}
> +}
> diff --git a/tools/meson.build b/tools/meson.build
> index 8185ba160..9612acd83 100644
> --- a/tools/meson.build
> +++ b/tools/meson.build
> @@ -104,6 +104,11 @@ executable('amd_hdmi_compliance', 'amd_hdmi_compliance.c',
>  	   install_rpath : bindir_rpathdir,
>  	   install : true)
>  
> +executable('amd_hdr_visual', 'amd_hdr_visual.c',
> +	   dependencies : [tool_deps],
> +	   install_rpath : bindir_rpathdir,
> +	   install : true)
> +
>  if libudev.found()
>  	msm_dp_compliance_src = [
>  		'msm_dp_compliance.c',
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking
  2026-03-17 17:51 ` [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking Alex Hung
@ 2026-03-18  9:55   ` Kamil Konieczny
  0 siblings, 0 replies; 14+ messages in thread
From: Kamil Konieczny @ 2026-03-18  9:55 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev, wayne.lin, Mark.Broadworth, Swati Sharma

Hi Alex,
On 2026-03-17 at 11:51:32 -0600, Alex Hung wrote:
> EOTF values are bit positions, not masks. Use (1 << value) to create
> proper bit masks when checking HDR support in CTA-861 EDID blocks.
> 
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> ---
>  lib/igt_hdr.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/igt_hdr.c b/lib/igt_hdr.c
> index 6368ae78b..e1bd69087 100644
> --- a/lib/igt_hdr.c
> +++ b/lib/igt_hdr.c
> @@ -151,8 +151,8 @@ bool igt_hdr_cta_block_has_hdr(const char *edid_ext)
>  {
>  	if ((((edid_ext[0] & 0xe0) >> 5 == USE_EXTENDED_TAG) &&
>  	     (edid_ext[1] == HDR_STATIC_METADATA_BLOCK)) &&
> -	    ((edid_ext[2] & HDMI_EOTF_TRADITIONAL_GAMMA_HDR) ||
> -	     (edid_ext[2] & HDMI_EOTF_SMPTE_ST2084)))
> +	    ((edid_ext[2] & (1 << HDMI_EOTF_TRADITIONAL_GAMMA_HDR)) ||
> +	     (edid_ext[2] & (1 << HDMI_EOTF_SMPTE_ST2084))))
>  			return true;

This could be sent separatly after Swati patches are merged.
+cc Swati
Cc: Swati Sharma <swati2.sharma@intel.com>

Regards,
Kamil

>  
>  	return false;
> -- 
> 2.43.0
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-18  7:34 ` [PATCH 1/3] " Sharma, Swati2
@ 2026-03-18 18:40   ` Alex Hung
  0 siblings, 0 replies; 14+ messages in thread
From: Alex Hung @ 2026-03-18 18:40 UTC (permalink / raw)
  To: Sharma, Swati2, igt-dev; +Cc: wayne.lin, Mark.Broadworth



On 3/18/26 01:34, Sharma, Swati2 wrote:
> Hi Alex,
> 
> We already ahve patch series to extract HDR in separate lib
> 
> https://patchwork.freedesktop.org/series/158425/
> 
> Series is reviewed. Need to fix CI regression.
> 
> Can you please add your patches on top of this?

Sure but this series won't apply clearly on top of IGT's master now. 
There are lots of conflicts and one of which is from change of pipe->crtc.

Will you send V3 to address it?

If possible, it would nice if you can integrate my patch 3 
(https://patchwork.freedesktop.org/patch/712423/?series=163396&rev=1) to 
your patch 1 
(https://patchwork.freedesktop.org/patch/696737/?series=158425&rev=2) in 
V3 since you are moving this function.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification
  2026-03-18  9:52   ` Kamil Konieczny
@ 2026-03-18 20:13     ` vitaly prosyak
  2026-03-18 20:15       ` Alex Hung
  0 siblings, 1 reply; 14+ messages in thread
From: vitaly prosyak @ 2026-03-18 20:13 UTC (permalink / raw)
  To: Kamil Konieczny, Alex Hung, igt-dev, wayne.lin, Mark.Broadworth,
	Vitaly Prosyak


On 2026-03-18 05:52, Kamil Konieczny wrote:
> Hi Alex,
> On 2026-03-17 at 11:51:31 -0600, Alex Hung wrote:
>> From: Wayne Lin <wayne.lin@amd.com>
>>
>> Add a visual verification tool for AMD HDR display output. This tool
>> displays HDR test patterns with different metadata types and waits for
>> user confirmation, enabling manual inspection of HDR output quality.
>>
>> Subtests:
>> - static-swap-smpte2084: Display with SMPTE ST2084 (PQ) HDR metadata
>> - static-swap-traditional-sdr: Display with traditional SDR gamma metadata
>>
>> Co-developed-by: Alex Hung <alex.hung@amd.com>
>> Signed-off-by: Alex Hung <alex.hung@amd.com>
>> Signed-off-by: Wayne Lin <wayne.lin@amd.com>
>> ---
>>  tools/amd_hdr_visual.c | 372 +++++++++++++++++++++++++++++++++++++++++
>>  tools/meson.build      |   5 +
>>  2 files changed, 377 insertions(+)
>>  create mode 100644 tools/amd_hdr_visual.c
>>
>> diff --git a/tools/amd_hdr_visual.c b/tools/amd_hdr_visual.c
>> new file mode 100644
>> index 000000000..58decb356
>> --- /dev/null
>> +++ b/tools/amd_hdr_visual.c
>> @@ -0,0 +1,372 @@
>> +/*
> Add SPDX here, look into other C files and use Linux script
> checkpatch.pl for verifing.
>
>> + * Copyright 2026 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
> Remove this text, it is replaced by SPDX.
>
>> + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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"
> Why igt.h here? It should be after system headers but also
> try to decouple it from big test libs. Tools should at least 
> try to be tools, not tests.
>
>> +#include <fcntl.h>
>> +#include <termios.h>
>> +#include <unistd.h>
> Add newline here.
>
>> +#include "igt_edid.h"
>> +#include "igt_hdr.h"
>> +
>> +IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
> Not needed in tools, remove it. Or did you mean a test, not a tool?
> +cc Vitaly
> Cc: Vitaly Prosyak <vitaly.prosyak@amd.com>
>
> Regards,
> Kamil
>
>> +
>> +/* Test flags. */
>> +enum {
>> +	TEST_NONE = 1 << 0,
>> +	TEST_DPMS = 1 << 1,
>> +	TEST_SUSPEND = 1 << 2,
>> +	TEST_SWAP = 1 << 3,
>> +};
>> +
>> +/* BPC connector state. */
>> +typedef struct output_bpc {
>> +	unsigned int current;
>> +	unsigned int maximum;
>> +} output_bpc_t;
>> +
>> +/* Common test data. */
>> +typedef struct data {
>> +	igt_display_t display;
>> +	igt_plane_t *primary;
>> +	igt_output_t *output;
>> +	igt_crtc_t *pipe;
>> +	igt_pipe_crc_t *pipe_crc;
>> +	drmModeModeInfo *mode;
>> +	enum pipe pipe_id;
>> +	int fd;
>> +	int w;
>> +	int h;
>> +} data_t;
>> +
>> +/* Common test cleanup. */
>> +static void test_fini(data_t *data)
>> +{
>> +	igt_pipe_crc_free(data->pipe_crc);
>> +	igt_display_reset(&data->display);
>> +}
>> +
>> +static void test_cycle_flags(data_t *data, uint32_t test_flags)
>> +{
>> +	if (test_flags & TEST_DPMS) {
>> +		kmstest_set_connector_dpms(data->fd,
>> +					   data->output->config.connector,
>> +					   DRM_MODE_DPMS_OFF);
>> +		kmstest_set_connector_dpms(data->fd,
>> +					   data->output->config.connector,
>> +					   DRM_MODE_DPMS_ON);
>> +	}
>> +
>> +	if (test_flags & TEST_SUSPEND)
>> +		igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
>> +					      SUSPEND_TEST_NONE);
>> +}
>> +
>> +/* Returns the current and maximum bpc from the connector debugfs. */
>> +static output_bpc_t get_output_bpc(data_t *data)
>> +{
>> +	char buf[256];
>> +	char *start_loc;
>> +	int fd, res;
>> +	output_bpc_t info;
>> +
>> +	fd = igt_debugfs_connector_dir(data->fd, data->output->name, O_RDONLY);
>> +	igt_assert(fd >= 0);
>> +
>> +	res = igt_debugfs_simple_read(fd, "output_bpc", buf, sizeof(buf));
>> +
>> +	igt_require(res > 0);
>> +
>> +	close(fd);
>> +
>> +	igt_assert(start_loc = strstr(buf, "Current: "));
>> +	igt_assert_eq(sscanf(start_loc, "Current: %u", &info.current), 1);
>> +
>> +	igt_assert(start_loc = strstr(buf, "Maximum: "));
>> +	igt_assert_eq(sscanf(start_loc, "Maximum: %u", &info.maximum), 1);
>> +
>> +	return info;
>> +}
>> +
>> +/* Verifies that connector has the correct output bpc. */
>> +static void assert_output_bpc(data_t *data, unsigned int bpc)
>> +{
>> +	output_bpc_t info = get_output_bpc(data);
>> +
>> +	igt_require_f(info.maximum >= bpc,
>> +		      "Monitor doesn't support %u bpc, max is %u\n", bpc,
>> +		      info.maximum);
>> +
>> +	igt_assert_eq(info.current, bpc);
>> +}
>> +
>> +/* Fills the FB with a test HDR pattern. */
>> +static void draw_hdr_pattern(igt_fb_t *fb)
>> +{
>> +	cairo_t *cr = igt_get_cairo_ctx(fb->fd, fb);
>> +
>> +	igt_paint_color(cr, 0, 0, fb->width, fb->height, 1.0, 1.0, 1.0);
>> +	igt_paint_test_pattern(cr, fb->width, fb->height);
>> +
>> +	igt_put_cairo_ctx(cr);
>> +}
>> +
>> +/* Prepare test data. */
>> +static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
>> +{
>> +	igt_display_t *display = &data->display;
>> +
>> +	data->pipe_id = pipe;
>> +	data->pipe = &data->display.crtcs[data->pipe_id];
>> +	igt_assert(data->pipe);
>> +
>> +	igt_display_reset(display);
>> +
>> +	data->output = output;
>> +	igt_assert(data->output);
>> +
>> +	data->mode = igt_output_get_mode(data->output);
>> +	igt_assert(data->mode);
>> +
>> +	data->primary =
>> +		igt_crtc_get_plane_type(data->pipe, DRM_PLANE_TYPE_PRIMARY);
>> +
>> +	data->pipe_crc = igt_pipe_crc_new(data->fd, data->pipe_id,
>> +					  IGT_PIPE_CRC_SOURCE_AUTO);
>> +
>> +	igt_output_set_crtc(data->output, igt_crtc_for_pipe(display, data->pipe_id));
>> +
>> +	data->w = data->mode->hdisplay;
>> +	data->h = data->mode->vdisplay;
>> +}
>> +
>> +static bool igt_crtc_is_free(igt_display_t *display, igt_crtc_t *crtc)
>> +{
>> +	int i;
>> +
>> +	for (i = 0; i < display->n_outputs; i++)
>> +		if (display->outputs[i].pending_crtc == crtc)
>> +			return false;
>> +
>> +	return true;
>> +}
>> +
>> +/* Returns true if an output supports max bpc property. */
>> +static bool has_max_bpc(igt_output_t *output)
>> +{
>> +	return igt_output_has_prop(output, IGT_CONNECTOR_MAX_BPC) &&
>> +	       igt_output_get_prop(output, IGT_CONNECTOR_MAX_BPC);
>> +}
>> +
>> +
>> +
>> +/* Sets the HDR output metadata prop. */
>> +static void set_hdr_output_metadata(data_t *data,
>> +				    struct hdr_output_metadata const *meta)
>> +{
>> +	igt_output_replace_prop_blob(data->output,
>> +				     IGT_CONNECTOR_HDR_OUTPUT_METADATA, meta,
>> +				     meta ? sizeof(*meta) : 0);
>> +}
>> +
>> +
>> +
>> +static void test_static_toggle(data_t *data, igt_output_t *output,
>> +			       uint32_t flags)
>> +{
>> +	igt_display_t *display = &data->display;
>> +	struct hdr_output_metadata hdr;
>> +	igt_crc_t ref_crc, new_crc;
>> +	igt_crtc_t *crtc;
>> +	igt_fb_t afb;
>> +	int afb_id;
>> +
>> +	for_each_crtc(display, crtc) {
>> +		if (!igt_crtc_connector_valid(crtc, output))
>> +			continue;
>> +
>> +		if (!igt_crtc_is_free(display, crtc))
>> +			continue;
>> +
>> +		prepare_test(data, output, crtc->pipe);
>> +
>> +		/* 10-bit formats are slow, so limit the size. */
>> +		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
>> +		igt_assert(afb_id);
>> +
>> +		draw_hdr_pattern(&afb);
>> +
>> +		igt_hdr_fill_output_metadata_st2084(&hdr);
>> +
>> +		/* Start with no metadata. */
>> +		igt_plane_set_fb(data->primary, &afb);
>> +		igt_plane_set_size(data->primary, data->w, data->h);
>> +		set_hdr_output_metadata(data, NULL);
>> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
>> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +		if (is_amdgpu_device(data->fd))
>> +			assert_output_bpc(data, 8);
>> +
>> +		/* Apply HDR metadata and 10bpc. We expect a modeset for entering. */
>> +		set_hdr_output_metadata(data, &hdr);
>> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
>> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +		if (is_amdgpu_device(data->fd))
>> +			assert_output_bpc(data, 10);
>> +
>> +		/* Verify that the CRC are equal after DPMS or suspend. */
>> +		igt_pipe_crc_collect_crc(data->pipe_crc, &ref_crc);
>> +		test_cycle_flags(data, flags);
>> +		igt_pipe_crc_collect_crc(data->pipe_crc, &new_crc);
>> +
>> +		/* Disable HDR metadata and drop back to 8bpc. We expect a modeset for exiting. */
>> +		set_hdr_output_metadata(data, NULL);
>> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
>> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +		if (is_amdgpu_device(data->fd))
>> +			assert_output_bpc(data, 8);
>> +
>> +		igt_assert_crc_equal(&ref_crc, &new_crc);
>> +
>> +		test_fini(data);
>> +		igt_remove_fb(data->fd, &afb);
>> +
>> +		break;
>> +	}
>> +}
>> +
>> +static void test_static_swap(data_t *data, igt_output_t *output,
>> +			     void (*fill_metadata)(struct hdr_output_metadata *),
>> +			     const char *mode_name)
>> +{
>> +	igt_display_t *display = &data->display;
>> +	igt_crtc_t *crtc;
>> +	igt_fb_t afb;
>> +	int afb_id;
>> +	struct hdr_output_metadata hdr;
>> +
>> +	for_each_crtc(display, crtc) {
>> +		if (!igt_crtc_connector_valid(crtc, output))
>> +			continue;
>> +
>> +		if (!igt_crtc_is_free(display, crtc))
>> +			continue;
>> +
>> +		prepare_test(data, output, crtc->pipe);
>> +
>> +		/* 10-bit formats are slow, so limit the size. */
>> +		afb_id = igt_create_fb(data->fd, 512, 512, DRM_FORMAT_XRGB2101010, 0, &afb);
>> +		igt_assert(afb_id);
>> +
>> +		draw_hdr_pattern(&afb);
>> +
>> +		/* Start in the specified HDR mode. */
>> +		igt_plane_set_fb(data->primary, &afb);
>> +		igt_plane_set_size(data->primary, data->w, data->h);
>> +		fill_metadata(&hdr);
>> +		set_hdr_output_metadata(data, &hdr);
>> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 10);
>> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +
>> +		igt_info("wait %s!\n", mode_name);
>> +		igt_debug_wait_for_keypress(mode_name);
>> +
>> +		/* Exit HDR mode and enter 8bpc, cleanup. */
>> +		set_hdr_output_metadata(data, NULL);
>> +		igt_output_set_prop_value(data->output, IGT_CONNECTOR_MAX_BPC, 8);
>> +		igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>> +
>> +		test_fini(data);
>> +		igt_remove_fb(data->fd, &afb);
>> +
>> +		break;
>> +	}
>> +}
>> +
>> +/* Returns true if an output supports HDR metadata property. */
>> +static bool has_hdr(igt_output_t *output)
>> +{
>> +	return igt_output_has_prop(output, IGT_CONNECTOR_HDR_OUTPUT_METADATA);
>> +}
>> +
>> +static void test_hdr(data_t *data, const char *test_name, uint32_t flags,
>> +		    void (*fill_metadata)(struct hdr_output_metadata *),
>> +		    const char *mode_name)
>> +{
>> +	igt_output_t *output;
>> +	int valid_tests = 0;
>> +
>> +	for_each_connected_output(&data->display, output) {
>> +		/* To test HDR, 10 bpc is required, so we need to
>> +		 * set MAX_BPC property to 10bpc prior to setting
>> +		 * HDR metadata property. Therefore, checking.
>> +		 */
>> +		if (!has_max_bpc(output) || !has_hdr(output)) {
>> +			igt_info("%s connector not found with HDR metadata/max_bpc connector property\n", output->name);
>> +			continue;
>> +		}
>> +
>> +		if (!igt_hdr_is_panel_hdr(data->fd, output->id)) {
>> +			igt_info("Panel attached via %s connector is non-HDR\n", output->name);
>> +			continue;
>> +		}
>> +
>> +		igt_info("HDR %s test execution on %s\n", test_name, output->name);
>> +		if (flags & TEST_NONE || flags & TEST_DPMS || flags & TEST_SUSPEND)
>> +			test_static_toggle(data, output, flags);
>> +		if (flags & TEST_SWAP)
>> +			test_static_swap(data, output, fill_metadata, mode_name);
>> +
>> +		valid_tests++;
>> +	}
>> +
>> +	igt_require_f(valid_tests, "No connector found with HDR metadata/max_bpc connector property (or) panel is non-HDR\n");
>> +}
>> +
   The file uses igt_main(), igt_fixture(), igt_subtest(), IGT_TEST_DESCRIPTION(),
   and igt_assert*() -- this is a test, not a tool. IGT tools (e.g., intel_gpu_top,
   amd_hdmi_compliance) typically have a regular main() with argument parsing. If
   this is intentionally a test that requires manual visual confirmation, it should
   go in tests/ (perhaps tests/amdgpu/), not tools/. If it must be a tool, decouple
   it from the test framework.

   Alternatively, if the intent is to keep the igt_main() pattern (as
   amd_hdmi_compliance.c does), then IGT_TEST_DESCRIPTION() is acceptable but the
   patch description should clarify this is a manual-verification test binary placed
   in tools/ because it requires human interaction and shouldn't run in CI.
>> +int igt_main()
>> +{
>> +	data_t data = { 0 };
>> +
>> +	igt_fixture() {
>> +		data.fd = drm_open_driver_master(DRIVER_AMDGPU);
>> +
>> +		kmstest_set_vt_graphics_mode();
>> +
>> +		igt_display_require(&data.display, data.fd);
>> +		igt_require(data.display.is_atomic);
>> +
>> +		igt_display_require_output(&data.display);
>> +	}
>> +
>> +	igt_describe("Tests swapping to SMPTE ST2084 HDR metadata");
>> +	igt_subtest("static-swap-smpte2084")
>> +		test_hdr(&data, "static-swap-smpte2084", TEST_SWAP,
>> +			 igt_hdr_fill_output_metadata_st2084, "smpte2084");
>> +
>> +	igt_describe("Tests swapping to traditional SDR gamma HDR metadata");
>> +	igt_subtest("static-swap-traditional-sdr")
>> +		test_hdr(&data, "static-swap-traditional-sdr", TEST_SWAP,
>> +			 igt_hdr_fill_output_metadata_sdr, "traditional-sdr");
>> +
>> +	igt_fixture() {
>> +		igt_display_fini(&data.display);
>> +	}
>> +}
>> diff --git a/tools/meson.build b/tools/meson.build
>> index 8185ba160..9612acd83 100644
>> --- a/tools/meson.build
>> +++ b/tools/meson.build
>> @@ -104,6 +104,11 @@ executable('amd_hdmi_compliance', 'amd_hdmi_compliance.c',
>>  	   install_rpath : bindir_rpathdir,
>>  	   install : true)
>>  
>> +executable('amd_hdr_visual', 'amd_hdr_visual.c',
>> +	   dependencies : [tool_deps],
>> +	   install_rpath : bindir_rpathdir,
>> +	   install : true)
>> +
>>  if libudev.found()
>>  	msm_dp_compliance_src = [
>>  		'msm_dp_compliance.c',
>> -- 
>> 2.43.0
>>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification
  2026-03-18 20:13     ` vitaly prosyak
@ 2026-03-18 20:15       ` Alex Hung
  0 siblings, 0 replies; 14+ messages in thread
From: Alex Hung @ 2026-03-18 20:15 UTC (permalink / raw)
  To: vitaly prosyak, Kamil Konieczny, igt-dev, wayne.lin,
	Mark.Broadworth, Vitaly Prosyak



On 3/18/26 14:13, vitaly prosyak wrote:
>     The file uses igt_main(), igt_fixture(), igt_subtest(), IGT_TEST_DESCRIPTION(),
>     and igt_assert*() -- this is a test, not a tool. IGT tools (e.g., intel_gpu_top,
>     amd_hdmi_compliance) typically have a regular main() with argument parsing. If
>     this is intentionally a test that requires manual visual confirmation, it should
>     go in tests/ (perhaps tests/amdgpu/), not tools/. If it must be a tool, decouple
>     it from the test framework.
> 
>     Alternatively, if the intent is to keep the igt_main() pattern (as
>     amd_hdmi_compliance.c does), then IGT_TEST_DESCRIPTION() is acceptable but the
>     patch description should clarify this is a manual-verification test binary placed
>     in tools/ because it requires human interaction and shouldn't run in CI.

Thank. I will fix it in V2 after I can rebase to another WIP patch series.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification
  2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
  2026-03-18  9:52   ` Kamil Konieczny
@ 2026-03-19  8:54   ` Jani Nikula
  1 sibling, 0 replies; 14+ messages in thread
From: Jani Nikula @ 2026-03-19  8:54 UTC (permalink / raw)
  To: Alex Hung, igt-dev; +Cc: wayne.lin, Mark.Broadworth, Alex Hung

On Tue, 17 Mar 2026, Alex Hung <alex.hung@amd.com> wrote:
> From: Wayne Lin <wayne.lin@amd.com>
>
> Add a visual verification tool for AMD HDR display output. This tool
> displays HDR test patterns with different metadata types and waits for
> user confirmation, enabling manual inspection of HDR output quality.
>
> Subtests:
> - static-swap-smpte2084: Display with SMPTE ST2084 (PQ) HDR metadata
> - static-swap-traditional-sdr: Display with traditional SDR gamma metadata
>
> Co-developed-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Alex Hung <alex.hung@amd.com>
> Signed-off-by: Wayne Lin <wayne.lin@amd.com>
> ---
>  tools/amd_hdr_visual.c | 372 +++++++++++++++++++++++++++++++++++++++++
>  tools/meson.build      |   5 +
>  2 files changed, 377 insertions(+)
>  create mode 100644 tools/amd_hdr_visual.c
>
> diff --git a/tools/amd_hdr_visual.c b/tools/amd_hdr_visual.c
> new file mode 100644
> index 000000000..58decb356
> --- /dev/null
> +++ b/tools/amd_hdr_visual.c
> @@ -0,0 +1,372 @@
> +/*
> + * Copyright 2026 Advanced Micro Devices, Inc.
> + *
> + * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 <fcntl.h>
> +#include <termios.h>
> +#include <unistd.h>
> +#include "igt_edid.h"
> +#include "igt_hdr.h"
> +
> +IGT_TEST_DESCRIPTION("Test HDR metadata interfaces and bpc switch");
> +
> +/* Test flags. */
> +enum {
> +	TEST_NONE = 1 << 0,
> +	TEST_DPMS = 1 << 1,
> +	TEST_SUSPEND = 1 << 2,
> +	TEST_SWAP = 1 << 3,
> +};
> +
> +/* BPC connector state. */
> +typedef struct output_bpc {
> +	unsigned int current;
> +	unsigned int maximum;
> +} output_bpc_t;
> +
> +/* Common test data. */
> +typedef struct data {
> +	igt_display_t display;
> +	igt_plane_t *primary;
> +	igt_output_t *output;
> +	igt_crtc_t *pipe;
> +	igt_pipe_crc_t *pipe_crc;
> +	drmModeModeInfo *mode;
> +	enum pipe pipe_id;

Please avoid using enum pipe and crtc->pipe for anything unless you
actually really *really* need to know the (Intel) hardware pipe.

Further details at [1].

BR,
Jani.



[1] https://lore.kernel.org/r/356099f0d5b2c882460e344869720b92c0da538d@intel.com



> +	int fd;
> +	int w;
> +	int h;
> +} data_t;

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* ✓ Xe.CI.FULL: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
  2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
                   ` (5 preceding siblings ...)
  2026-03-18  9:30 ` Kamil Konieczny
@ 2026-03-19 13:42 ` Patchwork
  6 siblings, 0 replies; 14+ messages in thread
From: Patchwork @ 2026-03-19 13:42 UTC (permalink / raw)
  To: Alex Hung; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 47428 bytes --]

== Series Details ==

Series: series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library
URL   : https://patchwork.freedesktop.org/series/163396/
State : success

== Summary ==

CI Bug Log - changes from XEIGT_8807_FULL -> XEIGTPW_14795_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (2 -> 2)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in XEIGTPW_14795_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@4-tiled-8bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][1] ([Intel XE#2327]) +3 other tests skip
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip:
    - shard-bmg:          NOTRUN -> [SKIP][2] ([Intel XE#1124]) +7 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
    - shard-bmg:          [PASS][3] -> [SKIP][4] ([Intel XE#2314] / [Intel XE#2894] / [Intel XE#7373])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-9/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-bmg:          [PASS][5] -> [SKIP][6] ([Intel XE#7621])
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-9/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-2-displays-2160x1440p:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#367] / [Intel XE#7354])
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_bw@linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][8] ([Intel XE#2887]) +5 other tests skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][9] ([Intel XE#3432])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-c-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][10] ([Intel XE#2652]) +8 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-bmg:          NOTRUN -> [SKIP][11] ([Intel XE#2252]) +2 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_content_protection@atomic-dpms-hdcp14@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][12] ([Intel XE#3304] / [Intel XE#7374])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_content_protection@atomic-dpms-hdcp14@pipe-a-dp-2.html

  * igt@kms_content_protection@atomic-hdcp14:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#7194])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_content_protection@atomic-hdcp14.html

  * igt@kms_content_protection@srm@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][14] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_content_protection@srm@pipe-a-dp-2.html

  * igt@kms_content_protection@uevent-hdcp14:
    - shard-bmg:          NOTRUN -> [FAIL][15] ([Intel XE#6707] / [Intel XE#7439]) +1 other test fail
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_content_protection@uevent-hdcp14.html

  * igt@kms_cursor_crc@cursor-onscreen-512x512:
    - shard-bmg:          NOTRUN -> [SKIP][16] ([Intel XE#2321] / [Intel XE#7355])
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_cursor_crc@cursor-onscreen-512x512.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][17] ([Intel XE#2320]) +5 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-legacy:
    - shard-bmg:          [PASS][18] -> [SKIP][19] ([Intel XE#2291]) +2 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-bmg:          NOTRUN -> [SKIP][20] ([Intel XE#2291])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_display_modes@extended-mode-basic:
    - shard-bmg:          [PASS][21] -> [SKIP][22] ([Intel XE#4302])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-7/igt@kms_display_modes@extended-mode-basic.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dp_aux_dev:
    - shard-bmg:          [PASS][23] -> [SKIP][24] ([Intel XE#3009])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-3/igt@kms_dp_aux_dev.html
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_dp_aux_dev.html

  * igt@kms_flip@2x-flip-vs-panning-vs-hang:
    - shard-bmg:          NOTRUN -> [SKIP][25] ([Intel XE#2316])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_flip@2x-flip-vs-panning-vs-hang.html

  * igt@kms_flip@2x-wf_vblank-ts-check:
    - shard-bmg:          [PASS][26] -> [SKIP][27] ([Intel XE#2316]) +4 other tests skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-9/igt@kms_flip@2x-wf_vblank-ts-check.html
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_flip@2x-wf_vblank-ts-check.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#7178] / [Intel XE#7351]) +3 other tests skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-downscaling.html

  * igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw:
    - shard-bmg:          NOTRUN -> [SKIP][29] ([Intel XE#2311]) +13 other tests skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-move:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#2312]) +7 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#4141]) +6 other tests skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#2313]) +11 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
    - shard-bmg:          NOTRUN -> [SKIP][34] ([Intel XE#2352] / [Intel XE#7399])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html

  * igt@kms_hdmi_inject@inject-audio:
    - shard-bmg:          [PASS][35] -> [SKIP][36] ([Intel XE#7308])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_hdmi_inject@inject-audio.html
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_hdmi_inject@inject-audio.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-bmg:          [PASS][37] -> [SKIP][38] ([Intel XE#1503])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-3/igt@kms_hdr@static-toggle-dpms.html
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier-source-clamping:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#7283])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier-source-clamping.html

  * igt@kms_plane_multiple@2x-tiling-yf:
    - shard-bmg:          NOTRUN -> [SKIP][40] ([Intel XE#4596])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_plane_multiple@2x-tiling-yf.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a:
    - shard-bmg:          NOTRUN -> [SKIP][41] ([Intel XE#2763] / [Intel XE#6886]) +3 other tests skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-bmg:          NOTRUN -> [SKIP][42] ([Intel XE#7376] / [Intel XE#870])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_dc@dc3co-vpb-simulation:
    - shard-bmg:          NOTRUN -> [SKIP][43] ([Intel XE#2391] / [Intel XE#6927])
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_pm_dc@deep-pkgc:
    - shard-bmg:          NOTRUN -> [SKIP][44] ([Intel XE#2505] / [Intel XE#7447])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_pm_dc@deep-pkgc.html

  * igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#1489]) +5 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#2387] / [Intel XE#7429])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_psr2_su@page_flip-nv12.html

  * igt@kms_psr@fbc-psr2-cursor-plane-move:
    - shard-bmg:          NOTRUN -> [SKIP][47] ([Intel XE#2234] / [Intel XE#2850]) +5 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_psr@fbc-psr2-cursor-plane-move.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][48] ([Intel XE#1406] / [Intel XE#2414])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_sharpness_filter@filter-toggle:
    - shard-bmg:          NOTRUN -> [SKIP][49] ([Intel XE#6503])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_sharpness_filter@filter-toggle.html

  * igt@kms_vrr@cmrr:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#2168] / [Intel XE#7444])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@kms_vrr@cmrr.html

  * igt@kms_vrr@flip-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][51] ([Intel XE#1499]) +1 other test skip
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_vrr@flip-suspend.html

  * igt@xe_eudebug@vma-ufence:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#4837]) +3 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@xe_eudebug@vma-ufence.html

  * igt@xe_eudebug_online@writes-caching-vram-bb-vram-target-vram:
    - shard-bmg:          NOTRUN -> [SKIP][53] ([Intel XE#4837] / [Intel XE#6665]) +4 other tests skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@xe_eudebug_online@writes-caching-vram-bb-vram-target-vram.html

  * igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate:
    - shard-bmg:          NOTRUN -> [SKIP][54] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate.html

  * igt@xe_exec_fault_mode@once-multi-queue-rebind-imm:
    - shard-bmg:          NOTRUN -> [SKIP][55] ([Intel XE#7136]) +6 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@xe_exec_fault_mode@once-multi-queue-rebind-imm.html

  * igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-userptr-invalidate:
    - shard-bmg:          NOTRUN -> [SKIP][56] ([Intel XE#6874]) +16 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@xe_exec_multi_queue@many-execs-preempt-mode-fault-userptr-invalidate.html

  * igt@xe_exec_threads@threads-multi-queue-mixed-userptr-invalidate-race:
    - shard-bmg:          NOTRUN -> [SKIP][57] ([Intel XE#7138]) +5 other tests skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@xe_exec_threads@threads-multi-queue-mixed-userptr-invalidate-race.html

  * igt@xe_pat@pat-index-xehpc:
    - shard-bmg:          NOTRUN -> [SKIP][58] ([Intel XE#1420])
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@xe_pat@pat-index-xehpc.html

  * igt@xe_pm@d3cold-basic:
    - shard-bmg:          NOTRUN -> [SKIP][59] ([Intel XE#2284] / [Intel XE#7370])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@xe_pm@d3cold-basic.html

  * igt@xe_pxp@pxp-stale-queue-post-termination-irq:
    - shard-bmg:          NOTRUN -> [SKIP][60] ([Intel XE#4733] / [Intel XE#7417])
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@xe_pxp@pxp-stale-queue-post-termination-irq.html

  * igt@xe_query@multigpu-query-engines:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#944])
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@xe_query@multigpu-query-engines.html

  * igt@xe_sriov_flr@flr-basic@numvfs-1:
    - shard-bmg:          [PASS][62] -> [FAIL][63] ([Intel XE#5937]) +1 other test fail
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-3/igt@xe_sriov_flr@flr-basic@numvfs-1.html
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@xe_sriov_flr@flr-basic@numvfs-1.html

  
#### Possible fixes ####

  * igt@core_hotunplug@hotreplug:
    - shard-bmg:          [ABORT][64] ([Intel XE#7578]) -> [PASS][65]
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-8/igt@core_hotunplug@hotreplug.html
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@core_hotunplug@hotreplug.html

  * igt@core_hotunplug@hotunplug-rescan:
    - shard-bmg:          [SKIP][66] ([Intel XE#6779]) -> [PASS][67]
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@core_hotunplug@hotunplug-rescan.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@core_hotunplug@hotunplug-rescan.html

  * igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
    - shard-bmg:          [SKIP][68] ([Intel XE#2291]) -> [PASS][69] +3 other tests pass
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-legacy:
    - shard-bmg:          [SKIP][70] ([Intel XE#2291] / [Intel XE#7343]) -> [PASS][71] +1 other test pass
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [SKIP][72] ([Intel XE#2316]) -> [PASS][73] +6 other tests pass
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@flip-vs-expired-vblank@b-edp1:
    - shard-lnl:          [FAIL][74] ([Intel XE#301]) -> [PASS][75] +1 other test pass
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank@b-edp1.html

  * igt@kms_flip@flip-vs-suspend@a-hdmi-a3:
    - shard-bmg:          [INCOMPLETE][76] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][77] +1 other test pass
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-6/igt@kms_flip@flip-vs-suspend@a-hdmi-a3.html
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_flip@flip-vs-suspend@a-hdmi-a3.html

  * igt@kms_flip@plain-flip-fb-recreate@c-hdmi-a3:
    - shard-bmg:          [DMESG-FAIL][78] ([Intel XE#5545]) -> [PASS][79] +1 other test pass
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_flip@plain-flip-fb-recreate@c-hdmi-a3.html
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_flip@plain-flip-fb-recreate@c-hdmi-a3.html

  * igt@kms_hdr@static-toggle:
    - shard-bmg:          [SKIP][80] ([Intel XE#1503]) -> [PASS][81]
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_hdr@static-toggle.html
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_hdr@static-toggle.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-bmg:          [SKIP][82] ([Intel XE#7086]) -> [PASS][83]
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_joiner@basic-force-big-joiner.html
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-lnl:          [FAIL][84] ([Intel XE#7340]) -> [PASS][85]
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-lnl-1/igt@kms_pm_dc@dc5-psr.html
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-lnl-6/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-bmg:          [SKIP][86] ([Intel XE#1435]) -> [PASS][87]
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_setmode@invalid-clone-single-crtc.html
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
    - shard-bmg:          [FAIL][88] ([Intel XE#5937]) -> [PASS][89]
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html

  * igt@xe_exec_system_allocator@fault-threads-benchmark:
    - shard-bmg:          [FAIL][90] -> [PASS][91]
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@xe_exec_system_allocator@fault-threads-benchmark.html
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@xe_exec_system_allocator@fault-threads-benchmark.html

  * igt@xe_exec_system_allocator@many-large-execqueues-mmap-free-nomemset:
    - shard-bmg:          [SKIP][92] ([Intel XE#6703]) -> [PASS][93] +110 other tests pass
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_system_allocator@many-large-execqueues-mmap-free-nomemset.html
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@xe_exec_system_allocator@many-large-execqueues-mmap-free-nomemset.html

  * igt@xe_exec_system_allocator@twice-large-mmap:
    - shard-bmg:          [SKIP][94] ([Intel XE#6557] / [Intel XE#6703]) -> [PASS][95] +2 other tests pass
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_system_allocator@twice-large-mmap.html
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@xe_exec_system_allocator@twice-large-mmap.html

  
#### Warnings ####

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-bmg:          [SKIP][96] ([Intel XE#6703]) -> [SKIP][97] ([Intel XE#1124]) +1 other test skip
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p:
    - shard-bmg:          [SKIP][98] ([Intel XE#6703]) -> [SKIP][99] ([Intel XE#2314] / [Intel XE#2894] / [Intel XE#7373])
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_bw@connected-linear-tiling-2-displays-2160x1440p.html

  * igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc:
    - shard-bmg:          [SKIP][100] ([Intel XE#6703]) -> [SKIP][101] ([Intel XE#2887]) +3 other tests skip
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_ccs@missing-ccs-buffer-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_chamelium_edid@dp-edid-read:
    - shard-bmg:          [SKIP][102] ([Intel XE#6703]) -> [SKIP][103] ([Intel XE#2252]) +1 other test skip
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_chamelium_edid@dp-edid-read.html
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_chamelium_edid@dp-edid-read.html

  * igt@kms_content_protection@atomic-dpms-hdcp14:
    - shard-bmg:          [SKIP][104] ([Intel XE#7194]) -> [FAIL][105] ([Intel XE#3304] / [Intel XE#7374])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_content_protection@atomic-dpms-hdcp14.html
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_content_protection@atomic-dpms-hdcp14.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-bmg:          [SKIP][106] ([Intel XE#6703]) -> [SKIP][107] ([Intel XE#2390] / [Intel XE#6974])
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_content_protection@dp-mst-type-1.html
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@kms_content_protection@dp-mst-type-1.html

  * igt@kms_content_protection@lic-type-0:
    - shard-bmg:          [FAIL][108] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374]) -> [SKIP][109] ([Intel XE#2341])
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-3/igt@kms_content_protection@lic-type-0.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@srm:
    - shard-bmg:          [SKIP][110] ([Intel XE#2341]) -> [FAIL][111] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374])
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_content_protection@srm.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_content_protection@srm.html

  * igt@kms_content_protection@uevent:
    - shard-bmg:          [FAIL][112] ([Intel XE#6707] / [Intel XE#7439]) -> [SKIP][113] ([Intel XE#2341])
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-7/igt@kms_content_protection@uevent.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-random-256x85:
    - shard-bmg:          [SKIP][114] ([Intel XE#6703]) -> [SKIP][115] ([Intel XE#2320])
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_cursor_crc@cursor-random-256x85.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_cursor_crc@cursor-random-256x85.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-bmg:          [SKIP][116] ([Intel XE#6703]) -> [SKIP][117] ([Intel XE#2321] / [Intel XE#7355])
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_cursor_crc@cursor-sliding-512x512.html
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-bmg:          [SKIP][118] ([Intel XE#6703]) -> [SKIP][119] ([Intel XE#2291] / [Intel XE#7343])
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_dsc@dsc-with-formats:
    - shard-bmg:          [SKIP][120] ([Intel XE#6703]) -> [SKIP][121] ([Intel XE#2244])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_dsc@dsc-with-formats.html
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_dsc@dsc-with-formats.html

  * igt@kms_flip@2x-dpms-vs-vblank-race:
    - shard-bmg:          [SKIP][122] ([Intel XE#6703]) -> [SKIP][123] ([Intel XE#2316])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_flip@2x-dpms-vs-vblank-race.html
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_flip@2x-dpms-vs-vblank-race.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
    - shard-bmg:          [SKIP][124] ([Intel XE#6703]) -> [SKIP][125] ([Intel XE#7178] / [Intel XE#7351])
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][126] ([Intel XE#6557] / [Intel XE#6703]) -> [SKIP][127] ([Intel XE#2311])
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-wc.html
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][128] ([Intel XE#2312]) -> [SKIP][129] ([Intel XE#2311]) +14 other tests skip
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][130] ([Intel XE#6703]) -> [SKIP][131] ([Intel XE#2311]) +6 other tests skip
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render.html
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][132] ([Intel XE#2311]) -> [SKIP][133] ([Intel XE#2312]) +10 other tests skip
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][134] ([Intel XE#4141]) -> [SKIP][135] ([Intel XE#2312]) +8 other tests skip
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt.html
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-pgflip-blt:
    - shard-bmg:          [SKIP][136] ([Intel XE#2312]) -> [SKIP][137] ([Intel XE#4141]) +6 other tests skip
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-pgflip-blt.html
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          [SKIP][138] ([Intel XE#6703]) -> [SKIP][139] ([Intel XE#4141]) +1 other test skip
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt.html
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y:
    - shard-bmg:          [SKIP][140] ([Intel XE#6703]) -> [SKIP][141] ([Intel XE#2352] / [Intel XE#7399])
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y.html
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          [SKIP][142] ([Intel XE#6703]) -> [SKIP][143] ([Intel XE#2313]) +7 other tests skip
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-msflip-blt:
    - shard-bmg:          [SKIP][144] ([Intel XE#2313]) -> [SKIP][145] ([Intel XE#2312]) +15 other tests skip
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-msflip-blt.html
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][146] ([Intel XE#2312]) -> [SKIP][147] ([Intel XE#2313]) +10 other tests skip
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-5/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_joiner@basic-big-joiner:
    - shard-bmg:          [SKIP][148] ([Intel XE#6703]) -> [SKIP][149] ([Intel XE#6901])
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_joiner@basic-big-joiner.html
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@kms_joiner@basic-big-joiner.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-bmg:          [SKIP][150] ([Intel XE#6703]) -> [SKIP][151] ([Intel XE#7591])
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-2/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_plane@pixel-format-4-tiled-mtl-rc-ccs-modifier:
    - shard-bmg:          [SKIP][152] ([Intel XE#6703]) -> [SKIP][153] ([Intel XE#7283])
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_plane@pixel-format-4-tiled-mtl-rc-ccs-modifier.html
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@kms_plane@pixel-format-4-tiled-mtl-rc-ccs-modifier.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75:
    - shard-bmg:          [SKIP][154] ([Intel XE#6703]) -> [SKIP][155] ([Intel XE#2763] / [Intel XE#6886])
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html

  * igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area:
    - shard-bmg:          [SKIP][156] ([Intel XE#6703]) -> [SKIP][157] ([Intel XE#1489])
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area.html
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-9/igt@kms_psr2_sf@pr-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr@pr-cursor-plane-onoff:
    - shard-bmg:          [SKIP][158] ([Intel XE#6703]) -> [SKIP][159] ([Intel XE#2234] / [Intel XE#2850]) +2 other tests skip
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_psr@pr-cursor-plane-onoff.html
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_psr@pr-cursor-plane-onoff.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-bmg:          [SKIP][160] ([Intel XE#6703]) -> [SKIP][161] ([Intel XE#1435])
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_setmode@clone-exclusive-crtc.html
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-3/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_sharpness_filter@filter-basic:
    - shard-bmg:          [SKIP][162] ([Intel XE#6703]) -> [SKIP][163] ([Intel XE#6503])
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@kms_sharpness_filter@filter-basic.html
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-1/igt@kms_sharpness_filter@filter-basic.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][164] ([Intel XE#2426] / [Intel XE#5848]) -> [SKIP][165] ([Intel XE#2509] / [Intel XE#7437])
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-1/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@xe_eudebug@multigpu-basic-client:
    - shard-bmg:          [SKIP][166] ([Intel XE#6703]) -> [SKIP][167] ([Intel XE#4837])
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_eudebug@multigpu-basic-client.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-7/igt@xe_eudebug@multigpu-basic-client.html

  * igt@xe_evict@evict-threads-small-multi-queue:
    - shard-bmg:          [SKIP][168] ([Intel XE#6703]) -> [SKIP][169] ([Intel XE#7140])
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_evict@evict-threads-small-multi-queue.html
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@xe_evict@evict-threads-small-multi-queue.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind:
    - shard-bmg:          [SKIP][170] ([Intel XE#6703]) -> [SKIP][171] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind.html
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-bind.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race-imm:
    - shard-bmg:          [SKIP][172] ([Intel XE#6703]) -> [SKIP][173] ([Intel XE#7136]) +1 other test skip
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race-imm.html
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-6/igt@xe_exec_fault_mode@twice-multi-queue-userptr-invalidate-race-imm.html

  * igt@xe_exec_multi_queue@few-execs-preempt-mode-close-fd-smem:
    - shard-bmg:          [SKIP][174] ([Intel XE#6703]) -> [SKIP][175] ([Intel XE#6874]) +4 other tests skip
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_multi_queue@few-execs-preempt-mode-close-fd-smem.html
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-4/igt@xe_exec_multi_queue@few-execs-preempt-mode-close-fd-smem.html

  * igt@xe_exec_threads@threads-multi-queue-fd-userptr-rebind:
    - shard-bmg:          [SKIP][176] ([Intel XE#6703]) -> [SKIP][177] ([Intel XE#7138]) +1 other test skip
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_exec_threads@threads-multi-queue-fd-userptr-rebind.html
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-5/igt@xe_exec_threads@threads-multi-queue-fd-userptr-rebind.html

  * igt@xe_pm@d3cold-mmap-system:
    - shard-bmg:          [SKIP][178] ([Intel XE#6703]) -> [SKIP][179] ([Intel XE#2284] / [Intel XE#7370])
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8807/shard-bmg-2/igt@xe_pm@d3cold-mmap-system.html
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/shard-bmg-8/igt@xe_pm@d3cold-mmap-system.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1420]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1420
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2168
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2352
  [Intel XE#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2391]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2391
  [Intel XE#2414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2414
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2505]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2505
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#3009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3009
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4733]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4733
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#5545]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5545
  [Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
  [Intel XE#5937]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5937
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#6557]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6557
  [Intel XE#6665]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6665
  [Intel XE#6703]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6703
  [Intel XE#6707]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6707
  [Intel XE#6779]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6779
  [Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
  [Intel XE#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
  [Intel XE#6901]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6901
  [Intel XE#6927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6927
  [Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7086]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7086
  [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#7140]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7140
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7194]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7194
  [Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
  [Intel XE#7308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7308
  [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#7354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7354
  [Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
  [Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
  [Intel XE#7373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7373
  [Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
  [Intel XE#7376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7376
  [Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
  [Intel XE#7417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7417
  [Intel XE#7429]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7429
  [Intel XE#7437]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7437
  [Intel XE#7439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7439
  [Intel XE#7444]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7444
  [Intel XE#7447]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7447
  [Intel XE#7578]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7578
  [Intel XE#7591]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7591
  [Intel XE#7621]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7621
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


Build changes
-------------

  * IGT: IGT_8807 -> IGTPW_14795
  * Linux: xe-4735-113073d07f958385b5b80d29b62e10d2cf0181d6 -> xe-4740-c479cdf62a3f9a6101dd020abbc471f35142b3d1

  IGTPW_14795: 14795
  IGT_8807: 7f44d96d705f1583d689f1f8c2275b685b4ca11d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-4735-113073d07f958385b5b80d29b62e10d2cf0181d6: 113073d07f958385b5b80d29b62e10d2cf0181d6
  xe-4740-c479cdf62a3f9a6101dd020abbc471f35142b3d1: c479cdf62a3f9a6101dd020abbc471f35142b3d1

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14795/index.html

[-- Attachment #2: Type: text/html, Size: 57554 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2026-03-19 13:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 17:51 [PATCH 1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Alex Hung
2026-03-17 17:51 ` [PATCH 2/3] tools: Add amd_hdr_visual for manual HDR verification Alex Hung
2026-03-18  9:52   ` Kamil Konieczny
2026-03-18 20:13     ` vitaly prosyak
2026-03-18 20:15       ` Alex Hung
2026-03-19  8:54   ` Jani Nikula
2026-03-17 17:51 ` [PATCH 3/3] lib/igt_hdr: Fix EOTF bit flag checking Alex Hung
2026-03-18  9:55   ` Kamil Konieczny
2026-03-18  0:50 ` ✓ Xe.CI.BAT: success for series starting with [1/3] lib/igt_hdr: Extract HDR helpers into igt_hdr library Patchwork
2026-03-18  1:04 ` ✓ i915.CI.BAT: " Patchwork
2026-03-18  7:34 ` [PATCH 1/3] " Sharma, Swati2
2026-03-18 18:40   ` Alex Hung
2026-03-18  9:30 ` Kamil Konieczny
2026-03-19 13:42 ` ✓ Xe.CI.FULL: success for series starting with [1/3] " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox