Explorar el Código

disp: msm: sde: move EPT delay from prepare_for_kickoff

Move Expected Preset Time delay from prepare_for_kickoff phase to
just before encoder kickoff. This will ensure the delay is done
towards the end of frame trigger and keeps minimal s/w programming
after the delay. This will help in cases where other unexpected
system delays occur, while coming out of sleep.

Change-Id: Ia04a9ab0455db8082b3f9f03d02db2cec5e17db5
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran hace 2 años
padre
commit
a086d338bf
Se han modificado 1 ficheros con 7 adiciones y 3 borrados
  1. 7 3
      msm/sde/sde_encoder.c

+ 7 - 3
msm/sde/sde_encoder.c

@@ -79,6 +79,9 @@
 /* Maximum number of VSYNC wait attempts for RSC state transition */
 #define MAX_RSC_WAIT	5
 
+/* Worst case time required for trigger the frame after the EPT wait */
+#define EPT_BACKOFF_THRESHOLD	(3 * NSEC_PER_MSEC)
+
 #define IS_ROI_UPDATED(a, b) (a.x1 != b.x1 || a.x2 != b.x2 || \
 			a.y1 != b.y1 || a.y2 != b.y2)
 
@@ -5083,7 +5086,7 @@ void _sde_encoder_delay_kickoff_processing(struct sde_encoder_virt *sde_enc)
 	current_ts = ktime_get_ns();
 	/* ept is in ns and avr_step is mulitple of refresh rate */
 	ept_ts = avr_step_fps ? ept - DIV_ROUND_UP(NSEC_PER_SEC, avr_step_fps) + NSEC_PER_MSEC
-				: ept - (2 * NSEC_PER_MSEC);
+				: ept - EPT_BACKOFF_THRESHOLD;
 
 	/* ept time already elapsed */
 	if (ept_ts <= current_ts) {
@@ -5182,8 +5185,6 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc,
 		goto end;
 	}
 
-	_sde_encoder_delay_kickoff_processing(sde_enc);
-
 	ret = _sde_encoder_prepare_for_kickoff_processing(drm_enc, params, sde_enc, sde_kms,
 			needs_hw_reset, is_cmd_mode);
 
@@ -5230,6 +5231,9 @@ void sde_encoder_kickoff(struct drm_encoder *drm_enc, bool config_changed)
 	if (sde_enc->cur_master)
 		_sde_encoder_update_retire_txq(sde_enc->cur_master, sde_kms);
 
+	/* delay frame kickoff based on expected present time */
+	_sde_encoder_delay_kickoff_processing(sde_enc);
+
 	/* All phys encs are ready to go, trigger the kickoff */
 	_sde_encoder_kickoff_phys(sde_enc, config_changed);