Create a separate API for starting the encoder frame done timer and call
it after the encoder kickoff is finished

Signed-off-by: Jessica Zhang <quic_jessz...@quicinc.com>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c    |  4 +++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 21 ++++++++++++++-------
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h |  1 +
 3 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index c8ef59af444c..daf5f751f584 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -970,8 +970,10 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)
 
        dpu_vbif_clear_errors(dpu_kms);
 
-       drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
+       drm_for_each_encoder_mask(encoder, crtc->dev, 
crtc->state->encoder_mask) {
                dpu_encoder_kickoff(encoder);
+               dpu_encoder_start_frame_done_timer(encoder);
+       }
 
        reinit_completion(&dpu_crtc->frame_done_comp);
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index bde385318018..9d495a186eb8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -1945,18 +1945,12 @@ bool dpu_encoder_is_valid_for_commit(struct drm_encoder 
*drm_enc)
        return true;
 }
 
-void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
+void dpu_encoder_start_frame_done_timer(struct drm_encoder *drm_enc)
 {
        struct dpu_encoder_virt *dpu_enc;
-       struct dpu_encoder_phys *phys;
        unsigned long timeout_ms;
-       unsigned int i;
 
-       DPU_ATRACE_BEGIN("encoder_kickoff");
        dpu_enc = to_dpu_encoder_virt(drm_enc);
-
-       trace_dpu_enc_kickoff(DRMID(drm_enc));
-
        timeout_ms = DPU_ENCODER_FRAME_DONE_TIMEOUT_FRAMES * 1000 /
                        drm_mode_vrefresh(&drm_enc->crtc->state->adjusted_mode);
 
@@ -1964,6 +1958,19 @@ void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
        mod_timer(&dpu_enc->frame_done_timer,
                        jiffies + msecs_to_jiffies(timeout_ms));
 
+}
+
+void dpu_encoder_kickoff(struct drm_encoder *drm_enc)
+{
+       struct dpu_encoder_virt *dpu_enc;
+       struct dpu_encoder_phys *phys;
+       unsigned int i;
+
+       DPU_ATRACE_BEGIN("encoder_kickoff");
+       dpu_enc = to_dpu_encoder_virt(drm_enc);
+
+       trace_dpu_enc_kickoff(DRMID(drm_enc));
+
        /* All phys encs are ready to go, trigger the kickoff */
        _dpu_encoder_kickoff_phys(dpu_enc);
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
index 131bb8b2c0ee..7ab5f9380bf5 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
@@ -216,5 +216,6 @@ void dpu_encoder_cleanup_wb_job(struct drm_encoder *drm_enc,
  * @drm_enc:    Pointer to drm encoder structure
  */
 bool dpu_encoder_is_valid_for_commit(struct drm_encoder *drm_enc);
+void dpu_encoder_start_frame_done_timer(struct drm_encoder *drm_enc);
 
 #endif /* __DPU_ENCODER_H__ */

-- 
2.34.1

Reply via email to