[PATCH 2/2] drm/rockchip: Send events for same-fb flips
Sjoerd Simons
sjoerd.simons at collabora.co.uk
Mon Nov 16 04:57:03 PST 2015
On Mon, 2015-11-16 at 12:50 +0000, Daniel Stone wrote:
> 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.
Tested on a Radxa Rock 2 square board, the combination of this patch
and the previous in this series makes weston (drm compositor, pixman
renderer) work nicely on this hardware while before it would get stuck
right away for the reasons pointed out by daniels
Tested-by: Sjoerd Simons <sjoerd.simons at collabora.co.uk>
> 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)) {
> - 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);
--
Sjoerd Simons
Collabora Ltd.
More information about the Linux-rockchip
mailing list