disp: msm: dsi: add qsync min fps val in dsi display mode priv info

In the current code for finding the qsync min fps for a
mode, entire mode list is iterated which involves acquiring
dsi display_lock. During conn tx debugfs commands, if
qsync min fps is required, we try to acquire dsi
display_lock twice which results in hang state. This change
adds qsync min fps value in dsi_display_mode_priv_info
struct in order to get the qsync fps from the
msm_display_mode present in connector state instead of
looping through all the modes to find the mode qsync fps.

Change-Id: Ifded40d1f12462bb50fc7bdafb746ae5b8d9512a
Signed-off-by: Yashwanth <yvulapu@codeaurora.org>
This commit is contained in:
Yashwanth
2021-09-13 09:42:13 +05:30
szülő 0f0c5990ca
commit 6619470eb6
6 fájl változott, egészen pontosan 23 új sor hozzáadva és 25 régi sor törölve

Fájl megtekintése

@@ -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;

Fájl megtekintése

@@ -6969,6 +6969,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;
@@ -6977,8 +6982,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);

Fájl megtekintése

@@ -700,30 +700,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,

Fájl megtekintése

@@ -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_ */

Fájl megtekintése

@@ -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

Fájl megtekintése

@@ -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);