[PATCH] drm/i915/colorspace: Add debugfs entry to read current colorspace

Pranay Samala pranay.samala at intel.com
Tue Jun 10 16:30:50 UTC 2025


Add a debugfs interface to expose the current colorspace setting.
This allows IGT tests to verify colorspace changes by setting the
colorspace and reading it back via this debugfs entry.

Signed-off-by: Pranay Samala <pranay.samala at intel.com>
---
 .../drm/i915/display/intel_display_debugfs.c  | 125 ++++++++++++++++++
 1 file changed, 125 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index ce3f9810c42d..31d852723095 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -1304,6 +1304,129 @@ static const struct file_operations i915_joiner_fops = {
 	.write = i915_joiner_write
 };
 
+static const char *get_dp_colorspace_string(enum dp_colorimetry colorimetry)
+{
+	switch (colorimetry) {
+	case DP_COLORIMETRY_BT709_YCC:
+		return "BT709_YCC";
+	case DP_COLORIMETRY_XVYCC_601:
+		return "XVYCC_601";
+	case DP_COLORIMETRY_XVYCC_709:
+		return "XVYCC_709";
+	case DP_COLORIMETRY_SYCC_601:
+		return "SYCC_601";
+	case DP_COLORIMETRY_OPYCC_601:
+		return "OPYCC_601";
+	case DP_COLORIMETRY_BT2020_CYCC:
+		return "BT2020_CYCC";
+	case DP_COLORIMETRY_BT2020_YCC:
+		return "BT2020_YCC";
+	case DP_COLORIMETRY_DEFAULT:
+		return "Default";
+	default:
+		return "Unknown";
+	}
+}
+
+static const char *get_hdmi_colorspace_string(enum hdmi_colorimetry colorimetry)
+{
+	switch (colorimetry) {
+	case HDMI_COLORIMETRY_NONE:
+		return "None";
+	case HDMI_COLORIMETRY_ITU_601:
+		return "ITU-601"; // Standard definition YCbCr colorimetry
+	case HDMI_COLORIMETRY_ITU_709:
+		return "ITU-709"; // High definition YCbCr colorimetry
+	case HDMI_COLORIMETRY_EXTENDED:
+		return "Extended"; // Extended colorimetry formats (e.g., BT.2020, etc.)
+	default:
+		return "Unknown"; // Unknown or unsupported colorimetry
+	}
+}
+
+static
+const char *get_hdmi_extended_colorspace_string(enum hdmi_extended_colorimetry extended_colorimetry)
+{
+	switch (extended_colorimetry) {
+	case HDMI_EXTENDED_COLORIMETRY_XV_YCC_601:
+		return "XVYCC_601";
+	case HDMI_EXTENDED_COLORIMETRY_XV_YCC_709:
+		return "XVYCC_709";
+	case HDMI_EXTENDED_COLORIMETRY_S_YCC_601:
+		return "SYCC_601";
+	case HDMI_EXTENDED_COLORIMETRY_OPYCC_601:
+		return "OPYCC_601";
+	case HDMI_EXTENDED_COLORIMETRY_OPRGB:
+		return "OPRGB";
+	case HDMI_EXTENDED_COLORIMETRY_BT2020:
+		return "BT2020";
+	case HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM:
+		return "BT2020_CONST_LUM";
+	case HDMI_EXTENDED_COLORIMETRY_RESERVED:
+		return "Reserved";
+	default:
+		return "Unknown";
+	}
+}
+
+static int current_colorspace_show(struct seq_file *m, void *data)
+{
+	struct drm_connector *connector = m->private;
+	struct drm_device *dev = connector->dev;
+	struct drm_crtc *crtc;
+	const char *colorspace_str;
+	const struct intel_crtc_state *crtc_state;
+	int ret, con_type;
+
+	ret = drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
+	if (ret)
+		return ret;
+
+	crtc = connector->state->crtc;
+	if (connector->status != connector_status_connected || !crtc) {
+		ret = -ENODEV;
+		goto out;
+	}
+
+	crtc_state = to_intel_crtc_state(crtc->state);
+	con_type = connector->connector_type;
+
+	if (con_type == DRM_MODE_CONNECTOR_DisplayPort) {
+		// Use VSC colorimetry for DP
+		colorspace_str = get_dp_colorspace_string(crtc_state->infoframes.vsc.colorimetry);
+	} else if (con_type == DRM_MODE_CONNECTOR_HDMIA) {
+		// Use AVI colorimetry for HDMI
+		colorspace_str =
+			get_hdmi_colorspace_string(crtc_state->infoframes.avi.avi.colorimetry);
+	} else {
+		colorspace_str = "No Colorimetry Info";
+	}
+
+	const struct hdmi_avi_infoframe *avi = &crtc_state->infoframes.avi.avi;
+
+	if (strstr(colorspace_str, "Extended"))
+		colorspace_str = get_hdmi_extended_colorspace_string(avi->extended_colorimetry);
+
+	seq_printf(m, "Current Colorspace: %s\n", colorspace_str);
+
+out:	drm_modeset_unlock(&dev->mode_config.connection_mutex);
+
+	return ret;
+}
+
+static int current_colorspace_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, current_colorspace_show, inode->i_private);
+}
+
+static const struct file_operations current_colorspace_fops = {
+	.owner = THIS_MODULE,
+	.open = current_colorspace_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
 /**
  * intel_connector_debugfs_add - add i915 specific connector debugfs files
  * @connector: pointer to a registered intel_connector
@@ -1329,6 +1452,8 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
 	intel_dp_link_training_debugfs_add(connector);
 	intel_link_bw_connector_debugfs_add(connector);
 
+	debugfs_create_file("current_colorspace", 0444, root, connector, &current_colorspace_fops);
+
 	if (DISPLAY_VER(display) >= 11 &&
 	    ((connector_type == DRM_MODE_CONNECTOR_DisplayPort && !connector->mst.dp) ||
 	     connector_type == DRM_MODE_CONNECTOR_eDP)) {
-- 
2.34.1



More information about the Intel-gfx-trybot mailing list