disp: msm: add support for seamless dsc switch

This change adds logic to determine dsc switch based on
the connector property "CONNECTOR_PROP_DSC_MODE" and
performs seamless DSC switch if there is any change in
DSC configuration. The connector property is populated
in msm_sub_mode based on which suitable mode is selected.

Change-Id: Ifc4931f16dfb814781bc1d72b103e09103e6bfee
Signed-off-by: Yashwanth <yvulapu@codeaurora.org>
This commit is contained in:
Yashwanth
2021-04-26 13:37:48 +05:30
committed by Gerrit - the friendly Code Review server
parent ffc7cdbe08
commit 7e03fb61fd
17 changed files with 156 additions and 36 deletions

View File

@@ -933,12 +933,15 @@ static int _sde_encoder_atomic_check_reserve(struct drm_encoder *drm_enc,
{
int ret = 0;
struct drm_display_mode *adj_mode = &crtc_state->adjusted_mode;
struct msm_sub_mode sub_mode;
if (sde_conn && msm_atomic_needs_modeset(crtc_state, conn_state)) {
struct msm_display_topology *topology = NULL;
sub_mode.dsc_mode = sde_connector_get_property(conn_state,
CONNECTOR_PROP_DSC_MODE);
ret = sde_connector_get_mode_info(&sde_conn->base,
adj_mode, &sde_conn_state->mode_info);
adj_mode, &sub_mode, &sde_conn_state->mode_info);
if (ret) {
SDE_ERROR_ENC(sde_enc,
"failed to get mode info, rc = %d\n", ret);
@@ -5432,6 +5435,7 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
struct sde_encoder_phys *phys_enc;
struct drm_bridge *bridge;
int ret = 0, i;
struct msm_sub_mode sub_mode;
if (!encoder) {
SDE_ERROR("invalid drm enc\n");
@@ -5497,9 +5501,11 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
return -EINVAL;
}
sub_mode.dsc_mode = splash_display->dsc_cnt ? MSM_DISPLAY_DSC_MODE_ENABLED :
MSM_DISPLAY_DSC_MODE_DISABLED;
drm_mode = &encoder->crtc->state->adjusted_mode;
ret = sde_connector_get_mode_info(&sde_conn->base,
drm_mode, &sde_conn_state->mode_info);
drm_mode, &sub_mode, &sde_conn_state->mode_info);
if (ret) {
SDE_ERROR_ENC(sde_enc,
"conn: ->get_mode_info failed. ret=%d\n", ret);
@@ -5647,3 +5653,24 @@ void sde_encoder_enable_recovery_event(struct drm_encoder *encoder)
sde_enc = to_sde_encoder_virt(encoder);
sde_enc->recovery_events_enabled = true;
}
bool sde_encoder_needs_dsc_disable(struct drm_encoder *drm_enc)
{
struct sde_kms *sde_kms;
struct drm_connector *conn;
struct sde_connector_state *conn_state;
if (!drm_enc)
return false;
sde_kms = sde_encoder_get_kms(drm_enc);
if (!sde_kms)
return false;
conn = sde_encoder_get_connector(sde_kms->dev, drm_enc);
if (!conn || !conn->state)
return false;
conn_state = to_sde_connector_state(conn->state);
return TOPOLOGY_DSC_MODE(conn_state->old_topology_name);
}