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 <cohens@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
4d45309328
commit
36bf90e02f
@@ -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,
|
int sde_encoder_helper_reset_mixers(struct sde_encoder_phys *phys_enc,
|
||||||
struct drm_framebuffer *fb)
|
struct drm_framebuffer *fb)
|
||||||
{
|
{
|
||||||
|
@@ -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,
|
void sde_encoder_helper_get_pp_line_count(struct drm_encoder *drm_enc,
|
||||||
struct sde_hw_pp_vsync_info *info);
|
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
|
* sde_encoder_helper_trigger_flush - control flush helper function
|
||||||
* This helper function may be optionally specified by physical
|
* This helper function may be optionally specified by physical
|
||||||
|
@@ -932,7 +932,7 @@ static int _get_tearcheck_threshold(struct sde_encoder_phys *phys_enc,
|
|||||||
struct drm_connector *conn = phys_enc->connector;
|
struct drm_connector *conn = phys_enc->connector;
|
||||||
u32 qsync_mode;
|
u32 qsync_mode;
|
||||||
struct drm_display_mode *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 =
|
struct sde_encoder_phys_cmd *cmd_enc =
|
||||||
to_sde_encoder_phys_cmd(phys_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 slow_time_ns;
|
||||||
u32 default_time_ns;
|
u32 default_time_ns;
|
||||||
u32 extra_time_ns;
|
u32 extra_time_ns;
|
||||||
u32 total_extra_lines;
|
|
||||||
u32 default_line_time_ns;
|
u32 default_line_time_ns;
|
||||||
|
u32 idle_time_ns = 0;
|
||||||
|
u32 transfer_time_us = 0;
|
||||||
|
|
||||||
if (phys_enc->parent_ops.get_qsync_fps)
|
if (phys_enc->parent_ops.get_qsync_fps)
|
||||||
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*/
|
/* Calculate the number of extra lines*/
|
||||||
slow_time_ns = (1 * 1000000000) / qsync_min_fps;
|
slow_time_ns = (1 * 1000000000) / qsync_min_fps;
|
||||||
default_time_ns = (1 * 1000000000) / default_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);
|
default_line_time_ns = (1 * 1000000000) / (default_fps * yres);
|
||||||
|
|
||||||
total_extra_lines = extra_time_ns / default_line_time_ns;
|
threshold_lines = extra_time_ns / default_line_time_ns;
|
||||||
threshold_lines += total_extra_lines;
|
|
||||||
|
|
||||||
SDE_DEBUG_CMDENC(cmd_enc, "slow:%d default:%d extra:%d(ns)\n",
|
SDE_DEBUG_CMDENC(cmd_enc, "slow:%d default:%d extra:%d(ns)\n",
|
||||||
slow_time_ns, default_time_ns, extra_time_ns);
|
slow_time_ns, default_time_ns, extra_time_ns);
|
||||||
SDE_DEBUG_CMDENC(cmd_enc, "extra_lines:%d threshold:%d\n",
|
SDE_DEBUG_CMDENC(cmd_enc, "xfer:%d(us) idle:%d(ns) lines:%d\n",
|
||||||
total_extra_lines, threshold_lines);
|
transfer_time_us, idle_time_ns, threshold_lines);
|
||||||
SDE_DEBUG_CMDENC(cmd_enc, "min_fps:%d fps:%d yres:%d\n",
|
SDE_DEBUG_CMDENC(cmd_enc, "min_fps:%d fps:%d yres:%d\n",
|
||||||
qsync_min_fps, default_fps, yres);
|
qsync_min_fps, default_fps, yres);
|
||||||
|
|
||||||
SDE_EVT32(qsync_mode, qsync_min_fps, extra_time_ns, default_fps,
|
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;
|
*extra_frame_trigger_time = extra_time_ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
threshold_lines += DEFAULT_TEARCHECK_SYNC_THRESH_START;
|
|
||||||
|
|
||||||
return threshold_lines;
|
return threshold_lines;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user