UPSTREAM: drm/rockchip: Always signal event in next vblank after cfg_done
authorTomasz Figa <tfiga@chromium.org>
Wed, 14 Sep 2016 12:55:00 +0000 (21:55 +0900)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 26 Jul 2017 11:09:45 +0000 (19:09 +0800)
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 <tfiga@chromium.org>
(cherry picked from commit 41ee436700f41260663d0b201585551745b623d0)

Change-Id: Icb1d14cb8af942e39407cc6205a58b9c5e31122b
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/rockchip/rockchip_drm_vop.c

index 7608a02d72f0255456476713f613c947b5840219..cf99c393ef60ecb1ce0471c72689b9c621b57ee3 100644 (file)
@@ -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);