From 3558926745c8189ca93821349bd73b0d0cdd13ca Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Thu, 12 Dec 2024 11:46:18 +0800 Subject: [PATCH] drm/rockchip: logo: call drm_atomic_bridge_chain_check() bridge in mode fixup For some connector drivers, such as dw-dp, &drm_bridge_funcs.atomic_check() helps to select output_mode, color_range and so on, which will be determined in the following &drm_encoder_helper_funcs.atomic_check(). In order to get the exact display mode for the mode comparison between U-boot and Kernel, add the full bridge atomic check process in rockchip_drm_mode_fixup(). Without this patch, the mode comparison will fail if the DP logo display is enabled in YUV420 mode for RK3576, because the display mode of uboot has been fixed while the display mode of kernel has not, due to the incorrect conn_state->output_mode. The related workaround is: /* * For RK3576 YUV420 output, hden signal introduce one cycle delay, * so we need to adjust hfp and hbp to compatible with this design. */ if (vop2->version == VOP_VERSION_RK3576 && conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420) { mode->crtc_hsync_start += 2; mode->crtc_hsync_end += 2; } Fixes: c4642391b1fe ("drm/rockchip: vop2: adjust hfp and hbp for YUV420 output") Change-Id: I3193bfa2bca7c14f5c7308f94e7d23160618be0c Signed-off-by: Damon Ding --- drivers/gpu/drm/rockchip/rockchip_drm_logo.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c index b33fff364592..c113430ea3a2 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c @@ -730,12 +730,23 @@ static void rockchip_drm_mode_fixup(struct drm_crtc_state *crtc_state, const struct drm_crtc_helper_funcs *crtc_funcs; struct drm_encoder *encoder = conn_state->best_encoder; struct drm_crtc *crtc = crtc_state->crtc; + struct drm_bridge *bridge; + struct drm_bridge_state *bridge_state; int ret; ret = drm_atomic_set_mode_for_crtc(crtc_state, adj_mode); if (ret) return; + bridge = drm_bridge_chain_get_first_bridge(encoder); + if (bridge) { + bridge_state = drm_atomic_get_bridge_state(crtc_state->state, bridge); + if (IS_ERR(bridge_state)) + return; + + drm_atomic_bridge_chain_check(bridge, crtc_state, conn_state); + } + encoder_funcs = encoder->helper_private; if (encoder_funcs && encoder_funcs->atomic_check) encoder_funcs->atomic_check(encoder, crtc_state, conn_state);