diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index f757c206b2ec..a0efdc02b4db 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -2095,6 +2095,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, if ((is_alpha_support(fb->format->format) || global_alpha_en) && (s->dsp_layer_sel & 0x3) != win->win_id) { int src_blend_m0; + int pre_multi_alpha = ALPHA_SRC_PRE_MUL; if (is_alpha_support(fb->format->format) && global_alpha_en) src_blend_m0 = ALPHA_PER_PIX_GLOBAL; @@ -2103,18 +2104,20 @@ static void vop_plane_atomic_update(struct drm_plane *plane, else src_blend_m0 = ALPHA_GLOBAL; + if (vop_plane_state->blend_mode == 0 || src_blend_m0 == ALPHA_GLOBAL) + pre_multi_alpha = ALPHA_SRC_NO_PRE_MUL; + VOP_WIN_SET(vop, win, dst_alpha_ctl, DST_FACTOR_M0(ALPHA_SRC_INVERSE)); - val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(ALPHA_SRC_PRE_MUL) | + val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(pre_multi_alpha) | SRC_ALPHA_M0(ALPHA_STRAIGHT) | SRC_BLEND_M0(src_blend_m0) | SRC_ALPHA_CAL_M0(ALPHA_SATURATION) | SRC_FACTOR_M0(global_alpha_en ? ALPHA_SRC_GLOBAL : ALPHA_ONE); VOP_WIN_SET(vop, win, src_alpha_ctl, val); - VOP_WIN_SET(vop, win, alpha_pre_mul, - vop_plane_state->blend_mode == DRM_MODE_BLEND_PREMULTI ? 1 : 0); - VOP_WIN_SET(vop, win, alpha_mode, 1); + VOP_WIN_SET(vop, win, alpha_pre_mul, !pre_multi_alpha); /* VOP lite only */ + VOP_WIN_SET(vop, win, alpha_mode, src_blend_m0); /* VOP lite only */ VOP_WIN_SET(vop, win, alpha_en, 1); } else { VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0));