diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index a2359d61eb..e70f491744 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -5428,6 +5428,20 @@ u32 sde_encoder_helper_get_kickoff_timeout_ms(struct drm_encoder *drm_enc) return (SEC_TO_MILLI_SEC / fps) * 2; } +void sde_encoder_reset_kickoff_timeout_ms(struct drm_encoder *drm_enc) +{ + struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); + + if (!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE)) + return; + + for (int i = 0; i < sde_enc->num_phys_encs; i++) { + if (sde_enc->phys_encs[i]) + sde_enc->phys_encs[i]->kickoff_timeout_ms = + sde_encoder_helper_get_kickoff_timeout_ms(drm_enc); + } +} + int sde_encoder_get_avr_status(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; diff --git a/msm/sde/sde_encoder.h b/msm/sde/sde_encoder.h index 1deb55aa23..22ccb09dab 100644 --- a/msm/sde/sde_encoder.h +++ b/msm/sde/sde_encoder.h @@ -386,6 +386,12 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *encoder, */ void sde_encoder_trigger_kickoff_pending(struct drm_encoder *encoder); +/** + * sde_encoder_reset_kickoff_timeout_ms - Reset the kickoff_timout after modeset + * commit for command mode display. + * @encoder: encoder pointer + */ +void sde_encoder_reset_kickoff_timeout_ms(struct drm_encoder *encoder); /** * sde_encoder_kickoff - trigger a double buffer flip of the ctl path * (i.e. ctl flush and start) immediately. diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index deebc0468a..7a10231984 100644 --- a/msm/sde/sde_encoder_phys_cmd.c +++ b/msm/sde/sde_encoder_phys_cmd.c @@ -827,7 +827,8 @@ static void sde_encoder_phys_cmd_mode_set( _sde_encoder_phys_cmd_setup_irq_hw_idx(phys_enc); phys_enc->kickoff_timeout_ms = - sde_encoder_helper_get_kickoff_timeout_ms(phys_enc->parent); + max(phys_enc->kickoff_timeout_ms, + sde_encoder_helper_get_kickoff_timeout_ms(phys_enc->parent)); } static int _sde_encoder_phys_cmd_handle_framedone_timeout( diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 14aea2ca24..46cbad9dbc 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1726,6 +1726,11 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms, if (cwb_disabling && cwb_enc) sde_encoder_virt_reset(cwb_enc); + if (drm_atomic_crtc_needs_modeset(crtc->state)) { + drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) + sde_encoder_reset_kickoff_timeout_ms(encoder); + } + /* avoid system cache update to set rd-noalloc bit when NSE feature is enabled */ if (!test_bit(SDE_FEATURE_SYS_CACHE_NSE, sde_kms->catalog->features)) sde_crtc_static_cache_read_kickoff(crtc);