From: Aurabindo Pillai <aurabindo.pil...@amd.com>

[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 <nicholas.kazlaus...@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pil...@amd.com>
Signed-off-by: Ray Wu <ray...@amd.com>
Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
Signed-off-by: Roman Li <roman...@amd.com>
Reviewed-by: ChiaHsuan Chung <chiahsuan.ch...@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 28 +++++++++++++------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 6762fc7de769..16347ca2396a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -612,6 +612,11 @@ static void dm_vupdate_high_irq(void *interrupt_params)
                 * if a pageflip happened inside front-porch.
                 */
                if (vrr_active) {
+                       bool replay_en = 
acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled;
+                       bool psr_en = 
acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled;
+                       bool fs_active_var_en = 
acrtc->dm_irq_params.freesync_config.state
+                               == VRR_STATE_ACTIVE_VARIABLE;
+
                        amdgpu_dm_crtc_handle_vblank(acrtc);
 
                        /* BTR processing for pre-DCE12 ASICs */
@@ -623,9 +628,11 @@ static void dm_vupdate_high_irq(void *interrupt_params)
                                    acrtc->dm_irq_params.stream,
                                    &acrtc->dm_irq_params.vrr_params);
 
-                               schedule_dc_vmin_vmax(adev,
-                                       acrtc->dm_irq_params.stream,
-                                       
&acrtc->dm_irq_params.vrr_params.adjust);
+                               if (fs_active_var_en || (!fs_active_var_en && 
!replay_en && !psr_en)) {
+                                       schedule_dc_vmin_vmax(adev,
+                                               acrtc->dm_irq_params.stream,
+                                               
&acrtc->dm_irq_params.vrr_params.adjust);
+                               }
                                
spin_unlock_irqrestore(&adev_to_drm(adev)->event_lock, flags);
                        }
                }
@@ -708,15 +715,20 @@ static void dm_crtc_high_irq(void *interrupt_params)
        spin_lock_irqsave(&adev_to_drm(adev)->event_lock, flags);
 
        if (acrtc->dm_irq_params.stream &&
-           acrtc->dm_irq_params.vrr_params.supported &&
-           acrtc->dm_irq_params.freesync_config.state ==
-                   VRR_STATE_ACTIVE_VARIABLE) {
+               acrtc->dm_irq_params.vrr_params.supported) {
+               bool replay_en = 
acrtc->dm_irq_params.stream->link->replay_settings.replay_feature_enabled;
+               bool psr_en = 
acrtc->dm_irq_params.stream->link->psr_settings.psr_feature_enabled;
+               bool fs_active_var_en = 
acrtc->dm_irq_params.freesync_config.state == VRR_STATE_ACTIVE_VARIABLE;
+
                mod_freesync_handle_v_update(adev->dm.freesync_module,
                                             acrtc->dm_irq_params.stream,
                                             &acrtc->dm_irq_params.vrr_params);
 
-               schedule_dc_vmin_vmax(adev, acrtc->dm_irq_params.stream,
-                               &acrtc->dm_irq_params.vrr_params.adjust);
+               /* update vmin_vmax only if freesync is enabled, or only if PSR 
and REPLAY are disabled */
+               if (fs_active_var_en || (!fs_active_var_en && !replay_en && 
!psr_en)) {
+                       schedule_dc_vmin_vmax(adev, acrtc->dm_irq_params.stream,
+                                       
&acrtc->dm_irq_params.vrr_params.adjust);
+               }
        }
 
        /*
-- 
2.34.1

Reply via email to