disp: msm: sde: fix autorefresh enable/disable sequence

SDE RSCC solver state and autorefresh enable concurrency
is not supported. This change moves the rscc solver state
to disable to avoid concurrency. It also resets the autorefresh
software structure state when encoder is disabled. This allows
autorefresh reconfiguration with next encoder enable.

Change-Id: Idb8c722c823d9f46d3cd03e1b046da69c8d88fc4
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
This commit is contained in:
Dhaval Patel
2021-04-20 15:14:08 -07:00
committed by Gerrit - the friendly Code Review server
parent 8a3abf2cdf
commit a698dbe5aa
3 changed files with 21 additions and 12 deletions

View File

@@ -1483,9 +1483,12 @@ static int _sde_encoder_update_rsc_client(
* secondary command mode panel.
* Clone mode encoder can request CLK STATE only.
*/
if (sde_enc->cur_master)
if (sde_enc->cur_master) {
qsync_mode = sde_connector_get_qsync_mode(
sde_enc->cur_master->connector);
sde_enc->autorefresh_solver_disable =
_sde_encoder_is_autorefresh_enabled(sde_enc) ? true : false;
}
/* left primary encoder keep vote */
if (sde_encoder_in_clone_mode(drm_enc)) {
@@ -1494,7 +1497,8 @@ static int _sde_encoder_update_rsc_client(
}
if ((disp_info->display_type != SDE_CONNECTOR_PRIMARY) ||
(disp_info->display_type && qsync_mode))
(disp_info->display_type && qsync_mode) ||
sde_enc->autorefresh_solver_disable)
rsc_state = enable ? SDE_RSC_CLK_STATE : SDE_RSC_IDLE_STATE;
else if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
rsc_state = enable ? SDE_RSC_CMD_STATE : SDE_RSC_IDLE_STATE;
@@ -4235,16 +4239,16 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc,
if (sde_enc->cur_master &&
sde_connector_is_qsync_updated(
sde_enc->cur_master->connector)) {
sde_enc->cur_master->connector))
_helper_flush_qsync(phys);
if (is_cmd_mode)
_sde_encoder_update_rsc_client(drm_enc,
true);
}
}
}
if (is_cmd_mode && sde_enc->cur_master &&
(sde_connector_is_qsync_updated(sde_enc->cur_master->connector) ||
_sde_encoder_is_autorefresh_enabled(sde_enc)))
_sde_encoder_update_rsc_client(drm_enc, true);
rc = sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_KICKOFF);
if (rc) {
SDE_ERROR_ENC(sde_enc, "resource kickoff failed rc %d\n", rc);
@@ -4373,6 +4377,10 @@ void sde_encoder_kickoff(struct drm_encoder *drm_enc, bool is_error,
phys->ops.handle_post_kickoff(phys);
}
if (sde_enc->autorefresh_solver_disable &&
!_sde_encoder_is_autorefresh_enabled(sde_enc))
_sde_encoder_update_rsc_client(drm_enc, true);
SDE_ATRACE_END("encoder_kickoff");
}