drm/amd/display: Check that vrefresh is in freesync range
authorIlya Bakoulin <Ilya.Bakoulin@amd.com>
Thu, 17 Jan 2019 18:40:34 +0000 (13:40 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Feb 2019 02:16:23 +0000 (21:16 -0500)
[Why]
Setting monitor refresh rate below freesync range would cause the
monitor to go blank indefinitely with freesync enabled

[How]
Set vrr_supported and ignore_msa_timing_param according to whether
the refresh rate is above or below the minimum freesync frequency.

Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 41e3620bed4d8358107452f110ff2fe478f6d0a4..06fc7c58a7b1900b14f69e417d0eff4d8d4b8f41 100644 (file)
@@ -3030,9 +3030,6 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 
        update_stream_signal(stream, sink);
 
-       if (dm_state && dm_state->freesync_capable)
-               stream->ignore_msa_timing_param = true;
-
 finish:
        if (sink && sink->sink_signal == SIGNAL_TYPE_VIRTUAL && aconnector->base.force != DRM_FORCE_ON)
                dc_sink_release(sink);
@@ -5356,10 +5353,13 @@ static void get_freesync_config_for_crtc(
        struct mod_freesync_config config = {0};
        struct amdgpu_dm_connector *aconnector =
                        to_amdgpu_dm_connector(new_con_state->base.connector);
+       struct drm_display_mode *mode = &new_crtc_state->base.mode;
 
-       new_crtc_state->vrr_supported = new_con_state->freesync_capable;
+       new_crtc_state->vrr_supported = new_con_state->freesync_capable &&
+               aconnector->min_vfreq <= drm_mode_vrefresh(mode);
 
-       if (new_con_state->freesync_capable) {
+       if (new_crtc_state->vrr_supported) {
+               new_crtc_state->stream->ignore_msa_timing_param = true;
                config.state = new_crtc_state->base.vrr_enabled ?
                                VRR_STATE_ACTIVE_VARIABLE :
                                VRR_STATE_INACTIVE;