Sean,

On 08/17/2016 09:11 AM, Sean Paul wrote:
> vblank should be enabled regardless of whether an event
> is expected back. This is especially important for a cursor
> plane.
Yep, I also found that sometimes vblank haven't been enabled when I move 
the mouse lightly, that would cause eDP panel wound't exit from PSR 
active state, and then nothing would be updated on panel. After apply 
this patch, things work rightly now, thanks for fixing.

Reviewed-by: Yakir Yang <ykk at rock-chips.com>
Tested-by: Yakir Yang <ykk at rock-chip.com>
> Signed-off-by: Sean Paul <seanpaul at chromium.org>
> ---
>
> Changes in v2:
>       - Rebased on 
> https://cgit.freedesktop.org/~seanpaul/dogwood/log/?h=for-next
>
>   drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 15 ++++++++++-----
>   1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c 
> b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index d1e0e06..1787084 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> @@ -112,6 +112,7 @@ struct vop {
>       struct device *dev;
>       struct drm_device *drm_dev;
>       bool is_enabled;
> +     bool vblank_active;
>   
>       /* mutex vsync_ work */
>       struct mutex vsync_mutex;
> @@ -1107,10 +1108,11 @@ static void vop_crtc_atomic_begin(struct drm_crtc 
> *crtc,
>       struct vop *vop = to_vop(crtc);
>   
>       spin_lock_irq(&crtc->dev->event_lock);
> -     if (crtc->state->event) {
> -             WARN_ON(drm_crtc_vblank_get(crtc) != 0);
> -             WARN_ON(vop->event);
> +     vop->vblank_active = true;
> +     WARN_ON(drm_crtc_vblank_get(crtc) != 0);
> +     WARN_ON(vop->event);
>   
> +     if (crtc->state->event) {
>               vop->event = crtc->state->event;
>               crtc->state->event = NULL;
>       }
> @@ -1197,12 +1199,14 @@ static void vop_handle_vblank(struct vop *vop)
>   
>       spin_lock_irqsave(&drm->event_lock, flags);
>       if (vop->event) {
> -
>               drm_crtc_send_vblank_event(crtc, vop->event);
> -             drm_crtc_vblank_put(crtc);
>               vop->event = NULL;
>   
>       }
> +     if (vop->vblank_active) {
> +             vop->vblank_active = false;
> +             drm_crtc_vblank_put(crtc);
> +     }
>       spin_unlock_irqrestore(&drm->event_lock, flags);
>   
>       if (!completion_done(&vop->wait_update_complete))
> @@ -1472,6 +1476,7 @@ static int vop_initial(struct vop *vop)
>       clk_disable(vop->aclk);
>   
>       vop->is_enabled = false;
> +     vop->vblank_active = false;
>   
>       return 0;
>   


Reply via email to