瀏覽代碼

disp: msm: sde: use INTF mdp_vsync timestamp only for video-mode

MDSS 9.0.0 added support for logging MDP_VSYNC timestamp. Use it for
video-mode panels and rely on PANEL_VSYNC timestamp for cmd-mode panels
as it relies on external panel TE.

Change-Id: I09b25d893075bee7cb2da98d4c4b4e54eb09bd6e
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 3 年之前
父節點
當前提交
0df34dcada
共有 3 個文件被更改,包括 8 次插入7 次删除
  1. 5 4
      msm/sde/sde_encoder.c
  2. 2 2
      msm/sde/sde_hw_intf.c
  3. 1 1
      msm/sde/sde_hw_intf.h

+ 5 - 4
msm/sde/sde_encoder.c

@@ -158,15 +158,16 @@ ktime_t sde_encoder_calc_last_vsync_timestamp(struct drm_encoder *drm_enc)
 	struct intf_status intf_status = {0};
 	unsigned long features;
 	u32 fps;
+	bool is_cmd, is_vid;
 
 	sde_enc = to_sde_encoder_virt(drm_enc);
 	cur_master = sde_enc->cur_master;
 	fps = sde_encoder_get_fps(drm_enc);
+	is_cmd = sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE);
+	is_vid = sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_VIDEO_MODE);
 
 	if (!cur_master || !cur_master->hw_intf || !fps
-		|| !cur_master->hw_intf->ops.get_vsync_timestamp
-		|| (!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE)
-			&& !sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_VIDEO_MODE)))
+			|| !cur_master->hw_intf->ops.get_vsync_timestamp || (!is_cmd && !is_vid))
 		return 0;
 
 	features = cur_master->hw_intf->cap->features;
@@ -182,7 +183,7 @@ ktime_t sde_encoder_calc_last_vsync_timestamp(struct drm_encoder *drm_enc)
 			return 0;
 	}
 
-	vsync_counter = cur_master->hw_intf->ops.get_vsync_timestamp(cur_master->hw_intf);
+	vsync_counter = cur_master->hw_intf->ops.get_vsync_timestamp(cur_master->hw_intf, is_vid);
 	qtmr_counter = arch_timer_read_counter();
 	cur_time = ktime_get_ns();
 

+ 2 - 2
msm/sde/sde_hw_intf.c

@@ -224,14 +224,14 @@ static void sde_hw_intf_reset_counter(struct sde_hw_intf *ctx)
 	SDE_REG_WRITE(c, INTF_LINE_COUNT, BIT(31));
 }
 
-static u64 sde_hw_intf_get_vsync_timestamp(struct sde_hw_intf *ctx)
+static u64 sde_hw_intf_get_vsync_timestamp(struct sde_hw_intf *ctx, bool is_vid)
 {
 	struct sde_hw_blk_reg_map *c = &ctx->hw;
 	u32 timestamp_lo, timestamp_hi;
 	u64 timestamp = 0;
 	u32 reg_ts_0, reg_ts_1;
 
-	if (ctx->cap->features & BIT(SDE_INTF_MDP_VSYNC_TS)) {
+	if (ctx->cap->features & BIT(SDE_INTF_MDP_VSYNC_TS) && is_vid) {
 		reg_ts_0 = INTF_MDP_VSYNC_TIMESTAMP0;
 		reg_ts_1 = INTF_MDP_VSYNC_TIMESTAMP1;
 	} else {

+ 1 - 1
msm/sde/sde_hw_intf.h

@@ -236,7 +236,7 @@ struct sde_hw_intf_ops {
 	/**
 	 * Get the HW vsync timestamp counter
 	 */
-	u64 (*get_vsync_timestamp)(struct sde_hw_intf *intf);
+	u64 (*get_vsync_timestamp)(struct sde_hw_intf *intf, bool is_vid);
 
 	/**
 	 * Enable processing of 2 pixels per clock