[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20251117-color-format-v4-10-0ded72bd1b00@collabora.com>
Date: Mon, 17 Nov 2025 20:11:54 +0100
From: Nicolas Frattaroli <nicolas.frattaroli@...labora.com>
To: Harry Wentland <harry.wentland@....com>, Leo Li <sunpeng.li@....com>,
Rodrigo Siqueira <siqueira@...lia.com>,
Alex Deucher <alexander.deucher@....com>,
Christian König <christian.koenig@....com>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>, Thomas Zimmermann <tzimmermann@...e.de>,
Andrzej Hajda <andrzej.hajda@...el.com>,
Neil Armstrong <neil.armstrong@...aro.org>, Robert Foss <rfoss@...nel.org>,
Laurent Pinchart <Laurent.pinchart@...asonboard.com>,
Jonas Karlman <jonas@...boo.se>, Jernej Skrabec <jernej.skrabec@...il.com>,
Sandy Huang <hjc@...k-chips.com>,
Heiko Stübner <heiko@...ech.de>,
Andy Yan <andy.yan@...k-chips.com>,
Jani Nikula <jani.nikula@...ux.intel.com>,
Rodrigo Vivi <rodrigo.vivi@...el.com>,
Joonas Lahtinen <joonas.lahtinen@...ux.intel.com>,
Tvrtko Ursulin <tursulin@...ulin.net>
Cc: kernel@...labora.com, amd-gfx@...ts.freedesktop.org,
dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, linux-rockchip@...ts.infradead.org,
intel-gfx@...ts.freedesktop.org, intel-xe@...ts.freedesktop.org,
Nicolas Frattaroli <nicolas.frattaroli@...labora.com>,
Derek Foreman <derek.foreman@...labora.com>,
Marius Vlad <marius.vlad@...labora.com>
Subject: [PATCH v4 10/10] drm/rockchip: Implement "color format" DRM
property
From: Derek Foreman <derek.foreman@...labora.com>
Register the color format property in the dw_hdmi_qp-rockchip driver,
and act on requested format changes as part of the connector state in
the vop2 video output driver.
Signed-off-by: Derek Foreman <derek.foreman@...labora.com>
Signed-off-by: Marius Vlad <marius.vlad@...labora.com>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@...labora.com>
---
drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 3 ++
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 46 ++++++++++++++++++++++++++
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 2 ++
3 files changed, 51 insertions(+)
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
index 7c294751de19..7028166fdace 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
@@ -635,6 +635,9 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master,
return dev_err_probe(hdmi->dev, PTR_ERR(connector),
"Failed to init bridge connector\n");
+ if (!drm_mode_create_hdmi_color_format_property(connector, supported_colorformats))
+ drm_connector_attach_color_format_property(connector);
+
return drm_connector_attach_encoder(connector, encoder);
}
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 498df0ce4680..2fc9b21c5522 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1549,6 +1549,50 @@ static void vop2_dither_setup(struct drm_crtc *crtc, u32 *dsp_ctrl)
DITHER_DOWN_ALLEGRO);
}
+static void vop2_bcsh_config(struct drm_crtc *crtc, struct vop2_video_port *vp)
+{
+ struct drm_connector_list_iter conn_iter;
+ struct drm_connector *connector;
+ u32 format = 0;
+ enum drm_colorspace colorspace = 0;
+ u32 val = 0;
+
+ drm_connector_list_iter_begin(crtc->dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ if (!(crtc->state->connector_mask & drm_connector_mask(connector)))
+ continue;
+
+ format = connector->state->color_format;
+ colorspace = connector->state->colorspace;
+ break;
+ }
+ drm_connector_list_iter_end(&conn_iter);
+
+ if (format == DRM_COLOR_FORMAT_YCBCR420 ||
+ format == DRM_COLOR_FORMAT_YCBCR444 ||
+ format == DRM_COLOR_FORMAT_YCBCR422) {
+ val = RK3568_VP_BCSH_CTRL__BCSH_R2Y_EN | BIT(7);
+
+ switch (colorspace) {
+ case DRM_MODE_COLORIMETRY_BT2020_RGB:
+ case DRM_MODE_COLORIMETRY_BT2020_YCC:
+ val |= BIT(7) | BIT(6);
+ break;
+ case DRM_MODE_COLORIMETRY_BT709_YCC:
+ val |= BIT(6);
+ break;
+ default:
+ break;
+ }
+ if (colorspace == DRM_MODE_COLORIMETRY_BT2020_RGB ||
+ colorspace == DRM_MODE_COLORIMETRY_BT2020_YCC)
+ val |= BIT(6);
+ }
+
+ vop2_vp_write(vp, RK3568_VP_BCSH_CTRL, val);
+ vop2_vp_write(vp, RK3568_VP_BCSH_COLOR_BAR, 0);
+}
+
static void vop2_post_config(struct drm_crtc *crtc)
{
struct vop2_video_port *vp = to_vop2_video_port(crtc);
@@ -1600,6 +1644,8 @@ static void vop2_post_config(struct drm_crtc *crtc)
}
vop2_vp_write(vp, RK3568_VP_DSP_BG, 0);
+
+ vop2_bcsh_config(crtc, vp);
}
static int us_to_vertical_line(struct drm_display_mode *mode, int us)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
index 9124191899ba..33fdc9d8d819 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
@@ -637,6 +637,8 @@ enum dst_factor_mode {
#define RK3568_REG_CFG_DONE__GLB_CFG_DONE_EN BIT(15)
+#define RK3568_VP_BCSH_CTRL__BCSH_R2Y_EN BIT(4)
+
#define RK3568_VP_DSP_CTRL__STANDBY BIT(31)
#define RK3568_VP_DSP_CTRL__DSP_LUT_EN BIT(28)
#define RK3568_VP_DSP_CTRL__DITHER_DOWN_MODE BIT(20)
--
2.51.2
Powered by blists - more mailing lists