aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
diff options
context:
space:
mode:
authorAnthony Koo <Anthony.Koo@amd.com>2018-04-04 21:04:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-08-27 12:10:53 -0400
commit050790cc59732cd99789235cb118df23e9b42911 (patch)
tree66e7e717a89fed0fab2d28601279f117d625bfde /drivers/gpu/drm/amd/display/modules/freesync/freesync.c
parentff6014d63a87d9a801ddd9ddd10359b2dead6943 (diff)
drm/amd/display: Fix bug that causes black screen
Ignore MSA bit on DP display is usually set during SetTimings, but there was a case where the module thought refresh rate was not valid and ignore MSA bit was not set. Later, a valid refresh rate range was requested but since ignore MSA bit not set, it caused black screen. Issue if with how the module checked for VRR support. Fix up that logic. DM should call new valid_range function to determine if timing is supported. Signed-off-by: Anthony Koo <Anthony.Koo@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/modules/freesync/freesync.c')
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index be6a6c63b4cc..4887c888bbe7 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -613,7 +613,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
613{ 613{
614 struct core_freesync *core_freesync = NULL; 614 struct core_freesync *core_freesync = NULL;
615 unsigned long long nominal_field_rate_in_uhz = 0; 615 unsigned long long nominal_field_rate_in_uhz = 0;
616 bool nominal_field_rate_in_range = true;
617 unsigned int refresh_range = 0; 616 unsigned int refresh_range = 0;
618 unsigned int min_refresh_in_uhz = 0; 617 unsigned int min_refresh_in_uhz = 0;
619 unsigned int max_refresh_in_uhz = 0; 618 unsigned int max_refresh_in_uhz = 0;
@@ -638,15 +637,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
638 if (max_refresh_in_uhz > nominal_field_rate_in_uhz) 637 if (max_refresh_in_uhz > nominal_field_rate_in_uhz)
639 max_refresh_in_uhz = nominal_field_rate_in_uhz; 638 max_refresh_in_uhz = nominal_field_rate_in_uhz;
640 639
641 /* Allow for some rounding error of actual video timing by taking ceil.
642 * For example, 144 Hz mode timing may actually be 143.xxx Hz when
643 * calculated from pixel rate and vertical/horizontal totals, but
644 * this should be allowed instead of blocking FreeSync.
645 */
646 if ((min_refresh_in_uhz / 1000000) >
647 ((nominal_field_rate_in_uhz + 1000000 - 1) / 1000000))
648 nominal_field_rate_in_range = false;
649
650 // Full range may be larger than current video timing, so cap at nominal 640 // Full range may be larger than current video timing, so cap at nominal
651 if (min_refresh_in_uhz > nominal_field_rate_in_uhz) 641 if (min_refresh_in_uhz > nominal_field_rate_in_uhz)
652 min_refresh_in_uhz = nominal_field_rate_in_uhz; 642 min_refresh_in_uhz = nominal_field_rate_in_uhz;
@@ -658,10 +648,14 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
658 648
659 in_out_vrr->state = in_config->state; 649 in_out_vrr->state = in_config->state;
660 650
661 if ((in_config->state == VRR_STATE_UNSUPPORTED) || 651 if (in_config->state == VRR_STATE_UNSUPPORTED) {
662 (!nominal_field_rate_in_range)) {
663 in_out_vrr->state = VRR_STATE_UNSUPPORTED; 652 in_out_vrr->state = VRR_STATE_UNSUPPORTED;
664 in_out_vrr->supported = false; 653 in_out_vrr->supported = false;
654 in_out_vrr->adjust.v_total_min = stream->timing.v_total;
655 in_out_vrr->adjust.v_total_max = stream->timing.v_total;
656
657 return;
658
665 } else { 659 } else {
666 in_out_vrr->min_refresh_in_uhz = min_refresh_in_uhz; 660 in_out_vrr->min_refresh_in_uhz = min_refresh_in_uhz;
667 in_out_vrr->max_duration_in_us = 661 in_out_vrr->max_duration_in_us =