Loading msm/sde/sde_crtc.c +2 −10 Original line number Diff line number Diff line Loading @@ -3637,11 +3637,8 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, } /* Early out if simple ctl reset succeeded */ if (i == sde_crtc->num_ctls) { sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc), crtc, false); if (i == sde_crtc->num_ctls) return 0; } SDE_DEBUG("crtc%d: issuing hard reset\n", DRMID(crtc)); Loading Loading @@ -3699,8 +3696,6 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, sde_encoder_kickoff(encoder, false, true); } sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc), crtc, false); /* panic the device if VBIF is not in good state */ return !recovery_events ? 0 : -EAGAIN; } Loading Loading @@ -3776,8 +3771,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, params.recovery_events_enabled)) is_error = true; sde_crtc->needs_hw_reset = false; } else { sde_kms_update_recovery_mask(sde_kms, crtc, false); } sde_crtc_calc_fps(sde_crtc); Loading @@ -3798,10 +3791,9 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, sde_vbif_clear_errors(sde_kms); if (is_error || sde_kms->recovery_mask) { if (is_error) { _sde_crtc_remove_pipe_flush(crtc); _sde_crtc_blend_setup(crtc, old_state, false); SDE_EVT32(sde_kms->recovery_mask); } list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { Loading msm/sde/sde_crtc.h +6 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include "sde_kms.h" #include "sde_core_perf.h" #include "sde_hw_ds.h" #include "sde_encoder.h" #define SDE_CRTC_NAME_SIZE 12 Loading Loading @@ -575,12 +576,15 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, /** * sde_crtc_request_frame_reset - requests for next frame reset * @crtc: Pointer to drm crtc object * @encoder: Pointer to drm encoder object */ static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc) static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc, struct drm_encoder *encoder) { struct sde_crtc *sde_crtc = to_sde_crtc(crtc); if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START) if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START || !sde_encoder_is_dsi_display(encoder)) sde_crtc_reset_hw(crtc, crtc->state, false); return 0; Loading msm/sde/sde_kms.c +1 −28 Original line number Diff line number Diff line Loading @@ -1512,31 +1512,6 @@ static void sde_kms_complete_commit(struct msm_kms *kms, SDE_ATRACE_END("sde_kms_complete_commit"); } void sde_kms_update_recovery_mask(struct sde_kms *sde_kms, struct drm_crtc *crtc, bool flag) { int i; struct sde_hw_ctl *ctl; struct sde_crtc *sde_crtc; if (!crtc || !sde_kms) { SDE_ERROR("invalid params\n"); return; } sde_crtc = to_sde_crtc(crtc); for (i = 0; i < sde_crtc->num_ctls; ++i) { ctl = sde_crtc->mixers[i].hw_ctl; if (!ctl || !ctl->ops.reset) continue; if (flag) sde_kms->recovery_mask |= BIT(ctl->idx - CTL_0); else sde_kms->recovery_mask &= ~BIT(ctl->idx - CTL_0); } } static void sde_kms_wait_for_commit_done(struct msm_kms *kms, struct drm_crtc *crtc) { Loading Loading @@ -1586,9 +1561,7 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms, ret = sde_encoder_wait_for_event(encoder, MSM_ENC_COMMIT_DONE); if (ret && ret != -EWOULDBLOCK) { SDE_ERROR("wait for commit done returned %d\n", ret); sde_kms_update_recovery_mask(to_sde_kms(kms), crtc, true); sde_crtc_request_frame_reset(crtc); sde_crtc_request_frame_reset(crtc, encoder); break; } Loading msm/sde/sde_kms.h +0 −11 Original line number Diff line number Diff line Loading @@ -274,7 +274,6 @@ struct sde_kms { int irq_num; /* mdss irq number */ bool irq_enabled; int recovery_mask; struct sde_core_perf perf; /* saved atomic state during system suspend */ Loading Loading @@ -755,14 +754,4 @@ int sde_kms_vm_trusted_prepare_commit(struct sde_kms *sde_kms, */ int sde_kms_vm_primary_prepare_commit(struct sde_kms *sde_kms, struct drm_atomic_state *state); /** * sde_kms_update_recovery_mask - function to update recovery ctl mask * during error cases * @sde_kms: pointer to sde_kms * @crtc: pointer to drm_crtc * @flag: to determine whether to clear/set recovery mask */ void sde_kms_update_recovery_mask(struct sde_kms *sde_kms, struct drm_crtc *crtc, bool flag); #endif /* __sde_kms_H__ */ Loading
msm/sde/sde_crtc.c +2 −10 Original line number Diff line number Diff line Loading @@ -3637,11 +3637,8 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, } /* Early out if simple ctl reset succeeded */ if (i == sde_crtc->num_ctls) { sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc), crtc, false); if (i == sde_crtc->num_ctls) return 0; } SDE_DEBUG("crtc%d: issuing hard reset\n", DRMID(crtc)); Loading Loading @@ -3699,8 +3696,6 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, sde_encoder_kickoff(encoder, false, true); } sde_kms_update_recovery_mask(_sde_crtc_get_kms(crtc), crtc, false); /* panic the device if VBIF is not in good state */ return !recovery_events ? 0 : -EAGAIN; } Loading Loading @@ -3776,8 +3771,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, params.recovery_events_enabled)) is_error = true; sde_crtc->needs_hw_reset = false; } else { sde_kms_update_recovery_mask(sde_kms, crtc, false); } sde_crtc_calc_fps(sde_crtc); Loading @@ -3798,10 +3791,9 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, sde_vbif_clear_errors(sde_kms); if (is_error || sde_kms->recovery_mask) { if (is_error) { _sde_crtc_remove_pipe_flush(crtc); _sde_crtc_blend_setup(crtc, old_state, false); SDE_EVT32(sde_kms->recovery_mask); } list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { Loading
msm/sde/sde_crtc.h +6 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include "sde_kms.h" #include "sde_core_perf.h" #include "sde_hw_ds.h" #include "sde_encoder.h" #define SDE_CRTC_NAME_SIZE 12 Loading Loading @@ -575,12 +576,15 @@ int sde_crtc_reset_hw(struct drm_crtc *crtc, struct drm_crtc_state *old_state, /** * sde_crtc_request_frame_reset - requests for next frame reset * @crtc: Pointer to drm crtc object * @encoder: Pointer to drm encoder object */ static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc) static inline int sde_crtc_request_frame_reset(struct drm_crtc *crtc, struct drm_encoder *encoder) { struct sde_crtc *sde_crtc = to_sde_crtc(crtc); if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START) if (sde_crtc->frame_trigger_mode == FRAME_DONE_WAIT_POSTED_START || !sde_encoder_is_dsi_display(encoder)) sde_crtc_reset_hw(crtc, crtc->state, false); return 0; Loading
msm/sde/sde_kms.c +1 −28 Original line number Diff line number Diff line Loading @@ -1512,31 +1512,6 @@ static void sde_kms_complete_commit(struct msm_kms *kms, SDE_ATRACE_END("sde_kms_complete_commit"); } void sde_kms_update_recovery_mask(struct sde_kms *sde_kms, struct drm_crtc *crtc, bool flag) { int i; struct sde_hw_ctl *ctl; struct sde_crtc *sde_crtc; if (!crtc || !sde_kms) { SDE_ERROR("invalid params\n"); return; } sde_crtc = to_sde_crtc(crtc); for (i = 0; i < sde_crtc->num_ctls; ++i) { ctl = sde_crtc->mixers[i].hw_ctl; if (!ctl || !ctl->ops.reset) continue; if (flag) sde_kms->recovery_mask |= BIT(ctl->idx - CTL_0); else sde_kms->recovery_mask &= ~BIT(ctl->idx - CTL_0); } } static void sde_kms_wait_for_commit_done(struct msm_kms *kms, struct drm_crtc *crtc) { Loading Loading @@ -1586,9 +1561,7 @@ static void sde_kms_wait_for_commit_done(struct msm_kms *kms, ret = sde_encoder_wait_for_event(encoder, MSM_ENC_COMMIT_DONE); if (ret && ret != -EWOULDBLOCK) { SDE_ERROR("wait for commit done returned %d\n", ret); sde_kms_update_recovery_mask(to_sde_kms(kms), crtc, true); sde_crtc_request_frame_reset(crtc); sde_crtc_request_frame_reset(crtc, encoder); break; } Loading
msm/sde/sde_kms.h +0 −11 Original line number Diff line number Diff line Loading @@ -274,7 +274,6 @@ struct sde_kms { int irq_num; /* mdss irq number */ bool irq_enabled; int recovery_mask; struct sde_core_perf perf; /* saved atomic state during system suspend */ Loading Loading @@ -755,14 +754,4 @@ int sde_kms_vm_trusted_prepare_commit(struct sde_kms *sde_kms, */ int sde_kms_vm_primary_prepare_commit(struct sde_kms *sde_kms, struct drm_atomic_state *state); /** * sde_kms_update_recovery_mask - function to update recovery ctl mask * during error cases * @sde_kms: pointer to sde_kms * @crtc: pointer to drm_crtc * @flag: to determine whether to clear/set recovery mask */ void sde_kms_update_recovery_mask(struct sde_kms *sde_kms, struct drm_crtc *crtc, bool flag); #endif /* __sde_kms_H__ */