Loading msm/sde/sde_crtc.c +4 −4 Original line number Diff line number Diff line Loading @@ -3510,7 +3510,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, struct msm_drm_private *priv; struct sde_kms *sde_kms; struct sde_crtc_state *cstate; bool is_error = false, reset_req; bool is_error = false; unsigned long flags; enum sde_crtc_idle_pc_state idle_pc_state; struct sde_encoder_kickoff_params params = { 0 }; Loading @@ -3522,7 +3522,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, dev = crtc->dev; sde_crtc = to_sde_crtc(crtc); sde_kms = _sde_crtc_get_kms(crtc); reset_req = false; if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private) { SDE_ERROR("invalid argument\n"); Loading Loading @@ -3555,7 +3554,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, params.affected_displays = _sde_crtc_get_displays_affected(crtc, crtc->state); if (sde_encoder_prepare_for_kickoff(encoder, ¶ms)) reset_req = true; sde_crtc->needs_hw_reset = true; if (idle_pc_state != IDLE_PC_NONE) sde_encoder_control_idle_pc(encoder, Loading @@ -3566,13 +3565,14 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, * Optionally attempt h/w recovery if any errors were detected while * preparing for the kickoff */ if (reset_req) { if (sde_crtc->needs_hw_reset) { sde_crtc->frame_trigger_mode = params.frame_trigger_mode; if (sde_crtc->frame_trigger_mode != FRAME_DONE_WAIT_POSTED_START && sde_crtc_reset_hw(crtc, old_state, params.recovery_events_enabled)) is_error = true; sde_crtc->needs_hw_reset = false; } sde_crtc_calc_fps(sde_crtc); Loading msm/sde/sde_crtc.h +18 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ struct sde_crtc_misr_info { * @ltm_hist_en : flag to indicate whether LTM hist is enabled or not * @ltm_buffer_lock : muttx to protect ltm_buffers allcation and free * @ltm_lock : Spinlock to protect ltm buffer_cnt, hist_en and ltm lists * @needs_hw_reset : Initiate a hw ctl reset */ struct sde_crtc { struct drm_crtc base; Loading Loading @@ -340,6 +341,7 @@ struct sde_crtc { struct drm_msm_ltm_cfg_param ltm_cfg; struct mutex ltm_buffer_lock; spinlock_t ltm_lock; bool needs_hw_reset; }; #define to_sde_crtc(x) container_of(x, struct sde_crtc, base) Loading Loading @@ -503,6 +505,22 @@ static inline int sde_crtc_frame_pending(struct drm_crtc *crtc) return atomic_read(&sde_crtc->frame_pending); } /** * sde_crtc_set_needs_hw_reset - set hw reset flag, to handle reset during * commit kickoff * @crtc: Pointer to DRM crtc instance */ static inline void sde_crtc_set_needs_hw_reset(struct drm_crtc *crtc) { struct sde_crtc *sde_crtc; if (!crtc) return; sde_crtc = to_sde_crtc(crtc); sde_crtc->needs_hw_reset = true; } /** * sde_crtc_reset_hw - attempt hardware reset on errors * @crtc: Pointer to DRM crtc instance Loading msm/sde/sde_encoder.c +10 −5 Original line number Diff line number Diff line Loading @@ -4689,7 +4689,7 @@ static void _sde_encoder_helper_hdr_plus_mempool_update( } } void sde_encoder_helper_needs_hw_reset(struct drm_encoder *drm_enc) void sde_encoder_needs_hw_reset(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); struct sde_encoder_phys *phys; Loading Loading @@ -4773,7 +4773,7 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc, /* if any phys needs reset, reset all phys, in-order */ if (needs_hw_reset) sde_encoder_helper_needs_hw_reset(drm_enc); sde_encoder_needs_hw_reset(drm_enc); _sde_encoder_update_master(drm_enc, params); Loading Loading @@ -4976,16 +4976,16 @@ int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc, return 0; } void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) int sde_encoder_prepare_commit(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct sde_encoder_phys *phys; int i, rc = 0; int i, rc = 0, ret = 0; struct sde_hw_ctl *ctl; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return; return -EINVAL; } sde_enc = to_sde_encoder_virt(drm_enc); Loading @@ -4999,6 +4999,9 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) if (phys && phys->ops.prepare_commit) phys->ops.prepare_commit(phys); if (phys->enable_state == SDE_ENC_ERR_NEEDS_HW_RESET) ret = -ETIMEDOUT; if (phys && phys->hw_ctl) { ctl = phys->hw_ctl; /* Loading @@ -5021,6 +5024,8 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) sde_enc->cur_master->connector->base.id, rc); } return ret; } void sde_encoder_helper_setup_misr(struct sde_encoder_phys *phys_enc, Loading msm/sde/sde_encoder.h +7 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,7 @@ void sde_encoder_destroy(struct drm_encoder *drm_enc); * atomic commit, before any registers are written * @drm_enc: Pointer to previously created drm encoder structure */ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc); int sde_encoder_prepare_commit(struct drm_encoder *drm_enc); /** * sde_encoder_update_caps_for_cont_splash - update encoder settings during Loading Loading @@ -342,6 +342,12 @@ void sde_encoder_control_idle_pc(struct drm_encoder *enc, bool enable); */ int sde_encoder_in_cont_splash(struct drm_encoder *enc); /** * sde_encoder_helper_hw_reset - hw reset helper function * @drm_enc: Pointer to drm encoder structure */ void sde_encoder_needs_hw_reset(struct drm_encoder *enc); /** * sde_encoder_uidle_enable - control enable/disable of uidle * @drm_enc: Pointer to drm encoder structure Loading msm/sde/sde_encoder_phys.h +0 −6 Original line number Diff line number Diff line Loading @@ -530,12 +530,6 @@ void sde_encoder_phys_setup_cdm(struct sde_encoder_phys *phys_enc, void sde_encoder_helper_get_pp_line_count(struct drm_encoder *drm_enc, struct sde_hw_pp_vsync_info *info); /** * sde_encoder_helper_needs_hw_reset - hw reset helper function * @drm_enc: Pointer to drm encoder structure */ void sde_encoder_helper_needs_hw_reset(struct drm_encoder *drm_enc); /** * sde_encoder_helper_trigger_flush - control flush helper function * This helper function may be optionally specified by physical Loading Loading
msm/sde/sde_crtc.c +4 −4 Original line number Diff line number Diff line Loading @@ -3510,7 +3510,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, struct msm_drm_private *priv; struct sde_kms *sde_kms; struct sde_crtc_state *cstate; bool is_error = false, reset_req; bool is_error = false; unsigned long flags; enum sde_crtc_idle_pc_state idle_pc_state; struct sde_encoder_kickoff_params params = { 0 }; Loading @@ -3522,7 +3522,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, dev = crtc->dev; sde_crtc = to_sde_crtc(crtc); sde_kms = _sde_crtc_get_kms(crtc); reset_req = false; if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private) { SDE_ERROR("invalid argument\n"); Loading Loading @@ -3555,7 +3554,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, params.affected_displays = _sde_crtc_get_displays_affected(crtc, crtc->state); if (sde_encoder_prepare_for_kickoff(encoder, ¶ms)) reset_req = true; sde_crtc->needs_hw_reset = true; if (idle_pc_state != IDLE_PC_NONE) sde_encoder_control_idle_pc(encoder, Loading @@ -3566,13 +3565,14 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, * Optionally attempt h/w recovery if any errors were detected while * preparing for the kickoff */ if (reset_req) { if (sde_crtc->needs_hw_reset) { sde_crtc->frame_trigger_mode = params.frame_trigger_mode; if (sde_crtc->frame_trigger_mode != FRAME_DONE_WAIT_POSTED_START && sde_crtc_reset_hw(crtc, old_state, params.recovery_events_enabled)) is_error = true; sde_crtc->needs_hw_reset = false; } sde_crtc_calc_fps(sde_crtc); Loading
msm/sde/sde_crtc.h +18 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ struct sde_crtc_misr_info { * @ltm_hist_en : flag to indicate whether LTM hist is enabled or not * @ltm_buffer_lock : muttx to protect ltm_buffers allcation and free * @ltm_lock : Spinlock to protect ltm buffer_cnt, hist_en and ltm lists * @needs_hw_reset : Initiate a hw ctl reset */ struct sde_crtc { struct drm_crtc base; Loading Loading @@ -340,6 +341,7 @@ struct sde_crtc { struct drm_msm_ltm_cfg_param ltm_cfg; struct mutex ltm_buffer_lock; spinlock_t ltm_lock; bool needs_hw_reset; }; #define to_sde_crtc(x) container_of(x, struct sde_crtc, base) Loading Loading @@ -503,6 +505,22 @@ static inline int sde_crtc_frame_pending(struct drm_crtc *crtc) return atomic_read(&sde_crtc->frame_pending); } /** * sde_crtc_set_needs_hw_reset - set hw reset flag, to handle reset during * commit kickoff * @crtc: Pointer to DRM crtc instance */ static inline void sde_crtc_set_needs_hw_reset(struct drm_crtc *crtc) { struct sde_crtc *sde_crtc; if (!crtc) return; sde_crtc = to_sde_crtc(crtc); sde_crtc->needs_hw_reset = true; } /** * sde_crtc_reset_hw - attempt hardware reset on errors * @crtc: Pointer to DRM crtc instance Loading
msm/sde/sde_encoder.c +10 −5 Original line number Diff line number Diff line Loading @@ -4689,7 +4689,7 @@ static void _sde_encoder_helper_hdr_plus_mempool_update( } } void sde_encoder_helper_needs_hw_reset(struct drm_encoder *drm_enc) void sde_encoder_needs_hw_reset(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); struct sde_encoder_phys *phys; Loading Loading @@ -4773,7 +4773,7 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc, /* if any phys needs reset, reset all phys, in-order */ if (needs_hw_reset) sde_encoder_helper_needs_hw_reset(drm_enc); sde_encoder_needs_hw_reset(drm_enc); _sde_encoder_update_master(drm_enc, params); Loading Loading @@ -4976,16 +4976,16 @@ int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc, return 0; } void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) int sde_encoder_prepare_commit(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct sde_encoder_phys *phys; int i, rc = 0; int i, rc = 0, ret = 0; struct sde_hw_ctl *ctl; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return; return -EINVAL; } sde_enc = to_sde_encoder_virt(drm_enc); Loading @@ -4999,6 +4999,9 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) if (phys && phys->ops.prepare_commit) phys->ops.prepare_commit(phys); if (phys->enable_state == SDE_ENC_ERR_NEEDS_HW_RESET) ret = -ETIMEDOUT; if (phys && phys->hw_ctl) { ctl = phys->hw_ctl; /* Loading @@ -5021,6 +5024,8 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc) sde_enc->cur_master->connector->base.id, rc); } return ret; } void sde_encoder_helper_setup_misr(struct sde_encoder_phys *phys_enc, Loading
msm/sde/sde_encoder.h +7 −1 Original line number Diff line number Diff line Loading @@ -258,7 +258,7 @@ void sde_encoder_destroy(struct drm_encoder *drm_enc); * atomic commit, before any registers are written * @drm_enc: Pointer to previously created drm encoder structure */ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc); int sde_encoder_prepare_commit(struct drm_encoder *drm_enc); /** * sde_encoder_update_caps_for_cont_splash - update encoder settings during Loading Loading @@ -342,6 +342,12 @@ void sde_encoder_control_idle_pc(struct drm_encoder *enc, bool enable); */ int sde_encoder_in_cont_splash(struct drm_encoder *enc); /** * sde_encoder_helper_hw_reset - hw reset helper function * @drm_enc: Pointer to drm encoder structure */ void sde_encoder_needs_hw_reset(struct drm_encoder *enc); /** * sde_encoder_uidle_enable - control enable/disable of uidle * @drm_enc: Pointer to drm encoder structure Loading
msm/sde/sde_encoder_phys.h +0 −6 Original line number Diff line number Diff line Loading @@ -530,12 +530,6 @@ void sde_encoder_phys_setup_cdm(struct sde_encoder_phys *phys_enc, void sde_encoder_helper_get_pp_line_count(struct drm_encoder *drm_enc, struct sde_hw_pp_vsync_info *info); /** * sde_encoder_helper_needs_hw_reset - hw reset helper function * @drm_enc: Pointer to drm encoder structure */ void sde_encoder_helper_needs_hw_reset(struct drm_encoder *drm_enc); /** * sde_encoder_helper_trigger_flush - control flush helper function * This helper function may be optionally specified by physical Loading