From de85a5fecf84ccd4a2463f16cb9118ca30ecb38b Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Mon, 24 Feb 2025 20:16:31 +0800 Subject: [PATCH] drm/rockchip: logo: check whether the bridge supports atomic mode before mode fixup According to the include/drm/drm_bridge.h, the following functions are mandatory in atomic mode: &drm_bridge_funcs.atomic_reset() &drm_bridge_funcs.atomic_duplicate_state() &drm_bridge_funcs.atomic_destroy_state() For some bridge drivers that have not supported atomic mode yet: drivers/gpu/drm/bridge/sii902x.c drivers/gpu/drm/bridge/rk630-tve.c ...... The drm_atomic_get_bridge_state() should not be called to get the bridge state by the global atomic state. Without this patch, the null pointer exception will occur. Fixes: 3558926745c8 ("drm/rockchip: logo: call drm_atomic_bridge_chain_check() bridge in mode fixup") Change-Id: I68c953db21a95bf5454fc47c65958dee9d13a8ce Signed-off-by: Damon Ding --- drivers/gpu/drm/rockchip/rockchip_drm_logo.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c index c113430ea3a2..b39036d9b3fd 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_logo.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_logo.c @@ -739,7 +739,19 @@ static void rockchip_drm_mode_fixup(struct drm_crtc_state *crtc_state, return; bridge = drm_bridge_chain_get_first_bridge(encoder); - if (bridge) { + /* + * Check whether the bridge supports atomic mode or not. + * According to the include/drm/drm_bridge.h, the following functions + * are mandatory in atomic mode: + * &drm_bridge_funcs.atomic_reset() + * &drm_bridge_funcs.atomic_duplicate_state() + * &drm_bridge_funcs.atomic_destroy_state() + * + * For some bridge drivers that have not supported atomic mode yet: + * drivers/gpu/drm/bridge/sii902x.c + * drivers/gpu/drm/bridge/rk630-tve.c + */ + if (bridge && bridge->funcs->atomic_duplicate_state) { bridge_state = drm_atomic_get_bridge_state(crtc_state->state, bridge); if (IS_ERR(bridge_state)) return;