From 5fd5d0d25b0754ec028085607b54b79e08e83f74 Mon Sep 17 00:00:00 2001
From: Tomasz Figa <tfiga@chromium.org>
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 <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 | 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