diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 0183fa0461ee..bc81d1abd017 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -227,7 +227,8 @@ enum sde_enc_rc_states { * @elevated_ahb_vote: increase AHB bus speed for the first frame * after power collapse * @pm_qos_cpu_req: pm_qos request for cpu frequency - * @mode_info: stores the current mode information + * @mode_info: stores the current mode and should be used + * only in commit phase */ struct sde_encoder_virt { struct drm_encoder base; @@ -658,6 +659,7 @@ void sde_encoder_get_hw_resources(struct drm_encoder *drm_enc, struct drm_connector_state *conn_state) { struct sde_encoder_virt *sde_enc = NULL; + struct msm_mode_info mode_info; int i = 0; if (!hw_res || !drm_enc || !conn_state) { @@ -680,8 +682,13 @@ void sde_encoder_get_hw_resources(struct drm_encoder *drm_enc, phys->ops.get_hw_resources(phys, hw_res, conn_state); } - sde_connector_get_mode_info(conn_state, &sde_enc->mode_info); - hw_res->topology = sde_enc->mode_info.topology; + /* + * NOTE: Do not use sde_encoder_get_mode_info here as this function is + * called from atomic_check phase. Use the below API to get mode + * information of the temporary conn_state passed + */ + sde_connector_get_mode_info(conn_state, &mode_info); + hw_res->topology = mode_info.topology; hw_res->display_type = sde_enc->disp_info.display_type; } @@ -2760,8 +2767,6 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, struct sde_kms *sde_kms; struct list_head *connector_list; struct drm_connector *conn = NULL, *conn_iter; - struct sde_connector_state *sde_conn_state = NULL; - struct sde_connector *sde_conn = NULL; struct sde_rm_hw_iter dsc_iter, pp_iter, qdss_iter; struct sde_rm_hw_request request_hw; enum sde_intf_mode intf_mode; @@ -2812,21 +2817,11 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, return; } - sde_conn = to_sde_connector(conn); - sde_conn_state = to_sde_connector_state(conn->state); - if (sde_conn && sde_conn_state) { - ret = sde_conn->ops.get_mode_info(&sde_conn->base, adj_mode, - &sde_conn_state->mode_info, - sde_kms->catalog->max_mixer_width, - sde_conn->display); - if (ret) { - SDE_ERROR_ENC(sde_enc, - "failed to get mode info from the display\n"); - return; - } - } intf_mode = sde_encoder_get_intf_mode(drm_enc); + /* store the mode_info */ + sde_connector_get_mode_info(conn->state, &sde_enc->mode_info); + /* release resources before seamless mode change */ if (msm_is_mode_seamless_dms(adj_mode) || (msm_is_mode_seamless_dyn_clk(adj_mode) &&