Commit a5c4b75f authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: crtc: Enable and disable the PV in atomic_enable / disable

The VIDEN bit in the pixelvalve currently being used to enable or disable
the pixelvalve seems to not be enough in some situations, which whill end
up with the pixelvalve stalling.

In such a case, even re-enabling VIDEN doesn't bring it back and we need to
clear the FIFO. This can only be done if the pixelvalve is disabled though.

In order to overcome this, we can configure the pixelvalve during
mode_set_no_fb by calling vc4_crtc_config_pv, but only enable it in
atomic_enable and flush the FIFO there, and in atomic_disable disable the
pixelvalve again.
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/e97596f62f4df83424d994a23465463ac60f986e.1599120059.git-series.maxime@cerno.tech
parent 32a851c2
...@@ -332,9 +332,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc) ...@@ -332,9 +332,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
PV_CONTROL_TRIGGER_UNDERFLOW | PV_CONTROL_TRIGGER_UNDERFLOW |
PV_CONTROL_WAIT_HSTART | PV_CONTROL_WAIT_HSTART |
VC4_SET_FIELD(vc4_encoder->clock_select, VC4_SET_FIELD(vc4_encoder->clock_select,
PV_CONTROL_CLK_SELECT) | PV_CONTROL_CLK_SELECT));
PV_CONTROL_FIFO_CLR |
PV_CONTROL_EN);
} }
static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc) static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
...@@ -386,6 +384,8 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, ...@@ -386,6 +384,8 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1); ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1);
WARN_ONCE(ret, "Timeout waiting for !PV_VCONTROL_VIDEN\n"); WARN_ONCE(ret, "Timeout waiting for !PV_VCONTROL_VIDEN\n");
CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) & ~PV_CONTROL_EN);
vc4_hvs_atomic_disable(crtc, old_state); vc4_hvs_atomic_disable(crtc, old_state);
/* /*
...@@ -410,6 +410,10 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -410,6 +410,10 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
require_hvs_enabled(dev); require_hvs_enabled(dev);
/* Reset the PV fifo. */
CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) |
PV_CONTROL_FIFO_CLR | PV_CONTROL_EN);
/* Enable vblank irq handling before crtc is started otherwise /* Enable vblank irq handling before crtc is started otherwise
* drm_crtc_get_vblank() fails in vc4_crtc_update_dlist(). * drm_crtc_get_vblank() fails in vc4_crtc_update_dlist().
*/ */
......
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