All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/i915/debugfs: Add HDR status to i915_display_info
@ 2026-09-07  3:58 Pranay Samala
  2026-09-07  3:52 ` ✓ CI.KUnit: success for " Patchwork
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Pranay Samala @ 2026-09-07  3:58 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: chaitanya.kumar.borah, sameer.lattannavar, pranay.samala

i915_display_info currently shows per-connector state but not HDR status,
making HDR bringup hard to debug without correlating EDID, userspace,
and driver state.

Print the sink’s HDR capability from the EDID static metadata block,
whether userspace has set the HDR_OUTPUT_METADATA property, and whether
the driver is actually transmitting HDR metadata in the CRTC state. This
distinguishes between a sink advertising HDR support, a property being
set by userspace, and the actual HDR infoframe being sent on the wire.

Assisted-by: GitHub_Copilot:claude-opus-5
Signed-off-by: Pranay Samala <pranay.samala@intel.com>
---
 .../drm/i915/display/intel_display_debugfs.c  | 82 +++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 3e302f23f247..a24c947c23de 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -243,6 +243,86 @@ static void intel_hdmi_info(struct seq_file *m,
 	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
 }
 
+static const char *intel_hdr_eotf_name(enum hdmi_eotf eotf)
+{
+	switch (eotf) {
+	case HDMI_EOTF_TRADITIONAL_GAMMA_SDR:
+		return "SDR";
+	case HDMI_EOTF_TRADITIONAL_GAMMA_HDR:
+		return "HDR-gamma";
+	case HDMI_EOTF_SMPTE_ST2084:
+		return "SMPTE_ST2084";
+	case HDMI_EOTF_BT_2100_HLG:
+		return "HLG";
+	default:
+		return "unknown";
+	}
+}
+
+static void intel_hdr_sink_info(struct seq_file *m,
+				struct drm_connector *connector)
+{
+	const struct hdr_static_metadata *hdr =
+		&connector->display_info.hdr_sink_metadata.hdmi_type1;
+	int i;
+
+	seq_printf(m, "\tHDR sink capable: %s\n",
+		   str_yes_no(hdr->eotf & (BIT(HDMI_EOTF_SMPTE_ST2084) |
+					   BIT(HDMI_EOTF_BT_2100_HLG))));
+	if (!hdr->eotf)
+		return;
+
+	seq_puts(m, "\t\tsupported EOTF:");
+	for (i = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; i <= HDMI_EOTF_BT_2100_HLG; i++)
+		if (hdr->eotf & BIT(i))
+			seq_printf(m, " %s", intel_hdr_eotf_name(i));
+	seq_puts(m, "\n");
+
+	seq_printf(m, "\t\tstatic metadata type1: %s\n",
+		   str_yes_no(hdr->metadata_type & BIT(HDMI_STATIC_METADATA_TYPE1)));
+	seq_printf(m, "\t\tmax_cll: %u, max_fall: %u, min_cll: %u (EDID coded)\n",
+		   hdr->max_cll, hdr->max_fall, hdr->min_cll);
+}
+
+static void intel_hdr_output_info(struct seq_file *m,
+				  struct drm_connector *connector)
+{
+	const struct drm_connector_state *conn_state = connector->state;
+	const struct intel_crtc_state *crtc_state;
+	const struct hdmi_drm_infoframe *frame;
+
+	if (!conn_state || !conn_state->crtc)
+		return;
+
+	crtc_state = to_intel_crtc_state(conn_state->crtc->state);
+
+	seq_printf(m, "\tHDR output metadata blob: %s\n",
+		   str_yes_no(conn_state->hdr_output_metadata));
+
+	/* HDMI signals HDR via a DRM InfoFrame, DP via a gamut metadata SDP */
+	if (!(crtc_state->infoframes.enable &
+	      (intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM) |
+	       intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA)))) {
+		seq_puts(m, "\tHDR output: off\n");
+		return;
+	}
+
+	frame = &crtc_state->infoframes.drm.drm;
+
+	seq_printf(m, "\tHDR output: on, EOTF: %s, metadata type: %d\n",
+		   intel_hdr_eotf_name(frame->eotf), frame->metadata_type);
+	seq_printf(m, "\t\tprimaries: r(%u,%u) g(%u,%u) b(%u,%u) wp(%u,%u)\n",
+		   frame->display_primaries[0].x, frame->display_primaries[0].y,
+		   frame->display_primaries[1].x, frame->display_primaries[1].y,
+		   frame->display_primaries[2].x, frame->display_primaries[2].y,
+		   frame->white_point.x, frame->white_point.y);
+	seq_printf(m, "\t\tmastering luminance: max %u, min %u\n",
+		   frame->max_display_mastering_luminance,
+		   frame->min_display_mastering_luminance);
+	seq_printf(m, "\t\tmax_cll: %u, max_fall: %u\n",
+		   frame->max_cll, frame->max_fall);
+}
+
 static void intel_connector_info(struct seq_file *m,
 				 struct drm_connector *connector)
 {
@@ -264,6 +344,7 @@ static void intel_connector_info(struct seq_file *m,
 	seq_printf(m, "\tsubpixel order: %s\n",
 		   drm_get_subpixel_order_name(connector->display_info.subpixel_order));
 	seq_printf(m, "\tCEA rev: %d\n", connector->display_info.cea_rev);
+	intel_hdr_sink_info(m, connector);
 
 	switch (connector->connector_type) {
 	case DRM_MODE_CONNECTOR_DisplayPort:
@@ -288,6 +369,7 @@ static void intel_connector_info(struct seq_file *m,
 	intel_hdcp_info(m, intel_connector);
 
 	seq_printf(m, "\tmax bpc: %u\n", connector->display_info.bpc);
+	intel_hdr_output_info(m, connector);
 
 	intel_panel_info(m, intel_connector);
 
-- 
2.53.0


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

end of thread, other threads:[~2026-09-08  7:35 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-07  3:58 [PATCH] drm/i915/debugfs: Add HDR status to i915_display_info Pranay Samala
2026-09-07  3:52 ` ✓ CI.KUnit: success for " Patchwork
2026-09-07  4:31 ` ✓ i915.CI.BAT: " Patchwork
2026-09-07  4:38 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-07  5:40 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-09-07  6:49 ` ✗ i915.CI.Full: " Patchwork
2026-09-07 10:10 ` [PATCH] " Jani Nikula
2026-09-08  7:35   ` Samala, Pranay

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.