From: Marijn Suijten <marijn.suij...@somainline.org>

[ Upstream commit 2ad52bdb220de5ab348098e3482b01235d15a842 ]

Leaving this at a close-to-maximum register value 0xFFF0 means it takes
very long for the MDSS to generate a software vsync interrupt when the
hardware TE interrupt doesn't arrive.  Configuring this to double the
vtotal (like some downstream kernels) leads to a frame to take at most
twice before the vsync signal, until hardware TE comes up.

In this case the hardware interrupt responsible for providing this
signal - "disp-te" gpio - is not hooked up to the mdp5 vsync/pp logic at
all.  This solves severe panel update issues observed on at least the
Xperia Loire and Tone series, until said gpio is properly hooked up to
an irq.

Suggested-by: AngeloGioacchino Del Regno 
<angelogioacchino.delre...@somainline.org>
Signed-off-by: Marijn Suijten <marijn.suij...@somainline.org>
Reviewed-by: AngeloGioacchino Del Regno 
<angelogioacchino.delre...@somainline.org>
Link: 
https://lore.kernel.org/r/20210406214726.131534-2-marijn.suij...@somainline.org
Signed-off-by: Rob Clark <robdcl...@chromium.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
index d6f79dc755b4..14e2ce87bab1 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
@@ -78,9 +78,17 @@ static int pingpong_tearcheck_setup(struct drm_encoder 
*encoder,
                | MDP5_PP_SYNC_CONFIG_VSYNC_IN_EN;
        cfg |= MDP5_PP_SYNC_CONFIG_VSYNC_COUNT(vclks_line);
 
+       /*
+        * Tearcheck emits a blanking signal every vclks_line * vtotal * 2 
ticks on
+        * the vsync_clk equating to roughly half the desired panel refresh 
rate.
+        * This is only necessary as stability fallback if interrupts from the
+        * panel arrive too late or not at all, but is currently used by default
+        * because these panel interrupts are not wired up yet.
+        */
        mdp5_write(mdp5_kms, REG_MDP5_PP_SYNC_CONFIG_VSYNC(pp_id), cfg);
        mdp5_write(mdp5_kms,
-               REG_MDP5_PP_SYNC_CONFIG_HEIGHT(pp_id), 0xfff0);
+               REG_MDP5_PP_SYNC_CONFIG_HEIGHT(pp_id), (2 * mode->vtotal));
+
        mdp5_write(mdp5_kms,
                REG_MDP5_PP_VSYNC_INIT_VAL(pp_id), mode->vdisplay);
        mdp5_write(mdp5_kms, REG_MDP5_PP_RD_PTR_IRQ(pp_id), mode->vdisplay + 1);
-- 
2.30.2

_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

Reply via email to