Commit b7cb67a6 authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: crtc: Add a delay after disabling the PixelValve output

In order to avoid pixels getting stuck in the (unflushable) FIFO between
the HVS and the PV, we need to add some delay after disabling the PV output
and before disabling the HDMI controller. 20ms seems to be good enough so
let's use that.
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Tested-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Tested-by: default avatarHoegeun Kwon <hoegeun.kwon@samsung.com>
Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://patchwork.freedesktop.org/patch/msgid/15cf215bd2ceebd203c4010c09c21a4019c650ed.1599120059.git-series.maxime@cerno.tech
parent 792c3132
......@@ -403,6 +403,24 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1);
WARN_ONCE(ret, "Timeout waiting for !PV_VCONTROL_VIDEN\n");
/*
* This delay is needed to avoid to get a pixel stuck in an
* unflushable FIFO between the pixelvalve and the HDMI
* controllers on the BCM2711.
*
* Timing is fairly sensitive here, so mdelay is the safest
* approach.
*
* If it was to be reworked, the stuck pixel happens on a
* BCM2711 when changing mode with a good probability, so a
* script that changes mode on a regular basis should trigger
* the bug after less than 10 attempts. It manifests itself with
* every pixels being shifted by one to the right, and thus the
* last pixel of a line actually being displayed as the first
* pixel on the next line.
*/
mdelay(20);
if (vc4_encoder->post_crtc_disable)
vc4_encoder->post_crtc_disable(encoder);
......
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