diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync')
| -rw-r--r-- | drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 36 | 
1 files changed, 29 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 81820f3d6b3b..d988533d4af5 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -324,22 +324,44 @@ static void apply_below_the_range(struct core_freesync *core_freesync,  		/* Choose number of frames to insert based on how close it  		 * can get to the mid point of the variable range. +		 *  - Delta for CEIL: delta_from_mid_point_in_us_1 +		 *  - Delta for FLOOR: delta_from_mid_point_in_us_2  		 */ -		if ((frame_time_in_us / mid_point_frames_ceil) > in_out_vrr->min_duration_in_us && -				(delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2 || -						mid_point_frames_floor < 2)) { +		if ((last_render_time_in_us / mid_point_frames_ceil) < in_out_vrr->min_duration_in_us) { +			/* Check for out of range. +			 * If using CEIL produces a value that is out of range, +			 * then we are forced to use FLOOR. +			 */ +			frames_to_insert = mid_point_frames_floor; +		} else if (mid_point_frames_floor < 2) { +			/* Check if FLOOR would result in non-LFC. In this case +			 * choose to use CEIL +			 */ +			frames_to_insert = mid_point_frames_ceil; +		} else if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { +			/* If choosing CEIL results in a frame duration that is +			 * closer to the mid point of the range. +			 * Choose CEIL +			 */  			frames_to_insert = mid_point_frames_ceil; -			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - -					delta_from_mid_point_in_us_1;  		} else { +			/* If choosing FLOOR results in a frame duration that is +			 * closer to the mid point of the range. +			 * Choose FLOOR +			 */  			frames_to_insert = mid_point_frames_floor; -			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 - -					delta_from_mid_point_in_us_2;  		}  		/* Prefer current frame multiplier when BTR is enabled unless it drifts  		 * too far from the midpoint  		 */ +		if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { +			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - +					delta_from_mid_point_in_us_1; +		} else { +			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 - +					delta_from_mid_point_in_us_2; +		}  		if (in_out_vrr->btr.frames_to_insert != 0 &&  				delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) {  			if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) < |