d985a35332
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:
|
||
---|---|---|
.. | ||
analogix_dp-rockchip.c | ||
cdn-dp-core.c | ||
cdn-dp-core.h | ||
cdn-dp-reg.c | ||
cdn-dp-reg.h | ||
dw_hdmi-rockchip.c | ||
dw-mipi-dsi-rockchip.c | ||
inno_hdmi.c | ||
inno_hdmi.h | ||
Kconfig | ||
Makefile | ||
rk3066_hdmi.c | ||
rk3066_hdmi.h | ||
rockchip_drm_drv.c | ||
rockchip_drm_drv.h | ||
rockchip_drm_fb.c | ||
rockchip_drm_fb.h | ||
rockchip_drm_fbdev.c | ||
rockchip_drm_fbdev.h | ||
rockchip_drm_gem.c | ||
rockchip_drm_gem.h | ||
rockchip_drm_psr.c | ||
rockchip_drm_psr.h | ||
rockchip_drm_vop.c | ||
rockchip_drm_vop.h | ||
rockchip_lvds.c | ||
rockchip_lvds.h | ||
rockchip_rgb.c | ||
rockchip_rgb.h | ||
rockchip_vop_reg.c | ||
rockchip_vop_reg.h |