Browse Source

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 <[email protected]>
Yashwanth 3 years ago
parent
commit
6619470eb6
6 changed files with 23 additions and 25 deletions
  1. 2 0
      msm/dsi/dsi_defs.h
  2. 8 1
      msm/dsi/dsi_display.c
  3. 10 19
      msm/dsi/dsi_drm.c
  4. 1 2
      msm/dsi/dsi_drm.h
  5. 1 2
      msm/sde/sde_connector.h
  6. 1 1
      msm/sde/sde_encoder.c

+ 2 - 0
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;

+ 8 - 1
msm/dsi/dsi_display.c

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

+ 10 - 19
msm/dsi/dsi_drm.c

@@ -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);
-
-	rc = dsi_display_find_mode(display, &partial_dsi_mode, &new_sub_mode, &dsi_mode);
-	if (rc) {
-		DSI_ERR("invalid mode\n");
-		return rc;
-	}
+	msm_mode = &sde_conn_state->msm_mode;
+	if (!msm_mode || !msm_mode->private)
+		return -EINVAL;
 
-	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,

+ 1 - 2
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_ */

+ 1 - 2
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

+ 1 - 1
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);