From nobody Thu Mar 19 05:43:43 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F850390200; Thu, 5 Mar 2026 14:21:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772720512; cv=pass; b=bMBoBO61y6X+WPSihHpkqhVVI14vRr/leG0XLgu1NdpcUeR3M4byKKUg3XHTF6UwkQDsUXAC2D5S2FL9uKAKRY/luP5N/+pcQYNwaTLgw4qo/nX3TstJbJPzQkU5e4LUZd+wsEGSlLNLVu7l/SakPviCcZOnw4dt/wc/2QChTBU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772720512; c=relaxed/simple; bh=P4zW/aYLHvc1AfqaAx5DSUp8cAaOi7Hug9auGBzi5Hg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xlop5dFMDMKNctGse94q+jfBfMpRQU9vU7tJY0NN+y22G/Xd+uvIvnPkMS7jQLW8q63jw57RWmNfiB6qciZ8aaGSgIdhPzRIL3ib42FhBTgJk4FTIzFqztNdVpDs6N1RS8nqoivwp4BcEABSnuTL1zTOB7QM6HgvHI74qYh9wTM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=YSJAZuX+; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="YSJAZuX+" ARC-Seal: i=1; a=rsa-sha256; t=1772720465; cv=none; d=zohomail.com; s=zohoarc; b=nukseDq33fm2/CkBxEhyY7QsvFlbR1gHZVXeQMST5sHFByEUH7cZPzLWsjYrxZ+IM5apolXG8YfZvKShGbxYuIwFt5F0XSQdi+Qi67pQTKiIwpAQnLJsIir0TI7TTBCDVTCGIDbQyt/Ia8dOpejpKJzQIqQA/zAd25/cCITH3PA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772720465; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=gP0rDtf+HRM7vDm9+UDadvL2in22pfEjiqqHoecmS3A=; b=Nmm3oE6fZh1OP7ibjcUoMCnB/3kAc/YhZ3MbW458N2J4BimH/JiSpnDlFfEotl6ox/fTEAGTTyNvJFIr74L+DDZIxcLDfFDKbvIhRekMk9/96HYuZwoQufWrPmu6v4fJkzjBvrDDnFXaejjG5fTDZerK5gbQrftZvHWsQmFPAzk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1772720465; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=gP0rDtf+HRM7vDm9+UDadvL2in22pfEjiqqHoecmS3A=; b=YSJAZuX+AGU3pB+np2JyMoMWXHEU0k4H7DRTIkBhL079wmUTY34X+6DyJRJNyzIQ MoiVW6ps7OiZDxIMwJMFwnfOWHLXUVUqkZUwkNjQwJI94fwy3bEo+Pd46lD1/a9ZCVA z0YVqLWowxa/roLytZP4w+/Oq2sb4Zegxk+Wju6w= Received: by mx.zohomail.com with SMTPS id 177272046323312.067103183724726; Thu, 5 Mar 2026 06:21:03 -0800 (PST) From: Nicolas Frattaroli Date: Thu, 05 Mar 2026 15:19:34 +0100 Subject: [PATCH v10 08/22] drm/i915: Implement the "color format" DRM property Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260305-color-format-v10-8-a58c68a11868@collabora.com> References: <20260305-color-format-v10-0-a58c68a11868@collabora.com> In-Reply-To: <20260305-color-format-v10-0-a58c68a11868@collabora.com> To: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?utf-8?q?Christian_K=C3=B6nig?= , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , Dmitry Baryshkov , Sascha Hauer , Rob Herring , Jonathan Corbet , Shuah Khan Cc: kernel@collabora.com, amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-doc@vger.kernel.org, Nicolas Frattaroli , Werner Sembach , Andri Yngvason , Marius Vlad X-Mailer: b4 0.14.3 This includes RGB, YUV420, YUV444 and Auto. Auto will pick RGB, unless the mode being asked for is YUV420-only, in which case it picks YUV420. Should the explicitly requested color format not be supported by the sink, then an error is returned to userspace, so that it can make a better choice. Co-developed-by: Werner Sembach Signed-off-by: Werner Sembach Co-developed-by: Andri Yngvason Signed-off-by: Andri Yngvason Co-developed-by: Marius Vlad Signed-off-by: Marius Vlad Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/i915/display/intel_connector.c | 10 ++++ drivers/gpu/drm/i915/display/intel_connector.h | 1 + drivers/gpu/drm/i915/display/intel_dp.c | 71 ++++++++++++++++++++--= --- drivers/gpu/drm/i915/display/intel_dp.h | 4 ++ drivers/gpu/drm/i915/display/intel_dp_mst.c | 55 +++++++++++++++++++- drivers/gpu/drm/i915/display/intel_hdmi.c | 72 ++++++++++++++++++++--= ---- 6 files changed, 184 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/d= rm/i915/display/intel_connector.c index 7ef9338d67ab..d54ae1522b6f 100644 --- a/drivers/gpu/drm/i915/display/intel_connector.c +++ b/drivers/gpu/drm/i915/display/intel_connector.c @@ -38,6 +38,10 @@ #include "intel_hdcp.h" #include "intel_panel.h" =20 +static const u32 supported_colorformats =3D BIT(DRM_OUTPUT_COLOR_FORMAT_RG= B444) | + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) | + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420); + static void intel_connector_modeset_retry_work_fn(struct work_struct *work) { struct intel_connector *connector =3D container_of(work, typeof(*connecto= r), @@ -321,6 +325,12 @@ intel_attach_dp_colorspace_property(struct drm_connect= or *connector) drm_connector_attach_colorspace_property(connector); } =20 +void +intel_attach_colorformat_property(struct drm_connector *connector) +{ + drm_connector_attach_color_format_property(connector, supported_colorform= ats); +} + void intel_attach_scaling_mode_property(struct drm_connector *connector) { diff --git a/drivers/gpu/drm/i915/display/intel_connector.h b/drivers/gpu/d= rm/i915/display/intel_connector.h index 0aa86626e646..fe6149d1d559 100644 --- a/drivers/gpu/drm/i915/display/intel_connector.h +++ b/drivers/gpu/drm/i915/display/intel_connector.h @@ -31,6 +31,7 @@ void intel_attach_broadcast_rgb_property(struct drm_conne= ctor *connector); void intel_attach_aspect_ratio_property(struct drm_connector *connector); void intel_attach_hdmi_colorspace_property(struct drm_connector *connector= ); void intel_attach_dp_colorspace_property(struct drm_connector *connector); +void intel_attach_colorformat_property(struct drm_connector *connector); void intel_attach_scaling_mode_property(struct drm_connector *connector); void intel_connector_queue_modeset_retry_work(struct intel_connector *conn= ector); void intel_connector_cancel_modeset_retry_work(struct intel_connector *con= nector); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915= /display/intel_dp.c index 0c03b6fb6fd8..18e55edbb7f8 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -1178,7 +1178,7 @@ dfp_can_convert(struct intel_dp *intel_dp, return false; } =20 -static enum intel_output_format +enum intel_output_format intel_dp_output_format(struct intel_connector *connector, enum intel_output_format sink_format) { @@ -3337,17 +3337,24 @@ intel_dp_compute_output_format(struct intel_encoder= *encoder, struct intel_connector *connector =3D intel_dp->attached_connector; const struct drm_display_info *info =3D &connector->base.display_info; const struct drm_display_mode *adjusted_mode =3D &crtc_state->hw.adjusted= _mode; - bool ycbcr_420_only; + enum drm_connector_color_format actual_format; int ret; =20 - ycbcr_420_only =3D drm_mode_is_420_only(info, adjusted_mode); + if ((conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420 = && + drm_mode_is_420(info, adjusted_mode)) || + (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_AUTO && + drm_mode_is_420_only(info, adjusted_mode))) + crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR420; + else if (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR= 444) + crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR444; + else + crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; =20 - if (ycbcr_420_only && !connector->base.ycbcr_420_allowed) { + if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420 && + !connector->base.ycbcr_420_allowed) { drm_dbg_kms(display->drm, - "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back= to RGB.\n"); - crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; - } else { - crtc_state->sink_format =3D intel_dp_sink_format(connector, adjusted_mod= e); + "YCbCr 4:2:0 mode requested but unsupported by connector.\n"); + return -EINVAL; } =20 crtc_state->output_format =3D intel_dp_output_format(connector, crtc_stat= e->sink_format); @@ -3355,9 +3362,20 @@ intel_dp_compute_output_format(struct intel_encoder = *encoder, ret =3D intel_dp_compute_link_config(encoder, crtc_state, conn_state, respect_downstream_limits); if (ret) { - if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420 || - !connector->base.ycbcr_420_allowed || - !drm_mode_is_420_also(info, adjusted_mode)) + /* + * If no valid link config can be found due to bandwidth constraints, + * degrade from RGB/YCbCr 4:4:4 to YCbCr 4:2:0 if permitted by + * the source and sink. + */ + if (!connector->base.ycbcr_420_allowed) + return ret; + /* No point in trying YCbCr420 a second time. */ + if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420) + return ret; + if (!drm_mode_is_420(info, adjusted_mode)) + return ret; + /* If a non-AUTO color format is chosen, don't fall back. */ + if (conn_state->color_format) return ret; =20 crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR420; @@ -3365,9 +3383,36 @@ intel_dp_compute_output_format(struct intel_encoder = *encoder, crtc_state->sink_format); ret =3D intel_dp_compute_link_config(encoder, crtc_state, conn_state, respect_downstream_limits); + if (ret) + return ret; } =20 - return ret; + if (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_AUTO) + return 0; + + switch (crtc_state->sink_format) { + case INTEL_OUTPUT_FORMAT_RGB: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_RGB444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR444: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR420: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420; + break; + default: + drm_dbg_kms(display->drm, "Intel format %d has no connector equivalent\n= ", + crtc_state->sink_format); + return -EINVAL; + } + + if (actual_format !=3D conn_state->color_format) { + drm_dbg_kms(display->drm, "Requested connector color format %d, got %d\n= ", + conn_state->color_format, actual_format); + return -EINVAL; + } + + return 0; } =20 void @@ -6939,6 +6984,8 @@ intel_dp_add_properties(struct intel_dp *intel_dp, st= ruct drm_connector *_connec intel_attach_dp_colorspace_property(&connector->base); } =20 + intel_attach_colorformat_property(&connector->base); + if (intel_dp_has_gamut_metadata_dip(&dp_to_dig_port(intel_dp)->base)) drm_connector_attach_hdr_output_metadata_property(&connector->base); =20 diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915= /display/intel_dp.h index 2849b9ecdc71..c42badf752e2 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -204,6 +204,10 @@ bool intel_dp_compute_config_limits(struct intel_dp *i= ntel_dp, void intel_dp_get_dsc_sink_cap(u8 dpcd_rev, const struct drm_dp_desc *desc, bool is_branch, struct intel_connector *connector); +enum intel_output_format +intel_dp_output_format(struct intel_connector *connector, + enum intel_output_format sink_format); + bool intel_dp_has_gamut_metadata_dip(struct intel_encoder *encoder); =20 bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate, diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/= i915/display/intel_dp_mst.c index 0bb39f9bd74e..ebccb54acf5d 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -704,10 +704,13 @@ static int mst_stream_compute_config(struct intel_enc= oder *encoder, struct intel_atomic_state *state =3D to_intel_atomic_state(conn_state->st= ate); struct intel_crtc *crtc =3D to_intel_crtc(pipe_config->uapi.crtc); struct intel_dp *intel_dp =3D to_primary_dp(encoder); + enum drm_connector_color_format actual_format; struct intel_connector *connector =3D to_intel_connector(conn_state->connector); const struct drm_display_mode *adjusted_mode =3D &pipe_config->hw.adjusted_mode; + const struct drm_display_info *info =3D + &connector->base.display_info; int num_joined_pipes; int ret =3D -EINVAL; =20 @@ -718,10 +721,53 @@ static int mst_stream_compute_config(struct intel_enc= oder *encoder, if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) return -EINVAL; =20 - pipe_config->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; - pipe_config->output_format =3D INTEL_OUTPUT_FORMAT_RGB; + if ((conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420 = && + drm_mode_is_420(info, adjusted_mode)) || + (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_AUTO && + drm_mode_is_420_only(info, adjusted_mode))) { + pipe_config->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR420; + } else if (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCB= CR444) { + pipe_config->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR444; + } else if (conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_AUT= O || + conn_state->color_format =3D=3D DRM_CONNECTOR_COLOR_FORMAT_RGB444) { + pipe_config->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; + } else { + drm_dbg_kms(display->drm, "Requested format %d unsupported.\n", + conn_state->color_format); + return -EINVAL; + } + + if (pipe_config->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420 && + !connector->base.ycbcr_420_allowed) { + drm_dbg_kms(display->drm, + "YCbCr 4:2:0 mode requested but unsupported by connector.\n"); + return -EINVAL; + } + + pipe_config->output_format =3D intel_dp_output_format(connector, pipe_con= fig->sink_format); pipe_config->has_pch_encoder =3D false; =20 + /* Validate that the right format was picked if explicitly requested */ + if (conn_state->color_format !=3D DRM_CONNECTOR_COLOR_FORMAT_AUTO) { + switch (pipe_config->output_format) { + case INTEL_OUTPUT_FORMAT_RGB: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_RGB444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR444: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR420: + actual_format =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420; + break; + } + + if (actual_format !=3D conn_state->color_format) { + drm_dbg_kms(display->drm, "Requested connector color format %d, got %d\= n", + conn_state->color_format, actual_format); + return -EINVAL; + } + } + for_each_joiner_candidate(connector, adjusted_mode, num_joined_pipes) { if (num_joined_pipes > 1) pipe_config->joiner_pipes =3D GENMASK(crtc->pipe + num_joined_pipes - 1, @@ -1692,6 +1738,11 @@ static int mst_topology_add_connector_properties(str= uct intel_dp *intel_dp, if (connector->base.max_bpc_property) drm_connector_attach_max_bpc_property(&connector->base, 6, 12); =20 + connector->base.color_format_property =3D + intel_dp->attached_connector->base.color_format_property; + if (connector->base.color_format_property) + intel_attach_colorformat_property(&connector->base); + return drm_connector_set_path_property(&connector->base, pathprop); } =20 diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i9= 15/display/intel_hdmi.c index 05e898d10a2b..6b685d9a458e 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2270,33 +2270,73 @@ static int intel_hdmi_compute_output_format(struct = intel_encoder *encoder, struct intel_connector *connector =3D to_intel_connector(conn_state->conn= ector); const struct drm_display_mode *adjusted_mode =3D &crtc_state->hw.adjusted= _mode; const struct drm_display_info *info =3D &connector->base.display_info; - bool ycbcr_420_only =3D drm_mode_is_420_only(info, adjusted_mode); + enum drm_connector_color_format req_fmt =3D conn_state->color_format; + enum drm_connector_color_format actual_fmt; int ret; =20 - crtc_state->sink_format =3D - intel_hdmi_sink_format(crtc_state, connector, ycbcr_420_only); - - if (ycbcr_420_only && crtc_state->sink_format !=3D INTEL_OUTPUT_FORMAT_YC= BCR420) { - drm_dbg_kms(display->drm, - "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back= to RGB.\n"); - crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_RGB; - } + if (!req_fmt) + crtc_state->sink_format =3D + intel_hdmi_sink_format(crtc_state, connector, + drm_mode_is_420_only(info, adjusted_mode)); + else if (req_fmt =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR444) + crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR444; + else + crtc_state->sink_format =3D + intel_hdmi_sink_format(crtc_state, connector, + req_fmt =3D=3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420); =20 crtc_state->output_format =3D intel_hdmi_output_format(crtc_state); ret =3D intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_= limits); if (ret) { - if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420 || - !crtc_state->has_hdmi_sink || - !connector->base.ycbcr_420_allowed || - !drm_mode_is_420_also(info, adjusted_mode)) + /* + * If no valid link config can be found due to bandwidth constraints, + * degrade from RGB/YCbCr 4:4:4 to YCbCr 4:2:0 if permitted by + * the source and sink. + */ + if (!connector->base.ycbcr_420_allowed) + return ret; + /* No point in trying YCbCr420 a second time. */ + if (crtc_state->sink_format =3D=3D INTEL_OUTPUT_FORMAT_YCBCR420) + return ret; + if (!drm_mode_is_420(info, adjusted_mode)) + return ret; + /* If a non-AUTO color format is chosen, don't fall back. */ + if (req_fmt) return ret; =20 crtc_state->sink_format =3D INTEL_OUTPUT_FORMAT_YCBCR420; crtc_state->output_format =3D intel_hdmi_output_format(crtc_state); ret =3D intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream= _limits); + if (ret) + return ret; } =20 - return ret; + if (req_fmt =3D=3D DRM_CONNECTOR_COLOR_FORMAT_AUTO) + return 0; + + switch (crtc_state->sink_format) { + case INTEL_OUTPUT_FORMAT_RGB: + actual_fmt =3D DRM_CONNECTOR_COLOR_FORMAT_RGB444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR444: + actual_fmt =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR444; + break; + case INTEL_OUTPUT_FORMAT_YCBCR420: + actual_fmt =3D DRM_CONNECTOR_COLOR_FORMAT_YCBCR420; + break; + default: + drm_dbg_kms(display->drm, "Intel format %d has no connector equivalent\n= ", + crtc_state->sink_format); + return -EINVAL; + } + + if (req_fmt !=3D actual_fmt) { + drm_dbg_kms(display->drm, "Requested connector color format %d, got %d\n= ", + req_fmt, actual_fmt); + return -EINVAL; + } + + return 0; } =20 static bool intel_hdmi_is_cloned(const struct intel_crtc_state *crtc_state) @@ -2689,8 +2729,10 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_h= dmi, struct drm_connector *_ if (DISPLAY_VER(display) >=3D 10) drm_connector_attach_hdr_output_metadata_property(&connector->base); =20 - if (!HAS_GMCH(display)) + if (!HAS_GMCH(display)) { drm_connector_attach_max_bpc_property(&connector->base, 8, 12); + intel_attach_colorformat_property(&connector->base); + } } =20 /* --=20 2.53.0