[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, ¤t_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