diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4706-drm-amd-display-Fix-screen-tearing-on-vrr-tests.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4706-drm-amd-display-Fix-screen-tearing-on-vrr-tests.patch | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4706-drm-amd-display-Fix-screen-tearing-on-vrr-tests.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4706-drm-amd-display-Fix-screen-tearing-on-vrr-tests.patch new file mode 100644 index 00000000..6cf94fae --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4706-drm-amd-display-Fix-screen-tearing-on-vrr-tests.patch @@ -0,0 +1,122 @@ +From 55df5456b6e72138acecde21cccf513b9315655d Mon Sep 17 00:00:00 2001 +From: Amanda Liu <amanda.liu@amd.com> +Date: Fri, 15 Nov 2019 17:07:27 -0500 +Subject: [PATCH 4706/4736] drm/amd/display: Fix screen tearing on vrr tests + +[Why] +Screen tearing is present in tests when setting the frame rate to +certain fps + +[How] +Revert previous optimizations for low frame rates. + +Signed-off-by: Amanda Liu <amanda.liu@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + .../amd/display/modules/freesync/freesync.c | 32 ++++++++----------- + .../amd/display/modules/inc/mod_freesync.h | 1 - + 2 files changed, 13 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 52c8edbde2c4..40ffed098e79 100644 +--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c ++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +@@ -35,8 +35,8 @@ + #define STATIC_SCREEN_RAMP_DELTA_REFRESH_RATE_PER_FRAME ((1000 / 60) * 65) + /* Number of elements in the render times cache array */ + #define RENDER_TIMES_MAX_COUNT 10 +-/* Threshold to exit/exit BTR (to avoid frequent enter-exits at the lower limit) */ +-#define BTR_MAX_MARGIN 2500 ++/* 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*/ +@@ -252,22 +252,24 @@ static void apply_below_the_range(struct core_freesync *core_freesync, + unsigned int delta_from_mid_point_in_us_1 = 0xFFFFFFFF; + unsigned int delta_from_mid_point_in_us_2 = 0xFFFFFFFF; + 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; +- unsigned int max_render_time_in_us = +- in_out_vrr->max_duration_in_us - in_out_vrr->btr.margin_in_us; ++ ++ min_frame_duration_in_ns = ((unsigned int) (div64_u64( ++ (1000000000ULL * 1000000), ++ in_out_vrr->max_refresh_in_uhz))); + + /* Program BTR */ +- if ((last_render_time_in_us + in_out_vrr->btr.margin_in_us / 2) < max_render_time_in_us) { ++ if (last_render_time_in_us + BTR_EXIT_MARGIN < max_render_time_in_us) { + /* Exit Below the Range */ + if (in_out_vrr->btr.btr_active) { + in_out_vrr->btr.frame_counter = 0; + in_out_vrr->btr.btr_active = false; + } +- } else if (last_render_time_in_us > (max_render_time_in_us + in_out_vrr->btr.margin_in_us / 2)) { ++ } else if (last_render_time_in_us > max_render_time_in_us) { + /* Enter Below the Range */ +- if (!in_out_vrr->btr.btr_active) { +- in_out_vrr->btr.btr_active = true; +- } ++ in_out_vrr->btr.btr_active = true; + } + + /* BTR set to "not active" so disengage */ +@@ -323,9 +325,7 @@ 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 ((frame_time_in_us / mid_point_frames_ceil) > in_out_vrr->min_duration_in_us && +- (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2 || +- mid_point_frames_floor < 2)) { ++ if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { + frames_to_insert = mid_point_frames_ceil; + delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - + delta_from_mid_point_in_us_1; +@@ -341,7 +341,7 @@ static void apply_below_the_range(struct core_freesync *core_freesync, + 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) < +- max_render_time_in_us) && ++ 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; +@@ -794,11 +794,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync, + refresh_range = in_out_vrr->max_refresh_in_uhz - + in_out_vrr->min_refresh_in_uhz; + +- in_out_vrr->btr.margin_in_us = in_out_vrr->max_duration_in_us - +- 2 * in_out_vrr->min_duration_in_us; +- if (in_out_vrr->btr.margin_in_us > BTR_MAX_MARGIN) +- in_out_vrr->btr.margin_in_us = BTR_MAX_MARGIN; +- + in_out_vrr->supported = true; + } + +@@ -814,7 +809,6 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync, + in_out_vrr->btr.inserted_duration_in_us = 0; + in_out_vrr->btr.frames_to_insert = 0; + in_out_vrr->btr.frame_counter = 0; +- + in_out_vrr->btr.mid_point_in_us = + (in_out_vrr->min_duration_in_us + + in_out_vrr->max_duration_in_us) / 2; +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 dbe7835aabcf..dc187844d10b 100644 +--- a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h ++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h +@@ -92,7 +92,6 @@ struct mod_vrr_params_btr { + uint32_t inserted_duration_in_us; + uint32_t frames_to_insert; + uint32_t frame_counter; +- uint32_t margin_in_us; + }; + + struct mod_vrr_params_fixed_refresh { +-- +2.17.1 + |