Commit 874697e1 authored by John Olender's avatar John Olender Committed by Alex Deucher
Browse files

drm/amd/display: Defer BW-optimization-blocked DRR adjustments

[Why & How]
Instead of dropping DRR updates, defer them. This fixes issues where
monitor continues to see incorrect refresh rate after VRR was turned off
by userspace.

Fixes: 32953485 ("drm/amd/display: Do not update DRR while BW optimizations pending")
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3546


Reviewed-by: default avatarSun peng Li <sunpeng.li@amd.com>
Signed-off-by: default avatarJohn Olender <john.olender@gmail.com>
Signed-off-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: default avatarRay Wu <ray.wu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 53761b7e)
Cc: stable@vger.kernel.org
parent 190818d1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -372,6 +372,8 @@ get_crtc_by_otg_inst(struct amdgpu_device *adev,
static inline bool is_dc_timing_adjust_needed(struct dm_crtc_state *old_state,
					      struct dm_crtc_state *new_state)
{
	if (new_state->stream->adjust.timing_adjust_pending)
		return true;
	if (new_state->freesync_config.state ==  VRR_STATE_ACTIVE_FIXED)
		return true;
	else if (amdgpu_dm_crtc_vrr_active(old_state) != amdgpu_dm_crtc_vrr_active(new_state))
+7 −3
Original line number Diff line number Diff line
@@ -439,9 +439,12 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
	 * Don't adjust DRR while there's bandwidth optimizations pending to
	 * avoid conflicting with firmware updates.
	 */
	if (dc->ctx->dce_version > DCE_VERSION_MAX)
		if (dc->optimized_required || dc->wm_optimized_required)
	if (dc->ctx->dce_version > DCE_VERSION_MAX) {
		if (dc->optimized_required || dc->wm_optimized_required) {
			stream->adjust.timing_adjust_pending = true;
			return false;
		}
	}

	dc_exit_ips_for_hw_access(dc);

@@ -3168,7 +3171,8 @@ static void copy_stream_update_to_stream(struct dc *dc,

	if (update->crtc_timing_adjust) {
		if (stream->adjust.v_total_min != update->crtc_timing_adjust->v_total_min ||
			stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max)
			stream->adjust.v_total_max != update->crtc_timing_adjust->v_total_max ||
			stream->adjust.timing_adjust_pending)
			update->crtc_timing_adjust->timing_adjust_pending = true;
		stream->adjust = *update->crtc_timing_adjust;
		update->crtc_timing_adjust->timing_adjust_pending = false;