Loading drivers/gpu/drm/msm/sde/sde_crtc.c +33 −3 Original line number Diff line number Diff line Loading @@ -1516,6 +1516,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) struct sde_crtc *sde_crtc; struct sde_crtc_state *cstate; struct sde_kms *sde_kms; struct drm_encoder *encoder; unsigned long flags; if (!work) { Loading Loading @@ -1569,8 +1570,26 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) } if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE || (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR)) (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR)) { bool signal_fence = true; drm_for_each_encoder(encoder, crtc->dev) { if (encoder->crtc != crtc) continue; signal_fence &= sde_encoder_is_cmd_mode(encoder); } /* signal release fence only for cmd mode panels here */ if (signal_fence) { sde_fence_signal(&sde_crtc->output_fence, 0); SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event, SDE_EVTLOG_FUNC_CASE4); } complete_all(&sde_crtc->frame_done_comp); } if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE) sde_core_perf_crtc_update(crtc, 0, false); Loading Loading @@ -1635,7 +1654,9 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, { struct sde_crtc *sde_crtc; struct sde_crtc_state *cstate; struct drm_encoder *encoder; int i; bool signal_fence = true; if (!crtc || !crtc->state) { SDE_ERROR("invalid crtc\n"); Loading @@ -1646,9 +1667,18 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, cstate = to_sde_crtc_state(crtc->state); SDE_EVT32_VERBOSE(DRMID(crtc)); /* signal output fence(s) at end of commit */ drm_for_each_encoder(encoder, crtc->dev) { if (encoder->crtc != crtc) continue; signal_fence &= !sde_encoder_is_cmd_mode(encoder); } /* signal release fence for non-cmd mode panels */ if (signal_fence) sde_fence_signal(&sde_crtc->output_fence, 0); /* signal retire fence */ for (i = 0; i < cstate->num_connectors; ++i) sde_connector_complete_commit(cstate->connectors[i]); } Loading drivers/gpu/drm/msm/sde/sde_encoder.c +16 −0 Original line number Diff line number Diff line Loading @@ -2214,6 +2214,22 @@ static void _sde_encoder_update_master(struct drm_encoder *drm_enc, } } bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return false; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; return (disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE); } void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; Loading drivers/gpu/drm/msm/sde/sde_encoder.h +7 −0 Original line number Diff line number Diff line Loading @@ -172,6 +172,13 @@ bool sde_encoder_is_dsc_enabled(struct drm_encoder *drm_enc); */ bool sde_encoder_is_dsc_merge(struct drm_encoder *drm_enc); /** * sde_encoder_is_cmd_mode - check if it is cmd mode * @drm_enc: Pointer to drm encoder object * @Return: true if it is cmd mode */ bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc); /** * sde_encoder_init - initialize virtual encoder object * @dev: Pointer to drm device structure Loading Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +33 −3 Original line number Diff line number Diff line Loading @@ -1516,6 +1516,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) struct sde_crtc *sde_crtc; struct sde_crtc_state *cstate; struct sde_kms *sde_kms; struct drm_encoder *encoder; unsigned long flags; if (!work) { Loading Loading @@ -1569,8 +1570,26 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) } if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE || (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR)) (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR)) { bool signal_fence = true; drm_for_each_encoder(encoder, crtc->dev) { if (encoder->crtc != crtc) continue; signal_fence &= sde_encoder_is_cmd_mode(encoder); } /* signal release fence only for cmd mode panels here */ if (signal_fence) { sde_fence_signal(&sde_crtc->output_fence, 0); SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event, SDE_EVTLOG_FUNC_CASE4); } complete_all(&sde_crtc->frame_done_comp); } if (fevent->event == SDE_ENCODER_FRAME_EVENT_DONE) sde_core_perf_crtc_update(crtc, 0, false); Loading Loading @@ -1635,7 +1654,9 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, { struct sde_crtc *sde_crtc; struct sde_crtc_state *cstate; struct drm_encoder *encoder; int i; bool signal_fence = true; if (!crtc || !crtc->state) { SDE_ERROR("invalid crtc\n"); Loading @@ -1646,9 +1667,18 @@ void sde_crtc_complete_commit(struct drm_crtc *crtc, cstate = to_sde_crtc_state(crtc->state); SDE_EVT32_VERBOSE(DRMID(crtc)); /* signal output fence(s) at end of commit */ drm_for_each_encoder(encoder, crtc->dev) { if (encoder->crtc != crtc) continue; signal_fence &= !sde_encoder_is_cmd_mode(encoder); } /* signal release fence for non-cmd mode panels */ if (signal_fence) sde_fence_signal(&sde_crtc->output_fence, 0); /* signal retire fence */ for (i = 0; i < cstate->num_connectors; ++i) sde_connector_complete_commit(cstate->connectors[i]); } Loading
drivers/gpu/drm/msm/sde/sde_encoder.c +16 −0 Original line number Diff line number Diff line Loading @@ -2214,6 +2214,22 @@ static void _sde_encoder_update_master(struct drm_encoder *drm_enc, } } bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return false; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; return (disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE); } void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; Loading
drivers/gpu/drm/msm/sde/sde_encoder.h +7 −0 Original line number Diff line number Diff line Loading @@ -172,6 +172,13 @@ bool sde_encoder_is_dsc_enabled(struct drm_encoder *drm_enc); */ bool sde_encoder_is_dsc_merge(struct drm_encoder *drm_enc); /** * sde_encoder_is_cmd_mode - check if it is cmd mode * @drm_enc: Pointer to drm encoder object * @Return: true if it is cmd mode */ bool sde_encoder_is_cmd_mode(struct drm_encoder *drm_enc); /** * sde_encoder_init - initialize virtual encoder object * @dev: Pointer to drm device structure Loading