From: Ivan Lipski <[email protected]>

[Why]
When changing resolution (e.g., 4K → FHD) in mirror/clone mode with
certain monitors, the monitor blanks and loses connection due to an early
exit in vrr_settings_require_update(). The function only checks if VRR
state, fixed refresh target, or min/max refresh rate range has changed.

During mode changes, if the calculated min/max refresh values remain the
same even though the stream's v_total changed, the function returns early
without updating vrr_params.adjust.v_total_min/max, leaving the monitor's
VRR timing parameters unsynced with the new mode, causing it to blank out.

[How]
Explicitly adjust VRR parameters to the stream's nominal v_total when VRR
is supported, but inactive.

Fixes: 3fd606f57448 ("drm/amd/display: more liberal vmin/vmax update for 
freesync")

Reviewed-by: Aurabindo Pillai <[email protected]>
Signed-off-by: Ivan Lipski <[email protected]>
Signed-off-by: Fangzhi Zuo <[email protected]>
---
 .../gpu/drm/amd/display/modules/freesync/freesync.c   | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c 
b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index ce421bcddcb0..1aae46d703ba 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -1260,6 +1260,17 @@ void mod_freesync_handle_v_update(struct mod_freesync 
*mod_freesync,
                update_v_total_for_static_ramp(
                                core_freesync, stream, in_out_vrr);
        }
+
+       /*
+        * If VRR is inactive, set vtotal min and max to nominal vtotal
+        */
+        if (in_out_vrr->state == VRR_STATE_INACTIVE) {
+               in_out_vrr->adjust.v_total_min =
+                       mod_freesync_calc_v_total_from_refresh(stream,
+                               in_out_vrr->max_refresh_in_uhz);
+               in_out_vrr->adjust.v_total_max = in_out_vrr->adjust.v_total_min;
+               return;
+       }
 }
 
 unsigned long long mod_freesync_calc_nominal_field_rate(
-- 
2.43.0

Reply via email to