Skip to content

Commit 6d31602

Browse files
Aurabindo Pillaialexdeucher
authored andcommitted
drm/amd/display: more liberal vmin/vmax update for freesync
[Why] FAMS2 expects vmin/vmax to be updated in the case when freesync is off, but supported. But we only update it when freesync is enabled. [How] Change the vsync handler such that dc_stream_adjust_vmin_vmax() its called irrespective of whether freesync is enabled. If freesync is supported, then there is no harm in updating vmin/vmax registers. Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3546 Reviewed-by: Nicholas Kazlauskas <[email protected]> Signed-off-by: Aurabindo Pillai <[email protected]> Signed-off-by: Ray Wu <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Roman Li <[email protected]> Reviewed-by: ChiaHsuan Chung <[email protected]> Tested-by: Daniel Wheeler <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent c210b75 commit 6d31602

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,11 @@ static void dm_vupdate_high_irq(void *interrupt_params)
612612
* if a pageflip happened inside front-porch.
613613
*/
614614
if (vrr_active) {
615+
bool replay_en = acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled;
616+
bool psr_en = acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled;
617+
bool fs_active_var_en = acrtc->dm_irq_params.freesync_config.state
618+
== VRR_STATE_ACTIVE_VARIABLE;
619+
615620
amdgpu_dm_crtc_handle_vblank(acrtc);
616621

617622
/* BTR processing for pre-DCE12 ASICs */
@@ -623,9 +628,11 @@ static void dm_vupdate_high_irq(void *interrupt_params)
623628
acrtc->dm_irq_params.stream,
624629
&acrtc->dm_irq_params.vrr_params);
625630

626-
schedule_dc_vmin_vmax(adev,
627-
acrtc->dm_irq_params.stream,
628-
&acrtc->dm_irq_params.vrr_params.adjust);
631+
if (fs_active_var_en || (!fs_active_var_en && !replay_en && !psr_en)) {
632+
schedule_dc_vmin_vmax(adev,
633+
acrtc->dm_irq_params.stream,
634+
&acrtc->dm_irq_params.vrr_params.adjust);
635+
}
629636
spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
630637
}
631638
}
@@ -708,15 +715,20 @@ static void dm_crtc_high_irq(void *interrupt_params)
708715
spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags);
709716

710717
if (acrtc->dm_irq_params.stream &&
711-
acrtc->dm_irq_params.vrr_params.supported &&
712-
acrtc->dm_irq_params.freesync_config.state ==
713-
VRR_STATE_ACTIVE_VARIABLE) {
718+
acrtc->dm_irq_params.vrr_params.supported) {
719+
bool replay_en = acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled;
720+
bool psr_en = acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled;
721+
bool fs_active_var_en = acrtc->dm_irq_params.freesync_config.state == VRR_STATE_ACTIVE_VARIABLE;
722+
714723
mod_freesync_handle_v_update(adev->dm.freesync_module,
715724
acrtc->dm_irq_params.stream,
716725
&acrtc->dm_irq_params.vrr_params);
717726

718-
schedule_dc_vmin_vmax(adev, acrtc->dm_irq_params.stream,
719-
&acrtc->dm_irq_params.vrr_params.adjust);
727+
/* update vmin_vmax only if freesync is enabled, or only if PSR and REPLAY are disabled */
728+
if (fs_active_var_en || (!fs_active_var_en && !replay_en && !psr_en)) {
729+
schedule_dc_vmin_vmax(adev, acrtc->dm_irq_params.stream,
730+
&acrtc->dm_irq_params.vrr_params.adjust);
731+
}
720732
}
721733

722734
/*

0 commit comments

Comments
 (0)