On 2015?11?23? 15:46, Caesar Wang wrote: > Hi, > > ? 2015?11?16? 20:50, Daniel Stone ??: >> Rockchip previously treated a pageflip to the same framebuffer as a >> no-op, discarding the event if one was requested. This breaks Weston, >> which, when idle, sends a no-op vblank event to discover vblank >> timings if the vblank query interface is not usable. >> >> Silently dropping events is also quite a hostile thing to do to >> userspace in general. >> >> Signed-off-by: Daniel Stone <daniels at collabora.com> >> Cc: Sjoerd Simons <sjoerd.simons at collabora.co.uk> >> Cc: Heiko Stuebner <heiko at sntech.de> >> --- >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 30 >> ++++++++++++++--------------- >> 1 file changed, 14 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> index ddf6dc2..dad607e 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> @@ -916,25 +916,23 @@ static int vop_update_plane_event(struct >> drm_plane *plane, >> * unreference any previous framebuffers. >> */ >> mutex_lock(&vop->vsync_mutex); >> - if (fb != vop_win_last_pending_fb(vop_win)) { > > There is a warning for building. > > CC drivers/gpu/drm/rockchip/rockchip_drm_vop.o > drivers/gpu/drm/rockchip/rockchip_drm_vop.c:753:32: warning: > 'vop_win_last_pending_fb' defined but not used [-Wunused-function] > > Maybe, we can also remove the vop_win_last_pending_fb() function. > Can you test this problem with my new atomic patches? I think atomic patch fix the problem. Thanks. >> - ret = drm_vblank_get(plane->dev, vop->pipe); >> - if (ret) { >> - DRM_ERROR("failed to get vblank, %d\n", ret); >> - mutex_unlock(&vop->vsync_mutex); >> - return ret; >> - } >> + ret = drm_vblank_get(plane->dev, vop->pipe); >> + if (ret) { >> + DRM_ERROR("failed to get vblank, %d\n", ret); >> + mutex_unlock(&vop->vsync_mutex); >> + return ret; >> + } >> - drm_framebuffer_reference(fb); >> + drm_framebuffer_reference(fb); >> - ret = vop_win_queue_fb(vop_win, fb, yrgb_mst, event); >> - if (ret) { >> - drm_vblank_put(plane->dev, vop->pipe); >> - mutex_unlock(&vop->vsync_mutex); >> - return ret; >> - } >> - >> - vop->vsync_work_pending = true; >> + ret = vop_win_queue_fb(vop_win, fb, yrgb_mst, event); >> + if (ret) { >> + drm_vblank_put(plane->dev, vop->pipe); >> + mutex_unlock(&vop->vsync_mutex); >> + return ret; >> } >> + >> + vop->vsync_work_pending = true; >> mutex_unlock(&vop->vsync_mutex); >> spin_lock(&vop->reg_lock); > > > -- ?ark Yao