diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4352-drm-amd-display-Correct-rounding-calcs-in-mod_freesy.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4352-drm-amd-display-Correct-rounding-calcs-in-mod_freesy.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4352-drm-amd-display-Correct-rounding-calcs-in-mod_freesy.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4352-drm-amd-display-Correct-rounding-calcs-in-mod_freesy.patch new file mode 100644 index 00000000..393b1e80 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4352-drm-amd-display-Correct-rounding-calcs-in-mod_freesy.patch @@ -0,0 +1,67 @@ +From f694980e6ab2d0658efb2f14b48c798342237276 Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Tue, 17 Apr 2018 11:40:31 -0400 +Subject: [PATCH 4352/5725] drm/amd/display: Correct rounding calcs in + mod_freesync_is_valid_range + +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 | 39 +++++++++++++++++++--- + 1 file changed, 34 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +index 349387e..769f467 100644 +--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c ++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +@@ -887,12 +887,41 @@ bool mod_freesync_is_valid_range(struct mod_freesync *mod_freesync, + unsigned long long nominal_field_rate_in_uhz = + mod_freesync_calc_nominal_field_rate(stream); + +- /* 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. ++ /* Typically nominal refresh calculated can have some fractional part. ++ * Allow for some rounding error of actual video timing by taking floor ++ * of caps and request. Round the nominal refresh rate. ++ * ++ * Dividing will convert everything to units in Hz although input ++ * variable name is in uHz! ++ * ++ * Also note, this takes care of rounding error on the nominal refresh ++ * so by rounding error we only expect it to be off by a small amount, ++ * such as < 0.1 Hz. i.e. 143.9xxx or 144.1xxx. ++ * ++ * Example 1. Caps Min = 40 Hz, Max = 144 Hz ++ * Request Min = 40 Hz, Max = 144 Hz ++ * Nominal = 143.5x Hz rounded to 144 Hz ++ * This function should allow this as valid request ++ * ++ * Example 2. Caps Min = 40 Hz, Max = 144 Hz ++ * Request Min = 40 Hz, Max = 144 Hz ++ * Nominal = 144.4x Hz rounded to 144 Hz ++ * This function should allow this as valid request ++ * ++ * Example 3. Caps Min = 40 Hz, Max = 144 Hz ++ * Request Min = 40 Hz, Max = 144 Hz ++ * Nominal = 120.xx Hz rounded to 120 Hz ++ * This function should return NOT valid since the requested ++ * max is greater than current timing's nominal ++ * ++ * Example 4. Caps Min = 40 Hz, Max = 120 Hz ++ * Request Min = 40 Hz, Max = 120 Hz ++ * Nominal = 144.xx Hz rounded to 144 Hz ++ * This function should return NOT valid since the nominal ++ * is greater than the capability's max refresh + */ +- nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, 1000000); ++ nominal_field_rate_in_uhz = ++ div_u64(nominal_field_rate_in_uhz + 500000, 1000000); + min_refresh_cap_in_uhz /= 1000000; + max_refresh_cap_in_uhz /= 1000000; + min_refresh_request_in_uhz /= 1000000; +-- +2.7.4 + |