aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch117
1 files changed, 117 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch
new file mode 100644
index 00000000..fd56981a
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4205-drm-amd-display-Fix-bug-where-refresh-rate-becomes-f.patch
@@ -0,0 +1,117 @@
+From 6709907d1154021d6f4b4eb3bd5a5c424f2321ce Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Wed, 4 Apr 2018 21:01:21 -0400
+Subject: [PATCH 4205/5725] drm/amd/display: Fix bug where refresh rate becomes
+ fixed
+
+This issue occurs if refresh rate range is very small and lfc is not used.
+When frame spikes occur, refresh rate becomes fixed and will not restore properly
+
+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>
+---
+ .../drm/amd/display/modules/freesync/freesync.c | 43 ++++++++++++----------
+ .../gpu/drm/amd/display/modules/inc/mod_freesync.h | 3 ++
+ 2 files changed, 26 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+index 4af73a7..be6a6c6 100644
+--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+@@ -168,21 +168,6 @@ static unsigned int calc_v_total_from_duration(
+ return v_total;
+ }
+
+-static unsigned long long calc_nominal_field_rate(const struct dc_stream_state *stream)
+-{
+- unsigned long long nominal_field_rate_in_uhz = 0;
+-
+- /* Calculate nominal field rate for stream */
+- nominal_field_rate_in_uhz = stream->timing.pix_clk_khz;
+- nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL;
+- nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz,
+- stream->timing.h_total);
+- nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz,
+- stream->timing.v_total);
+-
+- return nominal_field_rate_in_uhz;
+-}
+-
+ static void update_v_total_for_static_ramp(
+ struct core_freesync *core_freesync,
+ const struct dc_stream_state *stream,
+@@ -441,10 +426,11 @@ static void apply_fixed_refresh(struct core_freesync *core_freesync,
+ in_out_vrr->adjust.v_total_min;
+ } else {
+ in_out_vrr->adjust.v_total_min =
+- calc_v_total_from_refresh(
+- stream, in_out_vrr->max_refresh_in_uhz);
++ 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;
++ calc_v_total_from_refresh(stream,
++ in_out_vrr->min_refresh_in_uhz);
+ }
+ }
+ }
+@@ -638,7 +624,8 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
+ core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
+
+ /* Calculate nominal field rate for stream */
+- nominal_field_rate_in_uhz = calc_nominal_field_rate(stream);
++ nominal_field_rate_in_uhz =
++ mod_freesync_calc_nominal_field_rate(stream);
+
+ min_refresh_in_uhz = in_config->min_refresh_in_uhz;
+ max_refresh_in_uhz = in_config->max_refresh_in_uhz;
+@@ -888,6 +875,22 @@ void mod_freesync_get_settings(struct mod_freesync *mod_freesync,
+ }
+ }
+
++unsigned long long mod_freesync_calc_nominal_field_rate(
++ const struct dc_stream_state *stream)
++{
++ unsigned long long nominal_field_rate_in_uhz = 0;
++
++ /* Calculate nominal field rate for stream */
++ nominal_field_rate_in_uhz = stream->timing.pix_clk_khz;
++ nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL;
++ nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz,
++ stream->timing.h_total);
++ nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz,
++ stream->timing.v_total);
++
++ return nominal_field_rate_in_uhz;
++}
++
+ bool mod_freesync_is_valid_range(struct mod_freesync *mod_freesync,
+ const struct dc_stream_state *stream,
+ uint32_t min_refresh_cap_in_uhz,
+@@ -897,7 +900,7 @@ bool mod_freesync_is_valid_range(struct mod_freesync *mod_freesync,
+ {
+ /* Calculate nominal field rate for stream */
+ unsigned long long nominal_field_rate_in_uhz =
+- calc_nominal_field_rate(stream);
++ mod_freesync_calc_nominal_field_rate(stream);
+
+ // Check nominal is within range
+ if (nominal_field_rate_in_uhz > max_refresh_cap_in_uhz ||
+diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
+index e7d77bb..85c98af 100644
+--- a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
+@@ -159,6 +159,9 @@ void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync,
+ const struct dc_stream_state *stream,
+ struct mod_vrr_params *in_out_vrr);
+
++unsigned long long mod_freesync_calc_nominal_field_rate(
++ const struct dc_stream_state *stream);
++
+ bool mod_freesync_is_valid_range(struct mod_freesync *mod_freesync,
+ const struct dc_stream_state *stream,
+ uint32_t min_refresh_cap_in_uhz,
+--
+2.7.4
+