From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: "Nicolas Frattaroli" <nicolas.frattaroli@collabora.com>,
"Harry Wentland" <harry.wentland@amd.com>,
"Leo Li" <sunpeng.li@amd.com>,
"Rodrigo Siqueira" <siqueira@igalia.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Christian König" <christian.koenig@amd.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Tvrtko Ursulin" <tursulin@ursulin.net>,
"Dmitry Baryshkov" <lumag@kernel.org>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Rob Herring" <robh@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Shuah Khan" <skhan@linuxfoundation.org>,
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,
"Werner Sembach" <wse@tuxedocomputers.com>,
"Andri Yngvason" <andri@yngvason.is>,
"Marius Vlad" <marius.vlad@collabora.com>
Subject: Re: [PATCH v11 03/22] drm: Add new general DRM property "color format"
Date: Thu, 26 Mar 2026 14:13:28 +0200 [thread overview]
Message-ID: <acUi6NEPJ0p48a3U@intel.com> (raw)
In-Reply-To: <CAPY8ntCRPgN_ayHMGXFv9OrJrdyakUcUT0rvgY5J=FvdCFb6eA@mail.gmail.com>
On Thu, Mar 26, 2026 at 11:16:12AM +0000, Dave Stevenson wrote:
> On Wed, 25 Mar 2026 at 13:43, Ville Syrjälä
> <ville.syrjala@linux.intel.com> wrote:
> >
> > On Wed, Mar 25, 2026 at 12:49:19PM +0000, Dave Stevenson wrote:
> > > On Tue, 24 Mar 2026 at 16:02, Nicolas Frattaroli
> > > <nicolas.frattaroli@collabora.com> wrote:
> > > >
> > > > Add a new general DRM property named "color format" which can be used by
> > > > userspace to request the display driver to output a particular color
> > > > format.
> > > >
> > > > Possible options are:
> > > > - auto (setup by default, driver internally picks the color format)
> > > > - rgb
> > > > - ycbcr444
> > > > - ycbcr422
> > > > - ycbcr420
> > > >
> > > > Drivers should advertise from this list which formats they support.
> > > > Together with this list and EDID data from the sink we should be able
> > > > to relay a list of usable color formats to users to pick from.
> > > >
> > > > Co-developed-by: Werner Sembach <wse@tuxedocomputers.com>
> > > > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> > > > Co-developed-by: Andri Yngvason <andri@yngvason.is>
> > > > Signed-off-by: Andri Yngvason <andri@yngvason.is>
> > > > Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> > > > Reviewed-by: Maxime Ripard <mripard@kernel.org>
> > > > Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
> > > > ---
> > > > drivers/gpu/drm/drm_atomic_helper.c | 5 ++
> > > > drivers/gpu/drm/drm_atomic_uapi.c | 11 ++++
> > > > drivers/gpu/drm/drm_connector.c | 108 ++++++++++++++++++++++++++++++++++++
> > > > include/drm/drm_connector.h | 104 ++++++++++++++++++++++++++++++++++
> > > > 4 files changed, 228 insertions(+)
> > > >
> > > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> > > > index 26953ed6b53e..b7753454b777 100644
> > > > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > > > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > > > @@ -737,6 +737,11 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
> > > > if (old_connector_state->max_requested_bpc !=
> > > > new_connector_state->max_requested_bpc)
> > > > new_crtc_state->connectors_changed = true;
> > > > +
> > > > + if (old_connector_state->color_format !=
> > > > + new_connector_state->color_format)
> > > > + new_crtc_state->connectors_changed = true;
> > > > +
> > > > }
> > > >
> > > > if (funcs->atomic_check)
> > > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> > > > index 5bd5bf6661df..dee510c85e59 100644
> > > > --- a/drivers/gpu/drm/drm_atomic_uapi.c
> > > > +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> > > > @@ -935,6 +935,15 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
> > > > state->privacy_screen_sw_state = val;
> > > > } else if (property == connector->broadcast_rgb_property) {
> > > > state->hdmi.broadcast_rgb = val;
> > > > + } else if (property == connector->color_format_property) {
> > > > + if (val > INT_MAX || !drm_connector_color_format_valid(val)) {
> > > > + drm_dbg_atomic(connector->dev,
> > > > + "[CONNECTOR:%d:%s] unknown color format %llu\n",
> > > > + connector->base.id, connector->name, val);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + state->color_format = val;
> > > > } else if (connector->funcs->atomic_set_property) {
> > > > return connector->funcs->atomic_set_property(connector,
> > > > state, property, val);
> > > > @@ -1020,6 +1029,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
> > > > *val = state->privacy_screen_sw_state;
> > > > } else if (property == connector->broadcast_rgb_property) {
> > > > *val = state->hdmi.broadcast_rgb;
> > > > + } else if (property == connector->color_format_property) {
> > > > + *val = state->color_format;
> > > > } else if (connector->funcs->atomic_get_property) {
> > > > return connector->funcs->atomic_get_property(connector,
> > > > state, property, val);
> > > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> > > > index 47dc53c4a738..e848374dee0b 100644
> > > > --- a/drivers/gpu/drm/drm_connector.c
> > > > +++ b/drivers/gpu/drm/drm_connector.c
> > > > @@ -1388,6 +1388,18 @@ static const u32 hdmi_colorspaces =
> > > > BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65) |
> > > > BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER);
> > > >
> > > > +static const u32 hdmi_colorformats =
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);
> > > > +
> > > > +static const u32 dp_colorformats =
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);
> > > > +
> > > > /*
> > > > * As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry
> > > > * Format Table 2-120
> > > > @@ -2940,6 +2952,102 @@ int drm_connector_attach_colorspace_property(struct drm_connector *connector)
> > > > }
> > > > EXPORT_SYMBOL(drm_connector_attach_colorspace_property);
> > > >
> > > > +/**
> > > > + * drm_connector_attach_color_format_property - create and attach color format property
> > > > + * @connector: connector to create the color format property on
> > > > + * @supported_color_formats: bitmask of bit-shifted &enum drm_output_color_format
> > > > + * values the connector supports
> > > > + *
> > > > + * Called by a driver to create a color format property. The property is
> > > > + * attached to the connector automatically on success.
> > > > + *
> > > > + * @supported_color_formats should only include color formats the connector
> > > > + * type can actually support.
> > > > + *
> > > > + * Returns:
> > > > + * 0 on success, negative errno on error
> > > > + */
> > > > +int drm_connector_attach_color_format_property(struct drm_connector *connector,
> > > > + unsigned long supported_color_formats)
> > > > +{
> > > > + struct drm_device *dev = connector->dev;
> > > > + struct drm_prop_enum_list enum_list[DRM_CONNECTOR_COLOR_FORMAT_COUNT];
> > > > + unsigned int i = 0;
> > > > + unsigned long fmt;
> > > > +
> > > > + if (connector->color_format_property)
> > > > + return 0;
> > > > +
> > > > + if (!supported_color_formats) {
> > > > + drm_err(dev, "No supported color formats provided on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + if (supported_color_formats & ~GENMASK(DRM_OUTPUT_COLOR_FORMAT_COUNT - 1, 0)) {
> > > > + drm_err(dev, "Unknown color formats provided on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + switch (connector->connector_type) {
> > > > + case DRM_MODE_CONNECTOR_HDMIA:
> > > > + case DRM_MODE_CONNECTOR_HDMIB:
> > > > + if (supported_color_formats & ~hdmi_colorformats) {
> > > > + drm_err(dev, "Color formats not allowed for HDMI on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > + break;
> > > > + case DRM_MODE_CONNECTOR_DisplayPort:
> > > > + case DRM_MODE_CONNECTOR_eDP:
> > > > + if (supported_color_formats & ~dp_colorformats) {
> > > > + drm_err(dev, "Color formats not allowed for DP on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > + break;
> > > > + }
> > > > +
> > > > + enum_list[0].name = "AUTO";
> > > > + enum_list[0].type = DRM_CONNECTOR_COLOR_FORMAT_AUTO;
> > > > +
> > > > + for_each_set_bit(fmt, &supported_color_formats, DRM_OUTPUT_COLOR_FORMAT_COUNT) {
> > > > + switch (fmt) {
> > > > + case DRM_OUTPUT_COLOR_FORMAT_RGB444:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_RGB444;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR444:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR444;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR422:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR422;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR420:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR420;
> > > > + break;
> > > > + default:
> > > > + drm_warn(dev, "Unknown supported format %ld on [CONNECTOR:%d:%s]\n",
> > > > + fmt, connector->base.id, connector->name);
> > > > + continue;
> > > > + }
> > > > + enum_list[i].name = drm_hdmi_connector_get_output_format_name(fmt);
> > > > + }
> > > > +
> > > > + connector->color_format_property =
> > > > + drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "color format",
> > > > + enum_list, i + 1);
> > > > +
> > > > + if (!connector->color_format_property)
> > > > + return -ENOMEM;
> > > > +
> > > > + drm_object_attach_property(&connector->base, connector->color_format_property,
> > > > + DRM_CONNECTOR_COLOR_FORMAT_AUTO);
> > > > +
> > > > + return 0;
> > > > +}
> > > > +EXPORT_SYMBOL(drm_connector_attach_color_format_property);
> > > > +
> > > > /**
> > > > * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
> > > > * @old_state: old connector state to compare
> > > > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> > > > index af8b92d2d5b7..bd549f912b76 100644
> > > > --- a/include/drm/drm_connector.h
> > > > +++ b/include/drm/drm_connector.h
> > > > @@ -571,14 +571,102 @@ enum drm_colorspace {
> > > > * YCbCr 4:2:2 output format (ie. with horizontal subsampling)
> > > > * @DRM_OUTPUT_COLOR_FORMAT_YCBCR420:
> > > > * YCbCr 4:2:0 output format (ie. with horizontal and vertical subsampling)
> > > > + * @DRM_OUTPUT_COLOR_FORMAT_COUNT:
> > > > + * Number of valid output color format values in this enum
> > > > */
> > > > enum drm_output_color_format {
> > > > DRM_OUTPUT_COLOR_FORMAT_RGB444 = 0,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR444,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR422,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR420,
> > > > + DRM_OUTPUT_COLOR_FORMAT_COUNT,
> > > > };
> > > >
> > > > +/**
> > > > + * enum drm_connector_color_format - Connector Color Format Request
> > > > + *
> > > > + * This enum, unlike &enum drm_output_color_format, is used to specify requests
> > > > + * for a specific color format on a connector through the DRM "color format"
> > > > + * property. The difference is that it has an "AUTO" value to specify that
> > > > + * no specific choice has been made.
> > > > + */
> > > > +enum drm_connector_color_format {
> > > > + /**
> > > > + * @DRM_CONNECTOR_COLOR_FORMAT_AUTO: The driver or display protocol
> > > > + * helpers should pick a suitable color format. All implementations of a
> > > > + * specific display protocol must behave the same way with "AUTO", but
> > > > + * different display protocols do not necessarily have the same "AUTO"
> > > > + * semantics.
> > > > + *
> > > > + * For HDMI, "AUTO" picks RGB, but falls back to YCbCr 4:2:0 if the
> > > > + * bandwidth required for full-scale RGB is not available, or the mode
> > > > + * is YCbCr 4:2:0-only, as long as the mode and output both support
> > > > + * YCbCr 4:2:0.
> > >
> > > Is there a reason you propose dropping back to YCbCr 4:2:0 without
> > > trying YCbCr 4:2:2 first? Minimising the subsampling is surely
> > > beneficial, and vc4 for one can do 4:2:2 but not 4:2:0.
> >
> > On HDMI 4:2:2 is always 12bpc, so it doesn't save any bandwidth
> > compared to 8bpc 4:4:4.
>
> It does save bandwidth against 10 or 12bpc RGB 4:4:4.
>
> Or is the implication that max_bpc = 12 and
> DRM_CONNECTOR_COLOR_FORMAT_AUTO should drop bpc down to 8 and select
> RGB in preference to selecting 4:2:2?
Yeah, YCbCr has all kinds of extra complications compared to RGB, so
the policy is to use RGB if possible, and only fall back to YCbCr as a
last resort. And in that case 4:2:0 is the only thing that can help.
--
Ville Syrjälä
Intel
WARNING: multiple messages have this Message-ID (diff)
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: "Nicolas Frattaroli" <nicolas.frattaroli@collabora.com>,
"Harry Wentland" <harry.wentland@amd.com>,
"Leo Li" <sunpeng.li@amd.com>,
"Rodrigo Siqueira" <siqueira@igalia.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Christian König" <christian.koenig@amd.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Tvrtko Ursulin" <tursulin@ursulin.net>,
"Dmitry Baryshkov" <lumag@kernel.org>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Rob Herring" <robh@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Shuah Khan" <skhan@linuxfoundation.org>,
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,
"Werner Sembach" <wse@tuxedocomputers.com>,
"Andri Yngvason" <andri@yngvason.is>,
"Marius Vlad" <marius.vlad@collabora.com>
Subject: Re: [PATCH v11 03/22] drm: Add new general DRM property "color format"
Date: Thu, 26 Mar 2026 14:13:28 +0200 [thread overview]
Message-ID: <acUi6NEPJ0p48a3U@intel.com> (raw)
In-Reply-To: <CAPY8ntCRPgN_ayHMGXFv9OrJrdyakUcUT0rvgY5J=FvdCFb6eA@mail.gmail.com>
On Thu, Mar 26, 2026 at 11:16:12AM +0000, Dave Stevenson wrote:
> On Wed, 25 Mar 2026 at 13:43, Ville Syrjälä
> <ville.syrjala@linux.intel.com> wrote:
> >
> > On Wed, Mar 25, 2026 at 12:49:19PM +0000, Dave Stevenson wrote:
> > > On Tue, 24 Mar 2026 at 16:02, Nicolas Frattaroli
> > > <nicolas.frattaroli@collabora.com> wrote:
> > > >
> > > > Add a new general DRM property named "color format" which can be used by
> > > > userspace to request the display driver to output a particular color
> > > > format.
> > > >
> > > > Possible options are:
> > > > - auto (setup by default, driver internally picks the color format)
> > > > - rgb
> > > > - ycbcr444
> > > > - ycbcr422
> > > > - ycbcr420
> > > >
> > > > Drivers should advertise from this list which formats they support.
> > > > Together with this list and EDID data from the sink we should be able
> > > > to relay a list of usable color formats to users to pick from.
> > > >
> > > > Co-developed-by: Werner Sembach <wse@tuxedocomputers.com>
> > > > Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> > > > Co-developed-by: Andri Yngvason <andri@yngvason.is>
> > > > Signed-off-by: Andri Yngvason <andri@yngvason.is>
> > > > Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> > > > Reviewed-by: Maxime Ripard <mripard@kernel.org>
> > > > Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
> > > > ---
> > > > drivers/gpu/drm/drm_atomic_helper.c | 5 ++
> > > > drivers/gpu/drm/drm_atomic_uapi.c | 11 ++++
> > > > drivers/gpu/drm/drm_connector.c | 108 ++++++++++++++++++++++++++++++++++++
> > > > include/drm/drm_connector.h | 104 ++++++++++++++++++++++++++++++++++
> > > > 4 files changed, 228 insertions(+)
> > > >
> > > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> > > > index 26953ed6b53e..b7753454b777 100644
> > > > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > > > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > > > @@ -737,6 +737,11 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
> > > > if (old_connector_state->max_requested_bpc !=
> > > > new_connector_state->max_requested_bpc)
> > > > new_crtc_state->connectors_changed = true;
> > > > +
> > > > + if (old_connector_state->color_format !=
> > > > + new_connector_state->color_format)
> > > > + new_crtc_state->connectors_changed = true;
> > > > +
> > > > }
> > > >
> > > > if (funcs->atomic_check)
> > > > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> > > > index 5bd5bf6661df..dee510c85e59 100644
> > > > --- a/drivers/gpu/drm/drm_atomic_uapi.c
> > > > +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> > > > @@ -935,6 +935,15 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
> > > > state->privacy_screen_sw_state = val;
> > > > } else if (property == connector->broadcast_rgb_property) {
> > > > state->hdmi.broadcast_rgb = val;
> > > > + } else if (property == connector->color_format_property) {
> > > > + if (val > INT_MAX || !drm_connector_color_format_valid(val)) {
> > > > + drm_dbg_atomic(connector->dev,
> > > > + "[CONNECTOR:%d:%s] unknown color format %llu\n",
> > > > + connector->base.id, connector->name, val);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + state->color_format = val;
> > > > } else if (connector->funcs->atomic_set_property) {
> > > > return connector->funcs->atomic_set_property(connector,
> > > > state, property, val);
> > > > @@ -1020,6 +1029,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
> > > > *val = state->privacy_screen_sw_state;
> > > > } else if (property == connector->broadcast_rgb_property) {
> > > > *val = state->hdmi.broadcast_rgb;
> > > > + } else if (property == connector->color_format_property) {
> > > > + *val = state->color_format;
> > > > } else if (connector->funcs->atomic_get_property) {
> > > > return connector->funcs->atomic_get_property(connector,
> > > > state, property, val);
> > > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> > > > index 47dc53c4a738..e848374dee0b 100644
> > > > --- a/drivers/gpu/drm/drm_connector.c
> > > > +++ b/drivers/gpu/drm/drm_connector.c
> > > > @@ -1388,6 +1388,18 @@ static const u32 hdmi_colorspaces =
> > > > BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65) |
> > > > BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER);
> > > >
> > > > +static const u32 hdmi_colorformats =
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);
> > > > +
> > > > +static const u32 dp_colorformats =
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422) |
> > > > + BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);
> > > > +
> > > > /*
> > > > * As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry
> > > > * Format Table 2-120
> > > > @@ -2940,6 +2952,102 @@ int drm_connector_attach_colorspace_property(struct drm_connector *connector)
> > > > }
> > > > EXPORT_SYMBOL(drm_connector_attach_colorspace_property);
> > > >
> > > > +/**
> > > > + * drm_connector_attach_color_format_property - create and attach color format property
> > > > + * @connector: connector to create the color format property on
> > > > + * @supported_color_formats: bitmask of bit-shifted &enum drm_output_color_format
> > > > + * values the connector supports
> > > > + *
> > > > + * Called by a driver to create a color format property. The property is
> > > > + * attached to the connector automatically on success.
> > > > + *
> > > > + * @supported_color_formats should only include color formats the connector
> > > > + * type can actually support.
> > > > + *
> > > > + * Returns:
> > > > + * 0 on success, negative errno on error
> > > > + */
> > > > +int drm_connector_attach_color_format_property(struct drm_connector *connector,
> > > > + unsigned long supported_color_formats)
> > > > +{
> > > > + struct drm_device *dev = connector->dev;
> > > > + struct drm_prop_enum_list enum_list[DRM_CONNECTOR_COLOR_FORMAT_COUNT];
> > > > + unsigned int i = 0;
> > > > + unsigned long fmt;
> > > > +
> > > > + if (connector->color_format_property)
> > > > + return 0;
> > > > +
> > > > + if (!supported_color_formats) {
> > > > + drm_err(dev, "No supported color formats provided on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + if (supported_color_formats & ~GENMASK(DRM_OUTPUT_COLOR_FORMAT_COUNT - 1, 0)) {
> > > > + drm_err(dev, "Unknown color formats provided on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > +
> > > > + switch (connector->connector_type) {
> > > > + case DRM_MODE_CONNECTOR_HDMIA:
> > > > + case DRM_MODE_CONNECTOR_HDMIB:
> > > > + if (supported_color_formats & ~hdmi_colorformats) {
> > > > + drm_err(dev, "Color formats not allowed for HDMI on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > + break;
> > > > + case DRM_MODE_CONNECTOR_DisplayPort:
> > > > + case DRM_MODE_CONNECTOR_eDP:
> > > > + if (supported_color_formats & ~dp_colorformats) {
> > > > + drm_err(dev, "Color formats not allowed for DP on [CONNECTOR:%d:%s]\n",
> > > > + connector->base.id, connector->name);
> > > > + return -EINVAL;
> > > > + }
> > > > + break;
> > > > + }
> > > > +
> > > > + enum_list[0].name = "AUTO";
> > > > + enum_list[0].type = DRM_CONNECTOR_COLOR_FORMAT_AUTO;
> > > > +
> > > > + for_each_set_bit(fmt, &supported_color_formats, DRM_OUTPUT_COLOR_FORMAT_COUNT) {
> > > > + switch (fmt) {
> > > > + case DRM_OUTPUT_COLOR_FORMAT_RGB444:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_RGB444;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR444:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR444;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR422:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR422;
> > > > + break;
> > > > + case DRM_OUTPUT_COLOR_FORMAT_YCBCR420:
> > > > + enum_list[++i].type = DRM_CONNECTOR_COLOR_FORMAT_YCBCR420;
> > > > + break;
> > > > + default:
> > > > + drm_warn(dev, "Unknown supported format %ld on [CONNECTOR:%d:%s]\n",
> > > > + fmt, connector->base.id, connector->name);
> > > > + continue;
> > > > + }
> > > > + enum_list[i].name = drm_hdmi_connector_get_output_format_name(fmt);
> > > > + }
> > > > +
> > > > + connector->color_format_property =
> > > > + drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "color format",
> > > > + enum_list, i + 1);
> > > > +
> > > > + if (!connector->color_format_property)
> > > > + return -ENOMEM;
> > > > +
> > > > + drm_object_attach_property(&connector->base, connector->color_format_property,
> > > > + DRM_CONNECTOR_COLOR_FORMAT_AUTO);
> > > > +
> > > > + return 0;
> > > > +}
> > > > +EXPORT_SYMBOL(drm_connector_attach_color_format_property);
> > > > +
> > > > /**
> > > > * drm_connector_atomic_hdr_metadata_equal - checks if the hdr metadata changed
> > > > * @old_state: old connector state to compare
> > > > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> > > > index af8b92d2d5b7..bd549f912b76 100644
> > > > --- a/include/drm/drm_connector.h
> > > > +++ b/include/drm/drm_connector.h
> > > > @@ -571,14 +571,102 @@ enum drm_colorspace {
> > > > * YCbCr 4:2:2 output format (ie. with horizontal subsampling)
> > > > * @DRM_OUTPUT_COLOR_FORMAT_YCBCR420:
> > > > * YCbCr 4:2:0 output format (ie. with horizontal and vertical subsampling)
> > > > + * @DRM_OUTPUT_COLOR_FORMAT_COUNT:
> > > > + * Number of valid output color format values in this enum
> > > > */
> > > > enum drm_output_color_format {
> > > > DRM_OUTPUT_COLOR_FORMAT_RGB444 = 0,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR444,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR422,
> > > > DRM_OUTPUT_COLOR_FORMAT_YCBCR420,
> > > > + DRM_OUTPUT_COLOR_FORMAT_COUNT,
> > > > };
> > > >
> > > > +/**
> > > > + * enum drm_connector_color_format - Connector Color Format Request
> > > > + *
> > > > + * This enum, unlike &enum drm_output_color_format, is used to specify requests
> > > > + * for a specific color format on a connector through the DRM "color format"
> > > > + * property. The difference is that it has an "AUTO" value to specify that
> > > > + * no specific choice has been made.
> > > > + */
> > > > +enum drm_connector_color_format {
> > > > + /**
> > > > + * @DRM_CONNECTOR_COLOR_FORMAT_AUTO: The driver or display protocol
> > > > + * helpers should pick a suitable color format. All implementations of a
> > > > + * specific display protocol must behave the same way with "AUTO", but
> > > > + * different display protocols do not necessarily have the same "AUTO"
> > > > + * semantics.
> > > > + *
> > > > + * For HDMI, "AUTO" picks RGB, but falls back to YCbCr 4:2:0 if the
> > > > + * bandwidth required for full-scale RGB is not available, or the mode
> > > > + * is YCbCr 4:2:0-only, as long as the mode and output both support
> > > > + * YCbCr 4:2:0.
> > >
> > > Is there a reason you propose dropping back to YCbCr 4:2:0 without
> > > trying YCbCr 4:2:2 first? Minimising the subsampling is surely
> > > beneficial, and vc4 for one can do 4:2:2 but not 4:2:0.
> >
> > On HDMI 4:2:2 is always 12bpc, so it doesn't save any bandwidth
> > compared to 8bpc 4:4:4.
>
> It does save bandwidth against 10 or 12bpc RGB 4:4:4.
>
> Or is the implication that max_bpc = 12 and
> DRM_CONNECTOR_COLOR_FORMAT_AUTO should drop bpc down to 8 and select
> RGB in preference to selecting 4:2:2?
Yeah, YCbCr has all kinds of extra complications compared to RGB, so
the policy is to use RGB if possible, and only fall back to YCbCr as a
last resort. And in that case 4:2:0 is the only thing that can help.
--
Ville Syrjälä
Intel
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2026-03-26 12:13 UTC|newest]
Thread overview: 119+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-24 16:01 [PATCH v11 00/22] Add new general DRM property "color format" Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 01/22] drm/amd/display: Remove unnecessary SIGNAL_TYPE_HDMI_TYPE_A check Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 02/22] drm/display: hdmi-state-helper: Use default case for unsupported formats Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 03/22] drm: Add new general DRM property "color format" Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 17:00 ` Ville Syrjälä
2026-03-24 17:00 ` Ville Syrjälä
2026-03-24 19:10 ` Nicolas Frattaroli
2026-03-24 19:10 ` Nicolas Frattaroli
2026-03-24 19:53 ` Ville Syrjälä
2026-03-24 19:53 ` Ville Syrjälä
2026-03-25 8:24 ` Maxime Ripard
2026-03-25 8:24 ` Maxime Ripard
2026-03-25 11:03 ` Ville Syrjälä
2026-03-25 11:03 ` Ville Syrjälä
2026-03-25 11:17 ` Ville Syrjälä
2026-03-25 11:17 ` Ville Syrjälä
2026-03-25 14:56 ` Maxime Ripard
2026-03-25 14:56 ` Maxime Ripard
2026-03-25 18:43 ` Ville Syrjälä
2026-03-25 18:43 ` Ville Syrjälä
2026-03-26 17:02 ` Maxime Ripard
2026-03-26 17:02 ` Maxime Ripard
2026-03-26 17:58 ` Ville Syrjälä
2026-03-26 17:58 ` Ville Syrjälä
2026-03-27 12:56 ` Nicolas Frattaroli
2026-03-27 12:56 ` Nicolas Frattaroli
2026-03-28 0:49 ` Ville Syrjälä
2026-03-28 0:49 ` Ville Syrjälä
2026-03-28 19:39 ` Nicolas Frattaroli
2026-03-28 19:39 ` Nicolas Frattaroli
2026-03-30 23:56 ` Ville Syrjälä
2026-03-30 23:56 ` Ville Syrjälä
2026-03-31 10:33 ` Nicolas Frattaroli
2026-03-31 10:33 ` Nicolas Frattaroli
2026-03-31 11:44 ` Ville Syrjälä
2026-03-31 11:44 ` Ville Syrjälä
2026-03-28 0:22 ` Ville Syrjälä
2026-03-28 0:22 ` Ville Syrjälä
2026-03-31 13:52 ` Pekka Paalanen
2026-03-31 13:52 ` Pekka Paalanen
2026-03-26 12:44 ` Nicolas Frattaroli
2026-03-26 12:44 ` Nicolas Frattaroli
2026-03-26 13:07 ` Ville Syrjälä
2026-03-26 13:07 ` Ville Syrjälä
2026-03-26 13:26 ` Nicolas Frattaroli
2026-03-26 13:26 ` Nicolas Frattaroli
2026-03-26 16:40 ` Daniel Stone
2026-03-26 16:40 ` Daniel Stone
2026-03-25 13:05 ` Nicolas Frattaroli
2026-03-25 13:05 ` Nicolas Frattaroli
2026-03-25 12:49 ` Dave Stevenson
2026-03-25 12:49 ` Dave Stevenson
2026-03-25 13:05 ` Maxime Ripard
2026-03-25 13:05 ` Maxime Ripard
2026-03-25 13:21 ` Nicolas Frattaroli
2026-03-25 13:21 ` Nicolas Frattaroli
2026-03-25 13:44 ` Maxime Ripard
2026-03-25 13:44 ` Maxime Ripard
2026-03-25 13:11 ` Nicolas Frattaroli
2026-03-25 13:11 ` Nicolas Frattaroli
2026-03-25 13:43 ` Ville Syrjälä
2026-03-25 13:43 ` Ville Syrjälä
2026-03-26 11:16 ` Dave Stevenson
2026-03-26 11:16 ` Dave Stevenson
2026-03-26 12:02 ` Nicolas Frattaroli
2026-03-26 12:02 ` Nicolas Frattaroli
2026-04-01 8:27 ` Michel Dänzer
2026-04-01 8:27 ` Michel Dänzer
2026-03-26 12:13 ` Ville Syrjälä [this message]
2026-03-26 12:13 ` Ville Syrjälä
2026-03-26 13:39 ` Dave Stevenson
2026-03-26 13:39 ` Dave Stevenson
2026-03-24 16:01 ` [PATCH v11 04/22] drm/bridge: Act on the DRM color format property Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 05/22] drm/atomic-helper: Add HDMI bridge output bus formats helper Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 06/22] drm/display: hdmi-state-helper: Act on color format DRM property Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 07/22] drm/display: hdmi-state-helper: Try subsampling in mode_valid Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 08/22] drm/i915: Implement the "color format" DRM property Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 09/22] drm/amdgpu: Implement " Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 10/22] drm/rockchip: Add YUV422 output mode constants for VOP2 Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 11/22] drm/rockchip: vop2: Add RK3576 to the RG swap special case Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 12/22] drm/rockchip: vop2: Recognise 10-bit YUV422 as YUV format Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 13/22] drm/rockchip: vop2: Set correct output format for RK3576 YUV422 Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 14/22] drm/bridge: dw-hdmi-qp: Use common HDMI output bus fmts helper Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 15/22] drm/rockchip: dw_hdmi_qp: Implement "color format" DRM property Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 16/22] drm/rockchip: dw_hdmi_qp: Set supported_formats platdata Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 17/22] drm/connector: Register color format property on HDMI connectors Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 18/22] drm/tests: hdmi: Add tests for the color_format property Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 19/22] drm/tests: hdmi: Add tests for HDMI helper's mode_valid Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 20/22] drm/tests: bridge: Add KUnit tests for bridge chain format selection Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 21/22] drm/tests: bridge: Add test for HDMI output bus formats helper Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:01 ` [PATCH v11 22/22] drm/bridge: Document bridge chain format selection Nicolas Frattaroli
2026-03-24 16:01 ` Nicolas Frattaroli
2026-03-24 16:47 ` ✗ CI.checkpatch: warning for Add new general DRM property "color format" (rev8) Patchwork
2026-03-24 16:49 ` ✓ CI.KUnit: success " Patchwork
2026-03-24 17:49 ` ✓ Xe.CI.BAT: " Patchwork
2026-03-24 18:21 ` ✗ i915.CI.BAT: failure " Patchwork
2026-03-25 6:22 ` ✗ 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=acUi6NEPJ0p48a3U@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=andri@yngvason.is \
--cc=andrzej.hajda@intel.com \
--cc=andy.yan@rock-chips.com \
--cc=christian.koenig@amd.com \
--cc=corbet@lwn.net \
--cc=dave.stevenson@raspberrypi.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=joonas.lahtinen@linux.intel.com \
--cc=kernel@collabora.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=lumag@kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=marius.vlad@collabora.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=nicolas.frattaroli@collabora.com \
--cc=rfoss@kernel.org \
--cc=robh@kernel.org \
--cc=rodrigo.vivi@intel.com \
--cc=s.hauer@pengutronix.de \
--cc=simona@ffwll.ch \
--cc=siqueira@igalia.com \
--cc=skhan@linuxfoundation.org \
--cc=sunpeng.li@amd.com \
--cc=tursulin@ursulin.net \
--cc=tzimmermann@suse.de \
--cc=wse@tuxedocomputers.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 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.