Patch "drm: Add drm_fixp_from_fraction and drm_fixp2int_ceil" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm: Add drm_fixp_from_fraction and drm_fixp2int_ceil
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-add-drm_fixp_from_fraction-and-drm_fixp2int_ceil.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
64566b5e767f9bc3161055ca1b443a51afb52aadMon Sep 17 00:00:00 2001
From: Harry Wentland <[email protected]>
Date: Fri, 22 Jan 2016 17:07:25 -0500
Subject: drm: Add drm_fixp_from_fraction and drm_fixp2int_ceil
From: Harry Wentland <[email protected]>
commit 64566b5e767f9bc3161055ca1b443a51afb52aad upstream.
drm_fixp_from_fraction allows us to create a fixed point directly from a fraction, rather than creating fixed point values and dividing later. This avoids overflow of our 64 bit value for large numbers.
drm_fixp2int_ceil allows us to return the ceiling of our fixed point value.
[airlied: squash Jordan's fix] 32-bit-build-fix: Jordan Lazare <[email protected]>
--- include/drm/drm_fixed.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-)
include/drm/drm_fixed.h +51 -2
@@ -73,18 +73,28 @@ static inline u32 dfixed_div(fixed20_12#define DRM_FIXED_ONE (1ULL << DRM_FIXED_POINT)#define DRM_FIXED_DECIMAL_MASK (DRM_FIXED_ONE - 1)#define DRM_FIXED_DIGITS_MASK (~DRM_FIXED_DECIMAL_MASK) +#define DRM_FIXED_EPSILON 1LL +#define DRM_FIXED_ALMOST_ONE (DRM_FIXED_ONE - DRM_FIXED_EPSILON)static inline s64 drm_int2fixp (int a) {return ((s64 )a) <<DRM_FIXED_POINT ; } -static inline int drm_fixp2int (int64_t a) +static inline int drm_fixp2int (s64 a) {return ((s64 )a) >>DRM_FIXED_POINT ; } -static inline unsigned drm_fixp_msbset (int64_t a) +static inline int drm_fixp2int_ceil (s64 a) +{ +if (a >0 ) +return drm_fixp2int (a +DRM_FIXED_ALMOST_ONE ); +else +return drm_fixp2int (a -DRM_FIXED_ALMOST_ONE ); +} + +static inline unsigned drm_fixp_msbset (s64 a) {unsigned shift, sign = (a >>63 ) &1 ;
@@ -136,6 +146,45 @@ static inline s64 drm_fixp_div(s64 a, s6return result; } +static inline s64 drm_fixp_from_fraction (s64 a,s64 b) +{ +s64 res; +bool a_neg = a <0 ; +bool b_neg = b <0 ; +u64 a_abs = a_neg ? -a : a; +u64 b_abs = b_neg ? -b : b; +u64 rem; + +/* determine integer part */ +u64 res_abs =div64_u64_rem (a_abs, b_abs, &rem); + +/* determine fractional part */ + { +u32 i =DRM_FIXED_POINT ; + +do { + rem <<=1 ; + res_abs <<=1 ; +if (rem >= b_abs) { + res_abs |=1 ; + rem -= b_abs; + } + }while (--i !=0 ); + } + +/* round up LSB */ + { +u64 summand = (rem <<1 ) >= b_abs; + + res_abs += summand; + } + + res = (s64 ) res_abs; +if (a_neg ^ b_neg) + res = -res; +return res; +} +static inline s64 drm_fixp_exp (s64 x) {s64 tolerance =div64_s64 (DRM_FIXED_ONE ,1000000 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drm-add-drm_fixp_from_fraction-and-drm_fixp2int_ceil.patch queue-4.4/drm-dp-mst-move-guid-storage-from-mgr-port-to-only-mst-branch.patch queue-4.4/drm-dp-mst-calculate-mst-pbn-with-31.32-fixed-point.patch queue-4.4/drm-dp-mst-reverse-order-of-mst-enable-and-clearing-vc-payload-table.patch