diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync/freesync.c')
| -rw-r--r-- | drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index ec70c9b12e1a..a94700940fd6 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -122,7 +122,7 @@ static unsigned int calc_v_total_from_refresh(  		const struct dc_stream_state *stream,  		unsigned int refresh_in_uhz)  { -	unsigned int v_total = stream->timing.v_total; +	unsigned int v_total;  	unsigned int frame_duration_in_ns;  	frame_duration_in_ns = @@ -234,6 +234,10 @@ static void update_v_total_for_static_ramp(  			current_duration_in_us) * (stream->timing.pix_clk_100hz / 10)),  				stream->timing.h_total), 1000); +	/* v_total cannot be less than nominal */ +	if (v_total < stream->timing.v_total) +		v_total = stream->timing.v_total; +  	in_out_vrr->adjust.v_total_min = v_total;  	in_out_vrr->adjust.v_total_max = v_total;  } @@ -743,6 +747,10 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  	nominal_field_rate_in_uhz =  			mod_freesync_calc_nominal_field_rate(stream); +	/* Rounded to the nearest Hz */ +	nominal_field_rate_in_uhz = 1000000ULL * +			div_u64(nominal_field_rate_in_uhz + 500000, 1000000); +  	min_refresh_in_uhz = in_config->min_refresh_in_uhz;  	max_refresh_in_uhz = in_config->max_refresh_in_uhz; @@ -975,13 +983,9 @@ void mod_freesync_get_settings(struct mod_freesync *mod_freesync,  		unsigned int *inserted_frames,  		unsigned int *inserted_duration_in_us)  { -	struct core_freesync *core_freesync = NULL; -  	if (mod_freesync == NULL)  		return; -	core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync); -  	if (vrr->supported) {  		*v_total_min = vrr->adjust.v_total_min;  		*v_total_max = vrr->adjust.v_total_max; @@ -996,14 +1000,13 @@ unsigned long long mod_freesync_calc_nominal_field_rate(  			const struct dc_stream_state *stream)  {  	unsigned long long nominal_field_rate_in_uhz = 0; +	unsigned int total = stream->timing.h_total * stream->timing.v_total; -	/* Calculate nominal field rate for stream */ +	/* Calculate nominal field rate for stream, rounded up to nearest integer */  	nominal_field_rate_in_uhz = stream->timing.pix_clk_100hz / 10;  	nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL; -	nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, -						stream->timing.h_total); -	nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, -						stream->timing.v_total); + +	nominal_field_rate_in_uhz =	div_u64(nominal_field_rate_in_uhz, total);  	return nominal_field_rate_in_uhz;  }  | 
