On Mon, 3 Jun 2019 17:13:34 -0300 Helen Koike helen.koike@collabora.com wrote:
On 6/3/19 1:56 PM, Helen Koike wrote:
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().
Signed-off-by: Helen Koike helen.koike@collabora.com
Cc: stable@vger.kernel.org # v4.20+ Fixes: 15609559a834 ("drm/rockchip: update cursors asynchronously through atomic.")
One comment for next time you have to add such tags after the fact: please try to keep lines unwrapped, otherwise patchwork only gets what's on the first line.