From 41f6f64858fea2b5b1101df392a0846a328c169b Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Thu, 10 Apr 2025 15:38:03 +0800 Subject: [PATCH] drm/rockchip: vop2: Leave vblank enabled after entering the PSR mode According to the following commits: commit 9d0e3cac3517 ("drm/atomic: Allow vblank-enabled + self-refresh "disable"") commit 2bdba9d4a3ba ("drm/rockchip: vop: Leave vblank enabled in self-refresh") It is better to leave vblank enabled after entering the PSR mode, in order to ensure that the vblank APIs (like DRM_IOCTL_WAIT_VBLANK) can work in PSR mode. User space is not aware when the display system is already in PSR mode, so this appears to be an API violation. Without this patch, there may be a warning according to the following check in drivers/gpu/drm/drm_atomic_helper.c: static void disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) { ...... ret = drm_crtc_vblank_get(crtc); /* * Self-refresh is not a true "disable"; ensure vblank remains * enabled. */ if (new_crtc_state->self_refresh_active) WARN_ONCE(ret != 0, "driver disabled vblank in self-refresh\n"); else WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n"); if (ret == 0) drm_crtc_vblank_put(crtc); ...... } Change-Id: I95ee15864c1dfa1045c41c7a9ed2985bb6107f2b Signed-off-by: Damon Ding --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 402ae3679b87..c877c0f17875 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -5593,7 +5593,6 @@ static void vop2_crtc_atomic_enter_psr(struct drm_crtc *crtc, struct drm_crtc_st vop2_cfg_done(crtc); vop2_wait_for_fs_by_done_bit_status(vp); - drm_crtc_vblank_off(crtc); if (hweight8(vop2->active_vp_mask) == 1) { u32 adjust_aclk_rate = 0; u32 htotal = (VOP_MODULE_GET(vop2, vp, htotal_pw) >> 16) & 0xffff; @@ -5623,7 +5622,6 @@ static void vop2_crtc_atomic_exit_psr(struct drm_crtc *crtc, struct drm_crtc_sta struct vop2_win *win; unsigned long enabled_win_mask = vp->enabled_win_mask; - drm_crtc_vblank_on(crtc); if (vop2->aclk_rate_reset) clk_set_rate(vop2->aclk, vop2->aclk_current_freq); vop2->aclk_rate_reset = false;