From 5fd5d0d25b0754ec028085607b54b79e08e83f74 Mon Sep 17 00:00:00 2001 From: Tomasz Figa Date: Wed, 14 Sep 2016 21:55:00 +0900 Subject: [PATCH] UPSTREAM: drm/rockchip: Always signal event in next vblank after cfg_done This patch makes the driver send the pending vblank event in next vblank following the commit, relying on vblank signalling improvements done in previous patches. This gives us vblank events that always represent the real moment of changes hitting on the screen (which was the case only for complete FB changes before) and lets us remove the manual window update check. Signed-off-by: Tomasz Figa (cherry picked from commit 41ee436700f41260663d0b201585551745b623d0) Change-Id: Icb1d14cb8af942e39407cc6205a58b9c5e31122b Signed-off-by: Mark Yao --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 26 ++++++++------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 7608a02d72f0..cf99c393ef60 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -331,11 +331,6 @@ static bool vop_is_allwin_disabled(struct vop *vop) return true; } -static bool vop_is_cfg_done_complete(struct vop *vop) -{ - return VOP_CTRL_GET(vop, cfg_done) ? false : true; -} - static bool vop_fs_irq_is_active(struct vop *vop) { return VOP_INTR_GET_TYPE(vop, status, FS_INTR); @@ -2281,6 +2276,16 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, */ vop_wait_for_irq_handler(vop); + spin_lock_irq(&crtc->dev->event_lock); + if (crtc->state->event) { + WARN_ON(drm_crtc_vblank_get(crtc) != 0); + WARN_ON(vop->event); + + vop->event = crtc->state->event; + crtc->state->event = NULL; + } + spin_unlock_irq(&crtc->dev->event_lock); + for_each_plane_in_state(old_state, plane, old_plane_state, i) { if (!old_plane_state->fb) continue; @@ -2298,14 +2303,6 @@ static void vop_crtc_atomic_flush(struct drm_crtc *crtc, static void vop_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state *old_crtc_state) { - struct vop *vop = to_vop(crtc); - - if (crtc->state->event) { - WARN_ON(drm_crtc_vblank_get(crtc) != 0); - - vop->event = crtc->state->event; - crtc->state->event = NULL; - } } static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = { @@ -2576,9 +2573,6 @@ static void vop_handle_vblank(struct vop *vop) struct drm_crtc *crtc = &vop->crtc; unsigned long flags; - if (!vop_is_cfg_done_complete(vop)) - return; - if (vop->event) { spin_lock_irqsave(&drm->event_lock, flags); -- 2.34.1