disp: msm: sde: improve qsync trigger window accuracy

Currently, panel jitter and loss of precision are not
compensated when calculating the trigger window size
for a QSYNC panel. These errors can be signigicant on
panels supporting very slow frame rate (10 Hz).

This change improves fixed point calculation and take
into account panel jitter when calculating the minimum
qsync time period.

Change-Id: Ibe620862afbd853580992fccec09cac8307b92bd
Signed-off-by: Amine Najahi <quic_anajahi@quicinc.com>
这个提交包含在:
Amine Najahi
2022-09-26 10:44:12 -04:00
提交者 Gerrit - the friendly Code Review server
父节点 83cb3d44af
当前提交 88a24f8c45
修改 3 个文件,包含 73 行新增47 行删除

查看文件

@@ -5622,24 +5622,15 @@ int sde_encoder_wait_for_event(struct drm_encoder *drm_enc,
return ret;
}
void sde_encoder_helper_get_jitter_bounds_ns(struct drm_encoder *drm_enc,
u64 *l_bound, u64 *u_bound)
void sde_encoder_helper_get_jitter_bounds_ns(u32 frame_rate,
u32 jitter_num, u32 jitter_denom,
ktime_t *l_bound, ktime_t *u_bound)
{
struct sde_encoder_virt *sde_enc;
u64 jitter_ns, frametime_ns;
struct msm_mode_info *info;
ktime_t jitter_ns, frametime_ns;
if (!drm_enc) {
SDE_ERROR("invalid encoder\n");
return;
}
sde_enc = to_sde_encoder_virt(drm_enc);
info = &sde_enc->mode_info;
frametime_ns = (1 * 1000000000) / info->frame_rate;
jitter_ns = info->jitter_numer * frametime_ns;
do_div(jitter_ns, info->jitter_denom * 100);
frametime_ns = (1 * 1000000000) / frame_rate;
jitter_ns = jitter_num * frametime_ns;
do_div(jitter_ns, jitter_denom * 100);
*l_bound = frametime_ns - jitter_ns;
*u_bound = frametime_ns + jitter_ns;