aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
diff options
context:
space:
mode:
authorAnthony Koo <[email protected]>2018-04-06 17:55:39 +0000
committerAlex Deucher <[email protected]>2018-08-27 16:10:54 +0000
commit953c2901c860da16963b48db8344bf0fd5b03040 (patch)
tree2eccf98642587febc089fe36a39649cca9ffb056 /drivers/gpu/drm/amd/display/modules/freesync/freesync.c
parentdrm/amd/display: fix LFC tearing at top of screen (diff)
downloadkernel-953c2901c860da16963b48db8344bf0fd5b03040.tar.gz
kernel-953c2901c860da16963b48db8344bf0fd5b03040.zip
drm/amd/display: refactor vupdate interrupt registration
We only need to register once OS calls the interrupt control. Also, if we are entering static screen mode, disable after ramping is done. Disable shall be done via timer of 2 seconds regardless of ramping complete or not, just to simplify. Also, ramp to mid instead of min, due to better flicker performance... Signed-off-by: Anthony Koo <[email protected]> Reviewed-by: Aric Cyr <[email protected]> Acked-by: Harry Wentland <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync/freesync.c')
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index daad60ec1ce3..349387eb9fe6 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -109,12 +109,6 @@ static unsigned int calc_duration_in_us_from_v_total(
* 1000) * stream->timing.h_total,
stream->timing.pix_clk_khz));
- if (duration_in_us < in_vrr->min_duration_in_us)
- duration_in_us = in_vrr->min_duration_in_us;
-
- if (duration_in_us > in_vrr->max_duration_in_us)
- duration_in_us = in_vrr->max_duration_in_us;
-
return duration_in_us;
}
@@ -230,10 +224,9 @@ static void update_v_total_for_static_ramp(
}
}
- v_total = calc_v_total_from_duration(stream,
- in_out_vrr,
- current_duration_in_us);
-
+ v_total = div64_u64(div64_u64(((unsigned long long)(
+ current_duration_in_us) * stream->timing.pix_clk_khz),
+ stream->timing.h_total), 1000);
in_out_vrr->adjust.v_total_min = v_total;
in_out_vrr->adjust.v_total_max = v_total;
@@ -702,7 +695,11 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
} else if (in_out_vrr->state == VRR_STATE_ACTIVE_FIXED) {
in_out_vrr->fixed.target_refresh_in_uhz =
in_out_vrr->min_refresh_in_uhz;
- if (in_out_vrr->fixed.ramping_active) {
+ if (in_out_vrr->fixed.ramping_active &&
+ in_out_vrr->fixed.fixed_active) {
+ /* Do not update vtotals if ramping is already active
+ * in order to continue ramp from current refresh.
+ */
in_out_vrr->fixed.fixed_active = true;
} else {
in_out_vrr->fixed.fixed_active = true;