فهرست منبع

disp: msm: sde: disable solver for autorefresh disable transition

RSC Solver enable during autorefresh enable need to be avoided.
Currently in SDE driver, solver is disabled if autorefresh is
enabled from HLOS client but autorefresh disable transition is not
considered. This change avoids RSC solver mode in autorefresh
disable transition commit including splash hand-off.

Change-Id: Ib1c4791b203892629abdd84999671830a61f6ed0
Signed-off-by: Prabhanjan Kandula <[email protected]>
Signed-off-by: GG Hou <[email protected]>
Prabhanjan Kandula 1 سال پیش
والد
کامیت
1bd779a0da
3فایلهای تغییر یافته به همراه18 افزوده شده و 2 حذف شده
  1. 6 0
      msm/sde/sde_encoder.c
  2. 2 0
      msm/sde/sde_encoder_phys.h
  3. 10 2
      msm/sde/sde_encoder_phys_cmd.c

+ 6 - 0
msm/sde/sde_encoder.c

@@ -1816,6 +1816,12 @@ static int _sde_encoder_update_rsc_client(
 				sde_enc->cur_master->connector);
 		sde_enc->autorefresh_solver_disable =
 			 _sde_encoder_is_autorefresh_enabled(sde_enc) ? true : false;
+
+		if (sde_enc->cur_master->ops.is_autoref_disable_pending)
+			sde_enc->autorefresh_solver_disable =
+				(sde_enc->autorefresh_solver_disable ||
+				 sde_enc->cur_master->ops.is_autoref_disable_pending(
+					 sde_enc->cur_master));
 	}
 
 	/* left primary encoder keep vote */

+ 2 - 0
msm/sde/sde_encoder_phys.h

@@ -144,6 +144,7 @@ struct sde_encoder_virt_ops {
  * @restore:			Restore all the encoder configs.
  * @is_autorefresh_enabled:	provides the autorefresh current
  *                              enable/disable state.
+ * @is_autoref_disable_pending:	Indicates if autorefresh disable commit in progress
  * @get_line_count:		Obtain current internal vertical line count
  * @wait_dma_trigger:		Returns true if lut dma has to trigger and wait
  *                              unitl transaction is complete.
@@ -202,6 +203,7 @@ struct sde_encoder_phys_ops {
 	void (*control_te)(struct sde_encoder_phys *phys_enc, bool enable);
 	void (*restore)(struct sde_encoder_phys *phys);
 	bool (*is_autorefresh_enabled)(struct sde_encoder_phys *phys);
+	bool (*is_autoref_disable_pending)(struct sde_encoder_phys *phys);
 	int (*get_line_count)(struct sde_encoder_phys *phys);
 	bool (*wait_dma_trigger)(struct sde_encoder_phys *phys);
 	int (*wait_for_active)(struct sde_encoder_phys *phys);

+ 10 - 2
msm/sde/sde_encoder_phys_cmd.c

@@ -114,6 +114,14 @@ static void _sde_encoder_phys_cmd_config_autorefresh(
 		hw_pp->ops.setup_autorefresh(hw_pp, cfg_cur);
 }
 
+static bool sde_encoder_phys_cmd_is_autoref_disable_pending(struct sde_encoder_phys *phys_enc)
+{
+	if (!phys_enc)
+		return true;
+
+	return phys_enc->autorefresh_disable_trans;
+}
+
 static void _sde_encoder_phys_cmd_update_flush_mask(
 		struct sde_encoder_phys *phys_enc)
 {
@@ -2540,8 +2548,8 @@ static void sde_encoder_phys_cmd_init_ops(struct sde_encoder_phys_ops *ops)
 	ops->update_split_role = sde_encoder_phys_cmd_update_split_role;
 	ops->restore = sde_encoder_phys_cmd_enable_helper;
 	ops->control_te = sde_encoder_phys_cmd_connect_te;
-	ops->is_autorefresh_enabled =
-			sde_encoder_phys_cmd_is_autorefresh_enabled;
+	ops->is_autorefresh_enabled = sde_encoder_phys_cmd_is_autorefresh_enabled;
+	ops->is_autoref_disable_pending = sde_encoder_phys_cmd_is_autoref_disable_pending;
 	ops->get_line_count = sde_encoder_phys_cmd_te_get_line_count;
 	ops->wait_for_active = NULL;
 	ops->setup_vsync_source = sde_encoder_phys_cmd_setup_vsync_source;