Browse Source

disp: msm: sde: fix min fps in EPT calculations

In non-qsync panels when min FPS is not published in DT,
the default min fps is set to 10 FPS. This change handles mode
switch cases, when panel FPS drops below 10 FPS by updating
min FPS to panel FPS for Expected Present Time calculations.
As part of the change, reduce 2ms from EPT to account for
scheduling delays after schedule_timeout.

Change-Id: Idc206f39adfb3517b4ea2cfa303fe53182a8e63e
Signed-off-by: Shamika Joshi <[email protected]>
Shamika Joshi 2 năm trước cách đây
mục cha
commit
42d9137a04
1 tập tin đã thay đổi với 9 bổ sung4 xóa
  1. 9 4
      msm/sde/sde_encoder.c

+ 9 - 4
msm/sde/sde_encoder.c

@@ -4748,9 +4748,10 @@ static int _sde_encoder_prepare_for_kickoff_processing(struct drm_encoder *drm_e
 void _sde_encoder_delay_kickoff_processing(struct sde_encoder_virt *sde_enc)
 {
 	ktime_t current_ts, ept_ts;
-	u32 avr_step_fps, min_fps = 0, qsync_mode;
+	u32 avr_step_fps, min_fps = 0, qsync_mode, fps;
 	u64 timeout_us = 0, ept;
 	bool is_cmd_mode;
+	char atrace_buf[64];
 	struct drm_connector *drm_conn;
 	struct msm_mode_info *info = &sde_enc->mode_info;
 	struct sde_kms *sde_kms = sde_encoder_get_kms(&sde_enc->base);
@@ -4768,6 +4769,9 @@ void _sde_encoder_delay_kickoff_processing(struct sde_encoder_virt *sde_enc)
 		_sde_encoder_get_qsync_fps_callback(&sde_enc->base, &min_fps, drm_conn->state);
 	/* use min qsync fps, if feature is enabled; otherwise min default fps */
 	min_fps = min_fps ? min_fps : DEFAULT_MIN_FPS;
+	fps = sde_encoder_get_fps(&sde_enc->base);
+	min_fps = min(min_fps, fps);
+
 	is_cmd_mode = sde_encoder_check_curr_mode(&sde_enc->base, MSM_DISPLAY_CMD_MODE);
 
 	/* for cmd mode with qsync - EPT_FPS will be used to delay the processing */
@@ -4782,7 +4786,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 - NSEC_PER_MSEC;
+				: ept - (2 * NSEC_PER_MSEC);
 
 	/* ept time already elapsed */
 	if (ept_ts <= current_ts) {
@@ -4799,9 +4803,10 @@ void _sde_encoder_delay_kickoff_processing(struct sde_encoder_virt *sde_enc)
 		return;
 	}
 
-	SDE_ATRACE_BEGIN("schedule_timeout");
+	snprintf(atrace_buf, sizeof(atrace_buf), "schedule_timeout_%llu", ept);
+	SDE_ATRACE_BEGIN(atrace_buf);
 	usleep_range(timeout_us, timeout_us + 10);
-	SDE_ATRACE_END("schedule_timeout");
+	SDE_ATRACE_END(atrace_buf);
 
 	SDE_EVT32(DRMID(&sde_enc->base), qsync_mode, avr_step_fps, min_fps, ktime_to_us(current_ts),
 					ktime_to_us(ept_ts), timeout_us);