aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch
new file mode 100644
index 00000000..f6936ba8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0558-drm-amd-display-add-hyst-frames-for-fixed-refresh.patch
@@ -0,0 +1,168 @@
+From fdd381953a0a247c7917c8243310cc9b58cb9657 Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Tue, 27 Jun 2017 13:27:00 -0400
+Subject: [PATCH 0558/4131] drm/amd/display: add hyst frames for fixed refresh
+
+Signed-off-by: Anthony Koo <anthony.koo@amd.com>
+Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/display/modules/freesync/freesync.c | 56 ++++++++++++++--------
+ 1 file changed, 36 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 7109742..c7da90f 100644
+--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+@@ -37,6 +37,9 @@
+ #define RENDER_TIMES_MAX_COUNT 20
+ /* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */
+ #define BTR_EXIT_MARGIN 2000
++/* Number of consecutive frames to check before entering/exiting fixed refresh*/
++#define FIXED_REFRESH_ENTER_FRAME_COUNT 5
++#define FIXED_REFRESH_EXIT_FRAME_COUNT 5
+
+ #define FREESYNC_REGISTRY_NAME "freesync_v1"
+
+@@ -72,8 +75,9 @@ struct below_the_range {
+ };
+
+ struct fixed_refresh {
+- bool fixed_refresh_active;
+- bool program_fixed_refresh;
++ bool fixed_active;
++ bool program_fixed;
++ unsigned int frame_counter;
+ };
+
+ struct freesync_range {
+@@ -168,8 +172,8 @@ struct mod_freesync *mod_freesync_create(struct dc *dc)
+ /* Create initial module folder in registry for freesync enable data */
+ flag.save_per_edid = true;
+ flag.save_per_link = false;
+- dm_write_persistent_data(core_dc->ctx, NULL, FREESYNC_REGISTRY_NAME, NULL, NULL,
+- 0, &flag);
++ dm_write_persistent_data(core_dc->ctx, NULL, FREESYNC_REGISTRY_NAME,
++ NULL, NULL, 0, &flag);
+ flag.save_per_edid = false;
+ flag.save_per_link = false;
+ if (dm_read_persistent_data(core_dc->ctx, NULL, NULL,
+@@ -422,7 +426,7 @@ static void calc_freesync_range(struct core_freesync *core_freesync,
+ min_frame_duration_in_ns) * stream->timing.pix_clk_khz),
+ stream->timing.h_total), 1000000);
+
+- /* In case of 4k free sync monitor, vmin or vmax cannot be less than vtotal */
++ /* vmin/vmax cannot be less than vtotal */
+ if (state->freesync_range.vmin < vtotal) {
+ /* Error of 1 is permissible */
+ ASSERT((state->freesync_range.vmin + 1) >= vtotal);
+@@ -553,8 +557,8 @@ static void reset_freesync_state_variables(struct freesync_state* state)
+ state->btr.inserted_frame_duration_in_us = 0;
+ state->btr.program_btr = false;
+
+- state->fixed_refresh.fixed_refresh_active = false;
+- state->fixed_refresh.program_fixed_refresh = false;
++ state->fixed_refresh.fixed_active = false;
++ state->fixed_refresh.program_fixed = false;
+ }
+ /*
+ * Sets freesync mode on a stream depending on current freesync state.
+@@ -594,7 +598,7 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync,
+ if (core_freesync->map[map_index].user_enable.
+ enable_for_gaming == true &&
+ state->fullscreen == true &&
+- state->fixed_refresh.fixed_refresh_active == false) {
++ state->fixed_refresh.fixed_active == false) {
+ /* Enable freesync */
+
+ v_total_min = state->freesync_range.vmin;
+@@ -1240,29 +1244,39 @@ static void update_timestamps(struct core_freesync *core_freesync,
+ state->btr.frame_counter = 0;
+
+ /* Exit Fixed Refresh mode */
+- } else if (state->fixed_refresh.fixed_refresh_active) {
++ } else if (state->fixed_refresh.fixed_active) {
+
+- state->fixed_refresh.program_fixed_refresh = true;
+- state->fixed_refresh.fixed_refresh_active = false;
++ state->fixed_refresh.frame_counter++;
+
++ if (state->fixed_refresh.frame_counter >
++ FIXED_REFRESH_EXIT_FRAME_COUNT) {
++ state->fixed_refresh.frame_counter = 0;
++ state->fixed_refresh.program_fixed = true;
++ state->fixed_refresh.fixed_active = false;
++ }
+ }
+
+ } else if (last_render_time_in_us > state->time.max_render_time_in_us) {
+
+ /* Enter Below the Range */
+ if (!state->btr.btr_active &&
+- core_freesync->map[map_index].caps->btr_supported) {
++ core_freesync->map[map_index].caps->btr_supported) {
+
+ state->btr.program_btr = true;
+ state->btr.btr_active = true;
+
+ /* Enter Fixed Refresh mode */
+- } else if (!state->fixed_refresh.fixed_refresh_active &&
++ } else if (!state->fixed_refresh.fixed_active &&
+ !core_freesync->map[map_index].caps->btr_supported) {
+
+- state->fixed_refresh.program_fixed_refresh = true;
+- state->fixed_refresh.fixed_refresh_active = true;
++ state->fixed_refresh.frame_counter++;
+
++ if (state->fixed_refresh.frame_counter >
++ FIXED_REFRESH_ENTER_FRAME_COUNT) {
++ state->fixed_refresh.frame_counter = 0;
++ state->fixed_refresh.program_fixed = true;
++ state->fixed_refresh.fixed_active = true;
++ }
+ }
+ }
+
+@@ -1316,7 +1330,8 @@ static void apply_below_the_range(struct core_freesync *core_freesync,
+
+ frame_time_in_us = last_render_time_in_us /
+ mid_point_frames_ceil;
+- delta_from_mid_point_in_us_1 = (state->btr.mid_point_in_us >
++ delta_from_mid_point_in_us_1 =
++ (state->btr.mid_point_in_us >
+ frame_time_in_us) ?
+ (state->btr.mid_point_in_us - frame_time_in_us):
+ (frame_time_in_us - state->btr.mid_point_in_us);
+@@ -1332,7 +1347,8 @@ static void apply_below_the_range(struct core_freesync *core_freesync,
+
+ frame_time_in_us = last_render_time_in_us /
+ mid_point_frames_floor;
+- delta_from_mid_point_in_us_2 = (state->btr.mid_point_in_us >
++ delta_from_mid_point_in_us_2 =
++ (state->btr.mid_point_in_us >
+ frame_time_in_us) ?
+ (state->btr.mid_point_in_us - frame_time_in_us):
+ (frame_time_in_us - state->btr.mid_point_in_us);
+@@ -1374,15 +1390,15 @@ static void apply_fixed_refresh(struct core_freesync *core_freesync,
+ unsigned int vmin = 0, vmax = 0;
+ struct freesync_state *state = &core_freesync->map[map_index].state;
+
+- if (!state->fixed_refresh.program_fixed_refresh)
++ if (!state->fixed_refresh.program_fixed)
+ return;
+
+- state->fixed_refresh.program_fixed_refresh = false;
++ state->fixed_refresh.program_fixed = false;
+
+ /* Program Fixed Refresh */
+
+ /* Fixed Refresh set to "not active" so disengage */
+- if (!state->fixed_refresh.fixed_refresh_active) {
++ if (!state->fixed_refresh.fixed_active) {
+ set_freesync_on_streams(core_freesync, &stream, 1);
+
+ /* Fixed Refresh set to "active" so engage (fix to max) */
+--
+2.7.4
+