• Helen Koike's avatar
    drm/rockchip: fix fb references in async update · d985a353
    Helen Koike authored
    In the case of async update, modifications are done in place, i.e. in the
    current plane state, so the new_state is prepared and the new_state is
    cleaned up (instead of the old_state, unlike what happens in a
    normal sync update).
    To cleanup the old_fb properly, it needs to be placed in the new_state
    in the end of async_update, so cleanup call will unreference the old_fb
    correctly.
    
    Also, the previous code had a:
    
    	plane_state = plane->funcs->atomic_duplicate_state(plane);
    	...
    	swap(plane_state, plane->state);
    
    	if (plane->state->fb && plane->state->fb != new_state->fb) {
    	...
    	}
    
    Which was wrong, as the fb were just assigned to be equal, so this if
    statement nevers evaluates to true.
    
    Another details is that the function drm_crtc_vblank_get() can only be
    called when vop->is_enabled is true, otherwise it has no effect and
    trows a WARN_ON().
    
    Calling drm_atomic_set_fb_for_plane() (which get a referent of the new
    fb and pus the old fb) is not required, as it is taken care by
    drm_mode_cursor_universal() when calling
    drm_atomic_helper_update_plane().
    
    Fixes: 15609559 ("drm/rockchip: update cursors asynchronously through atomic.")
    Cc: <stable@vger.kernel.org> # v4.20+
    Signed-off-by: default avatarHelen Koike <helen.koike@collabora.com>
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190603165610.24614-2-helen.koike@collabora.com
    d985a353
rockchip_drm_vop.c 48.5 KB