| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Lucas Stach <l.stach@pengutronix.de> |
| Date: Thu, 15 Mar 2018 10:11:59 +0100 |
| Subject: drm/imx: move arming of the vblank event to atomic_flush |
| |
| From: Lucas Stach <l.stach@pengutronix.de> |
| |
| [ Upstream commit 6a055b92de15af987b4027826d43aa103c65a3c4 ] |
| |
| Right now the vblank event completion is racing with the atomic update, |
| which is especially bad when the PRE is in use, as one of the hardware |
| issue workaround might extend the atomic commit for quite some time. |
| |
| If the vblank IRQ happens to trigger during that time, we will prematurely |
| signal the atomic commit completion to userspace, which causes tearing |
| when userspace re-uses a framebuffer we haven't managed to flip away from |
| yet. |
| |
| Signed-off-by: Lucas Stach <l.stach@pengutronix.de> |
| Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/imx/ipuv3-crtc.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/gpu/drm/imx/ipuv3-crtc.c |
| +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c |
| @@ -189,7 +189,11 @@ static void ipu_crtc_atomic_begin(struct |
| struct drm_crtc_state *old_crtc_state) |
| { |
| drm_crtc_vblank_on(crtc); |
| +} |
| |
| +static void ipu_crtc_atomic_flush(struct drm_crtc *crtc, |
| + struct drm_crtc_state *old_crtc_state) |
| +{ |
| spin_lock_irq(&crtc->dev->event_lock); |
| if (crtc->state->event) { |
| WARN_ON(drm_crtc_vblank_get(crtc)); |
| @@ -257,6 +261,7 @@ static const struct drm_crtc_helper_func |
| .mode_set_nofb = ipu_crtc_mode_set_nofb, |
| .atomic_check = ipu_crtc_atomic_check, |
| .atomic_begin = ipu_crtc_atomic_begin, |
| + .atomic_flush = ipu_crtc_atomic_flush, |
| .atomic_disable = ipu_crtc_atomic_disable, |
| .enable = ipu_crtc_enable, |
| }; |