diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index b35ab6780a88..14cefb523686 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -5540,10 +5540,11 @@ static void vop2_plane_atomic_disable(struct drm_plane *plane, struct drm_atomic */ static void vop2_plane_setup_color_key(struct drm_plane *plane) { - struct drm_plane_state *pstate = plane->state; - struct vop2_plane_state *vpstate = to_vop2_plane_state(pstate); - struct drm_framebuffer *fb = pstate->fb; + struct drm_plane_state *pstate; + struct vop2_plane_state *vpstate; + struct drm_framebuffer *fb; struct vop2_win *win = to_vop2_win(plane); + struct vop2_win *left_win = NULL; struct vop2 *vop2 = win->vop2; uint32_t color_key_en = 0; uint32_t color_key; @@ -5551,8 +5552,22 @@ static void vop2_plane_setup_color_key(struct drm_plane *plane) uint32_t g = 0; uint32_t b = 0; + if (win->splice_mode_right) { + pstate = win->left_win->base.state; + left_win = win->left_win; + } else { + pstate = plane->state; + } + + vpstate = to_vop2_plane_state(pstate); + if (!vpstate) + return; + fb = pstate->fb; + if (!(vpstate->color_key & VOP_COLOR_KEY_MASK) || fb->format->is_yuv) { VOP_WIN_SET(vop2, win, color_key_en, 0); + if (left_win) + VOP_WIN_SET(vop2, left_win, color_key_en, 0); return; } @@ -5586,6 +5601,10 @@ static void vop2_plane_setup_color_key(struct drm_plane *plane) color_key = (r << 20) | (g << 10) | b; VOP_WIN_SET(vop2, win, color_key_en, color_key_en); VOP_WIN_SET(vop2, win, color_key, color_key); + if (left_win) { + VOP_WIN_SET(vop2, left_win, color_key_en, color_key_en); + VOP_WIN_SET(vop2, left_win, color_key, color_key); + } } static void vop2_calc_drm_rect_for_splice(struct vop2_plane_state *vpstate,