When configuring the tearcheck, the parameters for the engine were
being set mostly as they should've been, but then it wasn't getting
configured to get the vsync indication from the TE GPIO input
because it was assumed that autorefresh could be enabled:
since a previous commit makes sure to disable the autorefresh bit
when committing to the cmd engine, it is now safe to just enable
the vsync pin input at tearcheck setup time (instead of erroneously
never enabling it).

Also, set the right sync_cfg_height to enable the DPU auto-generated
TE signal in order to avoid stalls in the event that we miss one
external TE signal: this will still trigger recovery mechanisms in
case the display is really unreachable.

Signed-off-by: AngeloGioacchino Del Regno 
<angelogioacchino.delre...@somainline.org>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
index a367b093c888..c5cf59b5bd41 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
@@ -372,15 +372,12 @@ static void dpu_encoder_phys_cmd_tearcheck_config(
        tc_cfg.vsync_count = vsync_hz /
                                (mode->vtotal * drm_mode_vrefresh(mode));
 
-       /* enable external TE after kickoff to avoid premature autorefresh */
-       tc_cfg.hw_vsync_mode = 0;
-
        /*
-        * By setting sync_cfg_height to near max register value, we essentially
-        * disable dpu hw generated TE signal, since hw TE will arrive first.
-        * Only caveat is if due to error, we hit wrap-around.
+        * Set the sync_cfg_height to twice vtotal so that if we lose a
+        * TE event coming from the display TE pin we won't stall immediately
         */
-       tc_cfg.sync_cfg_height = 0xFFF0;
+       tc_cfg.hw_vsync_mode = 1;
+       tc_cfg.sync_cfg_height = mode->vtotal * 2;
        tc_cfg.vsync_init_val = mode->vdisplay;
        tc_cfg.sync_threshold_start = DEFAULT_TEARCHECK_SYNC_THRESH_START;
        tc_cfg.sync_threshold_continue = DEFAULT_TEARCHECK_SYNC_THRESH_CONTINUE;
-- 
2.29.2

Reply via email to