From 36bf90e02f8727b1c56b22f616fbfc2c51a5f3eb Mon Sep 17 00:00:00 2001 From: Steve Cohen Date: Wed, 17 Jun 2020 22:55:12 -0400 Subject: [PATCH] disp: msm: sde: adjust qsync linecount calculation Adjust the QSYNC line count calculation to compensate for the idle time, when no transfers are actively taking place. Change-Id: If91eab25321eea6e6880f07605c5a9c1b7b7ee05 Signed-off-by: Steve Cohen --- msm/sde/sde_encoder.c | 18 ++++++++++++++++++ msm/sde/sde_encoder_phys.h | 8 ++++++++ msm/sde/sde_encoder_phys_cmd.c | 23 ++++++++++++++--------- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index d711083aa7..d9a65d7934 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -4043,6 +4043,24 @@ void sde_encoder_helper_get_pp_line_count(struct drm_encoder *drm_enc, } } +void sde_encoder_helper_get_transfer_time(struct drm_encoder *drm_enc, + u32 *transfer_time_us) +{ + struct sde_encoder_virt *sde_enc; + struct msm_mode_info *info; + + if (!drm_enc || !transfer_time_us) { + SDE_ERROR("bad arg: encoder:%d transfer_time:%d\n", !drm_enc, + !transfer_time_us); + return; + } + + sde_enc = to_sde_encoder_virt(drm_enc); + info = &sde_enc->mode_info; + + *transfer_time_us = info->mdp_transfer_time_us; +} + int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc, struct drm_framebuffer *fb) { diff --git a/msm/sde/sde_encoder_phys.h b/msm/sde/sde_encoder_phys.h index 336014d71c..f653bbe7f2 100644 --- a/msm/sde/sde_encoder_phys.h +++ b/msm/sde/sde_encoder_phys.h @@ -539,6 +539,14 @@ void sde_encoder_phys_setup_cdm(struct sde_encoder_phys *phys_enc, void sde_encoder_helper_get_pp_line_count(struct drm_encoder *drm_enc, struct sde_hw_pp_vsync_info *info); +/** + * sde_encoder_helper_get_transfer_time - get the mdp transfer time in usecs + * @drm_enc: Pointer to drm encoder structure + * @transfer_time_us: Pointer to store the output value + */ +void sde_encoder_helper_get_transfer_time(struct drm_encoder *drm_enc, + u32 *transfer_time_us); + /** * sde_encoder_helper_trigger_flush - control flush helper function * This helper function may be optionally specified by physical diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index 7bad3620dc..00aa97afdc 100644 --- a/msm/sde/sde_encoder_phys_cmd.c +++ b/msm/sde/sde_encoder_phys_cmd.c @@ -932,7 +932,7 @@ static int _get_tearcheck_threshold(struct sde_encoder_phys *phys_enc, struct drm_connector *conn = phys_enc->connector; u32 qsync_mode; struct drm_display_mode *mode; - u32 threshold_lines = 0; + u32 threshold_lines = DEFAULT_TEARCHECK_SYNC_THRESH_START; struct sde_encoder_phys_cmd *cmd_enc = to_sde_encoder_phys_cmd(phys_enc); @@ -950,8 +950,9 @@ static int _get_tearcheck_threshold(struct sde_encoder_phys *phys_enc, u32 slow_time_ns; u32 default_time_ns; u32 extra_time_ns; - u32 total_extra_lines; u32 default_line_time_ns; + u32 idle_time_ns = 0; + u32 transfer_time_us = 0; if (phys_enc->parent_ops.get_qsync_fps) phys_enc->parent_ops.get_qsync_fps( @@ -974,27 +975,31 @@ static int _get_tearcheck_threshold(struct sde_encoder_phys *phys_enc, /* Calculate the number of extra lines*/ slow_time_ns = (1 * 1000000000) / qsync_min_fps; default_time_ns = (1 * 1000000000) / default_fps; - extra_time_ns = slow_time_ns - default_time_ns; + sde_encoder_helper_get_transfer_time(phys_enc->parent, + &transfer_time_us); + if (transfer_time_us) + idle_time_ns = default_time_ns - + (1000 * transfer_time_us); + + extra_time_ns = slow_time_ns - default_time_ns + idle_time_ns; default_line_time_ns = (1 * 1000000000) / (default_fps * yres); - total_extra_lines = extra_time_ns / default_line_time_ns; - threshold_lines += total_extra_lines; + threshold_lines = extra_time_ns / default_line_time_ns; SDE_DEBUG_CMDENC(cmd_enc, "slow:%d default:%d extra:%d(ns)\n", slow_time_ns, default_time_ns, extra_time_ns); - SDE_DEBUG_CMDENC(cmd_enc, "extra_lines:%d threshold:%d\n", - total_extra_lines, threshold_lines); + SDE_DEBUG_CMDENC(cmd_enc, "xfer:%d(us) idle:%d(ns) lines:%d\n", + transfer_time_us, idle_time_ns, threshold_lines); SDE_DEBUG_CMDENC(cmd_enc, "min_fps:%d fps:%d yres:%d\n", qsync_min_fps, default_fps, yres); SDE_EVT32(qsync_mode, qsync_min_fps, extra_time_ns, default_fps, - yres, threshold_lines); + yres, transfer_time_us, threshold_lines); *extra_frame_trigger_time = extra_time_ns; } exit: - threshold_lines += DEFAULT_TEARCHECK_SYNC_THRESH_START; return threshold_lines; }