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 | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 5c41a4751db4..dbd60811f95d 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -1,5 +1,5 @@  /* - * Copyright 2016 Advanced Micro Devices, Inc. + * Copyright 2016-2023 Advanced Micro Devices, Inc.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -989,6 +989,7 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  	unsigned int refresh_range = 0;  	unsigned long long min_refresh_in_uhz = 0;  	unsigned long long max_refresh_in_uhz = 0; +	unsigned long long min_hardware_refresh_in_uhz = 0;  	if (mod_freesync == NULL)  		return; @@ -999,7 +1000,13 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  	nominal_field_rate_in_uhz =  			mod_freesync_calc_nominal_field_rate(stream); -	min_refresh_in_uhz = in_config->min_refresh_in_uhz; +	if (stream->ctx->dc->caps.max_v_total != 0 && stream->timing.h_total != 0) { +		min_hardware_refresh_in_uhz = div64_u64((stream->timing.pix_clk_100hz * 100000000ULL), +			(stream->timing.h_total * stream->ctx->dc->caps.max_v_total)); +	} +	/* Limit minimum refresh rate to what can be supported by hardware */ +	min_refresh_in_uhz = min_hardware_refresh_in_uhz > in_config->min_refresh_in_uhz ? +		min_hardware_refresh_in_uhz : in_config->min_refresh_in_uhz;  	max_refresh_in_uhz = in_config->max_refresh_in_uhz;  	/* Full range may be larger than current video timing, so cap at nominal */ @@ -1137,10 +1144,6 @@ void mod_freesync_handle_preflip(struct mod_freesync *mod_freesync,  	if (in_out_vrr->supported &&  			in_out_vrr->state == VRR_STATE_ACTIVE_VARIABLE) { -		unsigned int oldest_index = plane->time.index + 1; - -		if (oldest_index >= DC_PLANE_UPDATE_TIMES_MAX) -			oldest_index = 0;  		last_render_time_in_us = curr_time_stamp_in_us -  				plane->time.prev_update_time_in_us;  | 
