Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Pranay Samala <pranay.samala@intel.com>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	dri-devel@lists.freedesktop.org
Cc: chaitanya.kumar.borah@intel.com, sameer.lattannavar@intel.com,
	pranay.samala@intel.com
Subject: [PATCH v2 2/2] drm/i915/debugfs: Add HDR status to i915_display_info
Date: Tue,  6 Oct 2026 11:10:04 +0530	[thread overview]
Message-ID: <20261006054004.285744-3-pranay.samala@intel.com> (raw)
In-Reply-To: <20261006054004.285744-1-pranay.samala@intel.com>

i915_display_info prints per-connector state but not the current HDR
status. Add HDR details for each connector to the same debugfs file.

The HDR details are shown in three parts: sink capability, whether
userspace has set HDR_OUTPUT_METADATA, and whether the driver has
actually enabled HDR output.

Assisted-by: LLM
Signed-off-by: Pranay Samala <pranay.samala@intel.com>
---
 .../drm/i915/display/intel_display_debugfs.c  | 90 +++++++++++++++++++
 1 file changed, 90 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..23c2f71f10eb 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -4,6 +4,7 @@
  */
 
 #include <linux/debugfs.h>
+#include <linux/hdmi.h>
 #include <linux/string_choices.h>
 #include <linux/string_helpers.h>
 
@@ -243,6 +244,93 @@ static void intel_hdmi_info(struct seq_file *m,
 	seq_printf(m, "\taudio support: %s\n", str_yes_no(has_audio));
 }
 
+static void intel_hdr_sink_info(struct drm_printer *p,
+				struct drm_connector *connector)
+{
+	const struct hdr_static_metadata *hdr =
+		&connector->display_info.hdr_sink_metadata.hdmi_type1;
+	const struct drm_luminance_range_info *lum =
+		&connector->display_info.luminance_range;
+	int i;
+
+	/*
+	 * Any transfer function other than the mandatory traditional gamma
+	 * SDR one means the sink is declaring HDR support.
+	 */
+	drm_printf_indent(p, 1, "HDR sink capable: %s\n",
+			  str_yes_no(hdr->eotf &
+				     ~BIT(HDMI_EOTF_TRADITIONAL_GAMMA_SDR)));
+	if (!hdr->eotf)
+		return;
+
+	drm_printf_indent(p, 2, "supported EOTFs:\n");
+	for (i = HDMI_EOTF_TRADITIONAL_GAMMA_SDR; i <= HDMI_EOTF_BT_2100_HLG; i++)
+		if (hdr->eotf & BIT(i))
+			drm_printf_indent(p, 3, "%s\n", hdmi_eotf_get_name(i));
+
+	drm_printf_indent(p, 2, "static metadata type1: %s\n",
+			  str_yes_no(hdr->metadata_type &
+				     BIT(HDMI_STATIC_METADATA_TYPE1)));
+
+	/*
+	 * The luminance fields are optional, and an EDID that omits them is
+	 * indistinguishable from one declaring zero. luminance_range is only
+	 * populated when they are actually present.
+	 */
+	if (!lum->max_luminance) {
+		drm_printf_indent(p, 2, "luminance range: not specified\n");
+		return;
+	}
+
+	drm_printf_indent(p, 2, "luminance range: %u-%u nits\n",
+			  lum->min_luminance, lum->max_luminance);
+	drm_printf_indent(p, 2, "EDID max_cll: %u, max_fall: %u, min_cll: %u\n",
+			  hdr->max_cll, hdr->max_fall, hdr->min_cll);
+}
+
+static void intel_hdr_output_info(struct drm_printer *p,
+				  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);
+
+	drm_printf_indent(p, 1, "HDR output metadata blob: %s\n",
+			  str_yes_no(conn_state->hdr_output_metadata));
+
+	/*
+	 * Both HDMI and DP fill in infoframes.drm, but HDMI transmits it as a
+	 * DRM InfoFrame and DP as a gamut metadata SDP, each with its own
+	 * enable bit.
+	 */
+	if (!(crtc_state->infoframes.enable &
+	      (intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM) |
+	       intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA)))) {
+		drm_printf_indent(p, 1, "HDR output: off\n");
+		return;
+	}
+
+	frame = &crtc_state->infoframes.drm.drm;
+
+	drm_printf_indent(p, 1, "HDR output: on, EOTF: %s, metadata type: %d\n",
+			  hdmi_eotf_get_name(frame->eotf), frame->metadata_type);
+	drm_printf_indent(p, 2, "primaries: 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);
+	drm_printf_indent(p, 2, "mastering luminance: max %u nits, min %u (0.0001 nits)\n",
+			  frame->max_display_mastering_luminance,
+			  frame->min_display_mastering_luminance);
+	drm_printf_indent(p, 2, "max_cll: %u nits, max_fall: %u nits\n",
+			  frame->max_cll, frame->max_fall);
+}
+
 static void intel_connector_info(struct seq_file *m,
 				 struct drm_connector *connector)
 {
@@ -264,6 +352,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(&p, connector);
 
 	switch (connector->connector_type) {
 	case DRM_MODE_CONNECTOR_DisplayPort:
@@ -288,6 +377,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(&p, connector);
 
 	intel_panel_info(m, intel_connector);
 
-- 
2.53.0


  parent reply	other threads:[~2026-10-06  5:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-06  5:40 [PATCH v2 0/2] Expose HDR status in debugfs Pranay Samala
2026-10-06  5:40 ` [PATCH v2 1/2] video/hdmi: Add hdmi_eotf_get_name() Pranay Samala
2026-10-06  5:48   ` sashiko-bot
2026-10-06  5:40 ` Pranay Samala [this message]
2026-10-06  5:48 ` ✓ CI.KUnit: success for Expose HDR status in debugfs Patchwork
2026-10-06  6:29 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-06 15:01 ` ✓ Xe.CI.FULL: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261006054004.285744-3-pranay.samala@intel.com \
    --to=pranay.samala@intel.com \
    --cc=chaitanya.kumar.borah@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=sameer.lattannavar@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox