Loading msm/sde/sde_crtc.c +3 −0 Original line number Diff line number Diff line Loading @@ -3740,6 +3740,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, idle_pc_state = sde_crtc_get_property(cstate, CRTC_PROP_IDLE_PC_STATE); sde_crtc->kickoff_in_progress = true; list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { if (encoder->crtc != crtc) continue; Loading Loading @@ -3801,6 +3802,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, sde_encoder_kickoff(encoder, false, true); } sde_crtc->kickoff_in_progress = false; /* store the event after frame trigger */ if (sde_crtc->event) { Loading Loading @@ -6595,6 +6597,7 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane) atomic_set(&sde_crtc->frame_pending, 0); sde_crtc->enabled = false; sde_crtc->kickoff_in_progress = false; /* Below parameters are for fps calculation for sysfs node */ sde_crtc->fps_info.fps_periodic_duration = DEFAULT_FPS_PERIOD_1_SEC; Loading msm/sde/sde_crtc.h +2 −0 Original line number Diff line number Diff line Loading @@ -257,6 +257,7 @@ struct sde_crtc_misr_info { * @ad_active : list containing ad properties that are active * @crtc_lock : crtc lock around create, destroy and access. * @frame_pending : Whether or not an update is pending * @kickoff_in_progress : boolean entry to check if kickoff is in progress * @frame_events : static allocation of in-flight frame events * @frame_event_list : available frame event list * @spin_lock : spin lock for transaction status, etc... Loading Loading @@ -344,6 +345,7 @@ struct sde_crtc { struct list_head frame_event_list; spinlock_t spin_lock; spinlock_t fevent_spin_lock; bool kickoff_in_progress; /* for handling internal event thread */ struct sde_crtc_event event_cache[SDE_CRTC_MAX_EVENT_COUNT]; Loading msm/sde/sde_encoder.c +2 −1 Original line number Diff line number Diff line Loading @@ -1920,7 +1920,8 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); goto end; } else if (sde_crtc_frame_pending(sde_enc->crtc)) { } else if (sde_crtc_frame_pending(sde_enc->crtc) || sde_crtc->kickoff_in_progress) { SDE_DEBUG_ENC(sde_enc, "skip idle entry"); SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, sde_crtc_frame_pending(sde_enc->crtc), Loading Loading
msm/sde/sde_crtc.c +3 −0 Original line number Diff line number Diff line Loading @@ -3740,6 +3740,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, idle_pc_state = sde_crtc_get_property(cstate, CRTC_PROP_IDLE_PC_STATE); sde_crtc->kickoff_in_progress = true; list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { if (encoder->crtc != crtc) continue; Loading Loading @@ -3801,6 +3802,7 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc, sde_encoder_kickoff(encoder, false, true); } sde_crtc->kickoff_in_progress = false; /* store the event after frame trigger */ if (sde_crtc->event) { Loading Loading @@ -6595,6 +6597,7 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane) atomic_set(&sde_crtc->frame_pending, 0); sde_crtc->enabled = false; sde_crtc->kickoff_in_progress = false; /* Below parameters are for fps calculation for sysfs node */ sde_crtc->fps_info.fps_periodic_duration = DEFAULT_FPS_PERIOD_1_SEC; Loading
msm/sde/sde_crtc.h +2 −0 Original line number Diff line number Diff line Loading @@ -257,6 +257,7 @@ struct sde_crtc_misr_info { * @ad_active : list containing ad properties that are active * @crtc_lock : crtc lock around create, destroy and access. * @frame_pending : Whether or not an update is pending * @kickoff_in_progress : boolean entry to check if kickoff is in progress * @frame_events : static allocation of in-flight frame events * @frame_event_list : available frame event list * @spin_lock : spin lock for transaction status, etc... Loading Loading @@ -344,6 +345,7 @@ struct sde_crtc { struct list_head frame_event_list; spinlock_t spin_lock; spinlock_t fevent_spin_lock; bool kickoff_in_progress; /* for handling internal event thread */ struct sde_crtc_event event_cache[SDE_CRTC_MAX_EVENT_COUNT]; Loading
msm/sde/sde_encoder.c +2 −1 Original line number Diff line number Diff line Loading @@ -1920,7 +1920,8 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); goto end; } else if (sde_crtc_frame_pending(sde_enc->crtc)) { } else if (sde_crtc_frame_pending(sde_enc->crtc) || sde_crtc->kickoff_in_progress) { SDE_DEBUG_ENC(sde_enc, "skip idle entry"); SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, sde_crtc_frame_pending(sde_enc->crtc), Loading