Commit f59769c5 authored by Mihail Atanassov's avatar Mihail Atanassov Committed by Ayan kumar halder

drm/komeda: Workaround for broken FLIP_COMPLETE timestamps

When initially turning a crtc on, drm_reset_vblank_timestamp will
set the vblank timestamp to 0 for any driver that doesn't provide
a ->get_vblank_timestamp() hook.

Unfortunately, the FLIP_COMPLETE event depends on that timestamp,
and the only way to regenerate a valid one is to have vblank
interrupts enabled and have a valid in-ISR call to
drm_crtc_handle_vblank.

Additionally, if the user doesn't request vblanks but _does_ request
FLIP_COMPLETE events, we still don't have a good timestamp: it'll be the
same stamp as the last vblank one.

Work around the issue by always enabling vblanks when the CRTC is on.
Reducing the amount of time that PL0 has to be unmasked would be nice to
fix at a later time.

Changes since v1 [https://patchwork.freedesktop.org/patch/331727/]:
 - moved drm_crtc_vblank_put call to the ->atomic_disable() hook

Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Liviu Dudau <Liviu.Dudau@arm.com>
Signed-off-by: default avatarMihail Atanassov <mihail.atanassov@arm.com>
Reviewed-by: default avatarJames Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: default avatarAyan kumar halder <ayan.halder@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191001142121.13939-1-mihail.atanassov@arm.com
parent 4b39582a
...@@ -249,6 +249,7 @@ komeda_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -249,6 +249,7 @@ komeda_crtc_atomic_enable(struct drm_crtc *crtc,
{ {
komeda_crtc_prepare(to_kcrtc(crtc)); komeda_crtc_prepare(to_kcrtc(crtc));
drm_crtc_vblank_on(crtc); drm_crtc_vblank_on(crtc);
WARN_ON(drm_crtc_vblank_get(crtc));
komeda_crtc_do_flush(crtc, old); komeda_crtc_do_flush(crtc, old);
} }
...@@ -341,6 +342,7 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc, ...@@ -341,6 +342,7 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc,
komeda_crtc_flush_and_wait_for_flip_done(kcrtc, disable_done); komeda_crtc_flush_and_wait_for_flip_done(kcrtc, disable_done);
} }
drm_crtc_vblank_put(crtc);
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
komeda_crtc_unprepare(kcrtc); komeda_crtc_unprepare(kcrtc);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment