diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4207-drm-amd-display-Fix-bug-that-causes-black-screen.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4207-drm-amd-display-Fix-bug-that-causes-black-screen.patch | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4207-drm-amd-display-Fix-bug-that-causes-black-screen.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4207-drm-amd-display-Fix-bug-that-causes-black-screen.patch new file mode 100644 index 00000000..3f646100 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4207-drm-amd-display-Fix-bug-that-causes-black-screen.patch @@ -0,0 +1,70 @@ +From f2cb2d95721f2c9a9f59fd999eb06a2bac93c41e Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Wed, 4 Apr 2018 21:04:42 -0400 +Subject: [PATCH 4207/5725] 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> +--- + .../gpu/drm/amd/display/modules/freesync/freesync.c | 18 ++++++------------ + 1 file 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 be6a6c6..4887c88 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, + { + struct core_freesync *core_freesync = NULL; + unsigned long long nominal_field_rate_in_uhz = 0; +- bool nominal_field_rate_in_range = true; + unsigned int refresh_range = 0; + unsigned int min_refresh_in_uhz = 0; + unsigned int max_refresh_in_uhz = 0; +@@ -638,15 +637,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync, + if (max_refresh_in_uhz > nominal_field_rate_in_uhz) + max_refresh_in_uhz = nominal_field_rate_in_uhz; + +- /* Allow for some rounding error of actual video timing by taking ceil. +- * For example, 144 Hz mode timing may actually be 143.xxx Hz when +- * calculated from pixel rate and vertical/horizontal totals, but +- * this should be allowed instead of blocking FreeSync. +- */ +- if ((min_refresh_in_uhz / 1000000) > +- ((nominal_field_rate_in_uhz + 1000000 - 1) / 1000000)) +- nominal_field_rate_in_range = false; +- + // Full range may be larger than current video timing, so cap at nominal + if (min_refresh_in_uhz > nominal_field_rate_in_uhz) + min_refresh_in_uhz = nominal_field_rate_in_uhz; +@@ -658,10 +648,14 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync, + + in_out_vrr->state = in_config->state; + +- if ((in_config->state == VRR_STATE_UNSUPPORTED) || +- (!nominal_field_rate_in_range)) { ++ if (in_config->state == VRR_STATE_UNSUPPORTED) { + in_out_vrr->state = VRR_STATE_UNSUPPORTED; + in_out_vrr->supported = false; ++ in_out_vrr->adjust.v_total_min = stream->timing.v_total; ++ in_out_vrr->adjust.v_total_max = stream->timing.v_total; ++ ++ return; ++ + } else { + in_out_vrr->min_refresh_in_uhz = min_refresh_in_uhz; + in_out_vrr->max_duration_in_us = +-- +2.7.4 + |