diff options
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.c | 18 |
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; |