diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index 1b83ddf227..11074df7f5 100644 --- a/msm/dsi/dsi_defs.h +++ b/msm/dsi/dsi_defs.h @@ -611,6 +611,7 @@ struct dsi_host_config { * @mdp_transfer_time_us: Specifies the mdp transfer time for command mode * panels in microseconds. * @dsi_transfer_time_us: Specifies the dsi transfer time for cmd panels. + * @qsync_min_fps: Qsync min fps value for the mode * @clk_rate_hz: DSI bit clock per lane in hz. * @min_dsi_clk_hz: Min dsi clk per lane to transfer frame in vsync time. * @bit_clk_list: List of dynamic bit clock rates supported. @@ -636,6 +637,7 @@ struct dsi_display_mode_priv_info { u32 panel_prefill_lines; u32 mdp_transfer_time_us; u32 dsi_transfer_time_us; + u32 qsync_min_fps; u64 clk_rate_hz; u64 min_dsi_clk_hz; struct msm_dyn_clk_list bit_clk_list; diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 140d318ab2..8fd6ad416a 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6978,6 +6978,11 @@ int dsi_display_get_modes(struct dsi_display *display, if (!sub_mode->timing.qsync_min_fps && qsync_caps->qsync_min_fps) sub_mode->timing.qsync_min_fps = qsync_caps->qsync_min_fps; + /* + * Qsync min fps for the mode will be populated in the timing info + * in dsi_panel_get_mode function. + */ + sub_mode->priv_info->qsync_min_fps = sub_mode->timing.qsync_min_fps; if (!dfps_caps.dfps_support || !support_video_mode) continue; @@ -6986,8 +6991,10 @@ int dsi_display_get_modes(struct dsi_display *display, sub_mode->timing.refresh_rate = dfps_caps.dfps_list[i]; /* Override with qsync min fps list in dfps usecases */ - if (qsync_caps->qsync_min_fps && qsync_caps->qsync_min_fps_list_len) + if (qsync_caps->qsync_min_fps && qsync_caps->qsync_min_fps_list_len) { sub_mode->timing.qsync_min_fps = qsync_caps->qsync_min_fps_list[i]; + sub_mode->priv_info->qsync_min_fps = sub_mode->timing.qsync_min_fps; + } dsi_display_get_dfps_timing(display, sub_mode, curr_refresh_rate); diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index 1e21eadbae..52b2ac9626 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -706,30 +706,21 @@ int dsi_conn_set_avr_step_info(struct dsi_panel *panel, void *info) return 0; } -int dsi_conn_get_qsync_min_fps(void *display_dsi, struct drm_connector_state *conn_state) +int dsi_conn_get_qsync_min_fps(struct drm_connector_state *conn_state) { - struct dsi_display *display = (struct dsi_display *)display_dsi; - int rc = 0; - struct dsi_display_mode partial_dsi_mode, *dsi_mode; - struct msm_sub_mode new_sub_mode; - struct sde_connector_state *sde_conn_state; - struct drm_display_mode *drm_mode; + struct sde_connector_state *sde_conn_state = to_sde_connector_state(conn_state); + struct msm_display_mode *msm_mode; + struct dsi_display_mode_priv_info *priv_info; - if (!display || !display->drm_conn || !conn_state) + if (!sde_conn_state) return -EINVAL; - sde_conn_state = to_sde_connector_state(conn_state); - drm_mode = sde_conn_state->msm_mode.base; - convert_to_dsi_mode(drm_mode, &partial_dsi_mode); - new_sub_mode.dsc_mode = sde_connector_get_property(conn_state, CONNECTOR_PROP_DSC_MODE); + msm_mode = &sde_conn_state->msm_mode; + if (!msm_mode || !msm_mode->private) + return -EINVAL; - rc = dsi_display_find_mode(display, &partial_dsi_mode, &new_sub_mode, &dsi_mode); - if (rc) { - DSI_ERR("invalid mode\n"); - return rc; - } - - return dsi_mode->timing.qsync_min_fps; + priv_info = (struct dsi_display_mode_priv_info *)(msm_mode->private); + return priv_info->qsync_min_fps; } int dsi_conn_set_info_blob(struct drm_connector *connector, diff --git a/msm/dsi/dsi_drm.h b/msm/dsi/dsi_drm.h index e2016d293a..98ee1941d5 100644 --- a/msm/dsi/dsi_drm.h +++ b/msm/dsi/dsi_drm.h @@ -174,10 +174,9 @@ void dsi_conn_set_submode_blob_info(struct drm_connector *conn, /** * dsi_conn_get_qsync_min_fps() - get qsync min fps for given fps - * @display: Handle to display. * @conn_state: Pointer to drm_connector_state structure * * Return: Qsync min fps rate or -ve error code. */ -int dsi_conn_get_qsync_min_fps(void *dsi_display, struct drm_connector_state *conn_state); +int dsi_conn_get_qsync_min_fps(struct drm_connector_state *conn_state); #endif /* _DSI_DRM_H_ */ diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h index e35e5247b3..2a68a0cb59 100644 --- a/msm/sde/sde_connector.h +++ b/msm/sde/sde_connector.h @@ -399,11 +399,10 @@ struct sde_connector_ops { /** * get_qsync_min_fps - Get qsync min fps from qsync-min-fps-list - * @display: Pointer to private display structure * @conn_state: Pointer to drm_connector_state structure * Returns: Qsync min fps value on success */ - int (*get_qsync_min_fps)(void *display, struct drm_connector_state *conn_state); + int (*get_qsync_min_fps)(struct drm_connector_state *conn_state); /** * get_avr_step_req - Get the required avr_step for given fps rate diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index f255969246..922431d521 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1053,7 +1053,7 @@ static void _sde_encoder_get_qsync_fps_callback(struct drm_encoder *drm_enc, sde_conn = to_sde_connector(sde_enc->cur_master->connector); if (sde_conn->ops.get_qsync_min_fps) - rc = sde_conn->ops.get_qsync_min_fps(sde_conn->display, conn_state); + rc = sde_conn->ops.get_qsync_min_fps(conn_state); if (rc < 0) { SDE_ERROR("invalid qsync min fps %d\n", rc);