From f4f7ebc6d2765584b45b113fed615608cf9287e0 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sat, 2 Aug 2025 17:20:57 +0800 Subject: [PATCH] drm/rockchip: vop2: add support one esmart layer global alpha for rk3562/rk3528/rk3576 To deal with bottom_layer_global_alpha when only have one esmart layer at bottom layer. And the cluster global alpha is processed by cluster mix. Signed-off-by: Sandy Huang Change-Id: I1f5de9774920a37a60d45c77c1f71bc740bbbb7a --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 13656395d6d3..fce6495f5cfa 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -12034,6 +12034,28 @@ static void vop3_setup_alpha(struct vop2_video_port *vp, vop2_writel(vop2, dst_alpha_ctrl_offset + offset, alpha.dst_alpha_ctrl.val); } + /* To deal with bottom_layer_global_alpha when only have one esmart layer at + * bottom layer. And the cluster global alpha is processed by cluster mix. + */ + if (vp->nr_layers == 1) { + zpos = &vop2_zpos[0]; + win = vop2_find_win_by_phys_id(vop2, zpos->win_phys_id); + if (!vop2_cluster_window(win) && (bottom_layer_global_alpha != 0xff)) { + alpha_config.src_premulti_en = true; + alpha_config.dst_premulti_en = false; + alpha_config.src_pixel_alpha_en = true; + alpha_config.src_glb_alpha_value = 0xff; + alpha_config.dst_glb_alpha_value = bottom_layer_global_alpha; + vop2_parse_alpha(&alpha_config, &alpha); + offset = (i - 1) * 0x10; + vop2_writel(vop2, src_color_ctrl_offset + offset, alpha.src_color_ctrl.val); + vop2_writel(vop2, dst_color_ctrl_offset + offset, alpha.dst_color_ctrl.val); + vop2_writel(vop2, src_alpha_ctrl_offset + offset, alpha.src_alpha_ctrl.val); + vop2_writel(vop2, dst_alpha_ctrl_offset + offset, alpha.dst_alpha_ctrl.val); + i++; + } + } + /* Transfer pixel alpha value to next mix */ alpha_config.src_premulti_en = true; alpha_config.dst_premulti_en = true;