Merge "disp: msm: sde: switch rsc state before CTL_PREPARE in dual display"

This commit is contained in:
qctecmdr 2021-09-24 05:41:33 -07:00 • committed by Gerrit - the friendly Code Review server
commit 46726a0d62
3 changed files with 47 additions and 0 deletions

View file

@ -3303,6 +3303,7 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
if (encoder->crtc != crtc)
continue;
sde_encoder_trigger_rsc_state_change(encoder);
/* encoder will trigger pending mask now */
sde_encoder_trigger_kickoff_pending(encoder);
}

View file

@ -3806,6 +3806,46 @@ bool sde_encoder_check_curr_mode(struct drm_encoder *drm_enc, u32 mode)
return (disp_info->curr_panel_mode == mode);
}
void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc = NULL;
int ret = 0;
sde_enc = to_sde_encoder_virt(drm_enc);
if (!sde_enc)
return;
mutex_lock(&sde_enc->rc_lock);
/*
* In dual display case when secondary comes out of
* idle make sure RSC solver mode is disabled before
* setting CTL_PREPARE.
*/
if (!sde_enc->cur_master ||
!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE) ||
sde_enc->disp_info.display_type == SDE_CONNECTOR_PRIMARY ||
sde_enc->rc_state != SDE_ENC_RC_STATE_IDLE)
goto end;
/* enable all the clks and resources */
ret = _sde_encoder_resource_control_helper(drm_enc, true);
if (ret) {
SDE_ERROR_ENC(sde_enc, "rc in state %d\n", sde_enc->rc_state);
SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_EVTLOG_ERROR);
goto end;
}
_sde_encoder_update_rsc_client(drm_enc, true);
SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_ENC_RC_STATE_ON);
sde_enc->rc_state = SDE_ENC_RC_STATE_ON;
end:
mutex_unlock(&sde_enc->rc_lock);
}
void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc;

View file

@ -275,6 +275,12 @@ void sde_encoder_get_hw_resources(struct drm_encoder *encoder,
struct sde_encoder_hw_resources *hw_res,
struct drm_connector_state *conn_state);
/**
* sde_encoder_trigger_rsc_state_change - rsc state change.
* @encoder: encoder pointer
*/
void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc);
/**
* sde_encoder_early_wakeup - early wake up display
* @encoder: encoder pointer