aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c')
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
index d6e8fd34e051..9a0d9735bf07 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
@@ -1180,8 +1180,24 @@ static int _sde_encoder_phys_cmd_wait_for_ctl_start(
else
ret = 0;
- if (sde_encoder_phys_cmd_is_master(phys_enc))
+ if (sde_encoder_phys_cmd_is_master(phys_enc)) {
+ /*
+ * Signaling the retire fence at ctl start timeout
+ * to allow the next commit and avoid device freeze.
+ * As ctl start timeout can occurs due to no read ptr,
+ * updating pending_rd_ptr_cnt here may not cover all
+ * cases. Hence signaling the retire fence.
+ */
+ if (atomic_add_unless(
+ &phys_enc->pending_retire_fence_cnt, -1, 0))
+ phys_enc->parent_ops.handle_frame_done(
+ phys_enc->parent,
+ phys_enc,
+ SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE);
+ atomic_add_unless(
+ &phys_enc->pending_ctlstart_cnt, -1, 0);
atomic_inc_return(&phys_enc->ctlstart_timeout);
+ }
}
return ret;