diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1638-drm-amd-display-Add-a-hysteresis-to-BTR-frame-multip.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1638-drm-amd-display-Add-a-hysteresis-to-BTR-frame-multip.patch | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1638-drm-amd-display-Add-a-hysteresis-to-BTR-frame-multip.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1638-drm-amd-display-Add-a-hysteresis-to-BTR-frame-multip.patch new file mode 100644 index 00000000..116ed1d0 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1638-drm-amd-display-Add-a-hysteresis-to-BTR-frame-multip.patch @@ -0,0 +1,76 @@ +From 014398385e1a5962d508442782a6a60429341b72 Mon Sep 17 00:00:00 2001 +From: Aric Cyr <aric.cyr@amd.com> +Date: Fri, 1 Mar 2019 10:24:37 -0500 +Subject: [PATCH 1638/2940] drm/amd/display: Add a hysteresis to BTR frame + multiplier + +[Why] +Flickering is observed on some displays when the number of inserted BTR +frames changes frequently. + +[How] +Add in a margin of drift to prevent the inserted number of frames from +jumping around too frequently. + +Change-Id: I592ce229f93faa74b5baa2e43a89c9e5a6174103 +Signed-off-by: Aric Cyr <aric.cyr@amd.com> +Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + .../amd/display/modules/freesync/freesync.c | 24 +++++++++++++++++-- + 1 file changed, 22 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +index bfd27f10879e..5f493e9d6bbb 100644 +--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c ++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +@@ -37,6 +37,8 @@ + #define RENDER_TIMES_MAX_COUNT 10 + /* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */ + #define BTR_EXIT_MARGIN 2000 ++/* Threshold to change BTR multiplier (to avoid frequent changes) */ ++#define BTR_DRIFT_MARGIN 2000 + /*Threshold to exit fixed refresh rate*/ + #define FIXED_REFRESH_EXIT_MARGIN_IN_HZ 4 + /* Number of consecutive frames to check before entering/exiting fixed refresh*/ +@@ -248,6 +250,7 @@ static void apply_below_the_range(struct core_freesync *core_freesync, + unsigned int frames_to_insert = 0; + unsigned int min_frame_duration_in_ns = 0; + unsigned int max_render_time_in_us = in_out_vrr->max_duration_in_us; ++ unsigned int delta_from_mid_point_delta_in_us; + + min_frame_duration_in_ns = ((unsigned int) (div64_u64( + (1000000000ULL * 1000000), +@@ -318,10 +321,27 @@ static void apply_below_the_range(struct core_freesync *core_freesync, + /* Choose number of frames to insert based on how close it + * can get to the mid point of the variable range. + */ +- if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) ++ if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { + frames_to_insert = mid_point_frames_ceil; +- else ++ delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - ++ delta_from_mid_point_in_us_1; ++ } else { + frames_to_insert = mid_point_frames_floor; ++ delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 - ++ delta_from_mid_point_in_us_2; ++ } ++ ++ /* Prefer current frame multiplier when BTR is enabled unless it drifts ++ * too far from the midpoint ++ */ ++ if (in_out_vrr->btr.frames_to_insert != 0 && ++ delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) { ++ if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) < ++ in_out_vrr->max_duration_in_us) && ++ ((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) > ++ in_out_vrr->min_duration_in_us)) ++ frames_to_insert = in_out_vrr->btr.frames_to_insert; ++ } + + /* Either we've calculated the number of frames to insert, + * or we need to insert min duration frames +-- +2.17.1 + |