]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amd/display: simplify dml log2 function
authorDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Mon, 11 May 2020 14:33:58 +0000 (10:33 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 May 2020 18:00:50 +0000 (14:00 -0400)
Current implementation is slightly inaccurate and will often
result in truncation/floor operation decrementing an exact
integer output by 1.

Only rounded down output is ever expected, just extract the fp
exponent for this to increase performance and avoid any
truncation issues.

Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: Eric Bernstein <Eric.Bernstein@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h

index ab0870e2a103c71b85f0e2a98f336022db9e2e96..479d7d83220c2bf4d01e96bc8132a220d5c148e1 100644 (file)
@@ -86,9 +86,20 @@ static inline double dml_round(double a)
                return floor;
 }
 
-static inline double dml_log2(double x)
+/* float
+static inline int dml_log2(float x)
 {
-       return (double) dcn_bw_log(x, 2);
+       unsigned int ix = *((unsigned int *)&x);
+
+       return (int)((ix >> 23) & 0xff) - 127;
+}*/
+
+/* double */
+static inline int dml_log2(double x)
+{
+       unsigned long long ix = *((unsigned long long *)&x);
+
+       return (int)((ix >> 52) & 0x7ff) - 1023;
 }
 
 static inline double dml_pow(double a, int exp)
@@ -116,11 +127,6 @@ static inline double dml_floor_ex(double x, double granularity)
        return (double) dcn_bw_floor2(x, granularity);
 }
 
-static inline double dml_log(double x, double base)
-{
-       return (double) dcn_bw_log(x, base);
-}
-
 static inline unsigned int dml_round_to_multiple(unsigned int num,
                                                 unsigned int multiple,
                                                 unsigned char up)