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. > - 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);