From 700e1689942adf9ed59e12a751a05a46ffeae001 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Fri, 23 Feb 2024 11:38:48 +0800 Subject: [PATCH] drm/rockchip: vop2: disable writeback auto gating at oneshot mode At writeback oneshot mode, the writeback auto gating will close clk after VOP writeback complete, but at this time, the writeback axi access maybe uncomplete, this will lead to writeback state error and iommu stall failed. Signed-off-by: Sandy Huang Change-Id: I4a74a8ace1cf6dba6d60af822e0d74d31d7f61fa --- drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 20 ++++++++++++++------ drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 28e23141d4b9..b05e84c944b2 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -1037,6 +1037,7 @@ struct vop2_wb_regs { struct vop_reg vir_stride_en; struct vop_reg act_width; struct vop_reg one_frame_mode; + struct vop_reg auto_gating; }; struct vop2_power_domain_data { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index f707986111c8..13e1ab00f15b 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3564,22 +3564,30 @@ static void vop2_wb_commit(struct drm_crtc *crtc) VOP_MODULE_SET(vop2, wb, scale_x_en, wb_state->scale_x_en); VOP_MODULE_SET(vop2, wb, scale_y_en, wb_state->scale_y_en); VOP_MODULE_SET(vop2, wb, r2y_en, r2y); - if (vop2->version == VOP_VERSION_RK3576) { - bool enable_one_frame_mode = true; + + /* + * From rk3576, VOP writeback can support oneshot mode, and + * at rk3576 writbeback oneshot mode must disable auto gating. + */ + if (!is_vop3(vop2) || vop2->version == VOP_VERSION_RK3528 || + vop2->version == VOP_VERSION_RK3562) { + VOP_MODULE_SET(vop2, wb, enable, 1); + } else { + bool one_frame_mode = true; VOP_MODULE_SET(vop2, wb, act_width, fb->width - 1); VOP_MODULE_SET(vop2, wb, vir_stride, fb->pitches[0] >> 2); VOP_MODULE_SET(vop2, wb, vir_stride_en, 1); - - if (enable_one_frame_mode) { + if (one_frame_mode) { + if (vop2->version == VOP_VERSION_RK3576) + VOP_MODULE_SET(vop2, wb, auto_gating, 0); VOP_MODULE_SET(vop2, wb, one_frame_mode, 1); vop2_write_reg_uncached(vop2, &wb->regs->enable, 1); } else { VOP_MODULE_SET(vop2, wb, enable, 1); } - } else { - VOP_MODULE_SET(vop2, wb, enable, 1); } + vop2_wb_irqs_enable(vop2); VOP_CTRL_SET(vop2, wb_dma_finish_and_en, 1); } diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 2acea7d113ac..9db134f46212 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -906,6 +906,7 @@ static const struct vop2_wb_regs rk3576_vop_wb_regs = { .vir_stride = VOP_REG(RK3576_WB_VIR_STRIDE, 0x1fff, 0), .vir_stride_en = VOP_REG(RK3576_WB_VIR_STRIDE, 0x1, 15), .act_width = VOP_REG(RK3576_WB_VIR_STRIDE, 0x1fff, 16), + .auto_gating = VOP_REG(RK3568_SYS_AUTO_GATING_CTRL, 0x1, 11), }; static const struct vop2_wb_data rk3576_vop_wb_data = {