Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 drivers/gpu/drm/amd/lib/chash.c | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/lib/chash.c b/drivers/gpu/drm/amd/lib/chash.c
index 1bc4287..e07e6f3 100644
--- a/drivers/gpu/drm/amd/lib/chash.c
+++ b/drivers/gpu/drm/amd/lib/chash.c
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/sched/clock.h>
+#include <asm/div64.h>
 #include <linux/chash.h>
 
 /**
@@ -70,9 +71,21 @@ EXPORT_SYMBOL(chash_table_free);
 #ifdef CONFIG_CHASH_STATS
 
 #define DIV_FRAC(nom, denom, quot, frac, frac_digits) do {             \
-               (quot) = (nom) / (denom);                               \
-               (frac) = ((nom) % (denom) * (frac_digits) +             \
-                         (denom) / 2) / (denom);                       \
+               u64 __nom = (nom);                                      \
+               u64 __denom = (denom);                                  \
+               u64 __quot, __frac;                                     \
+               u32 __rem;                                              \
+                                                                       \
+               while (__denom >> 32) {                                 \
+                       __nom   >>= 1;                                  \
+                       __denom >>= 1;                                  \
+               }                                                       \
+               __quot = __nom;                                         \
+               __rem  = do_div(__quot, __denom);                       \
+               __frac = __rem * (frac_digits) + (__denom >> 1);        \
+               do_div(__frac, __denom);                                \
+               (quot) = __quot;                                        \
+               (frac) = __frac;                                        \
        } while (0)
 
 void __chash_table_dump_stats(struct __chash_table *table)
@@ -562,7 +575,7 @@ module_param_named(test_iters, chash_test_iters, ulong, 
0444);
 static int __init chash_init(void)
 {
        int ret;
-       u64 ts1_ns, ts_delta_us;
+       u64 ts1_ns;
 
        /* Skip self test on user errors */
        if (chash_test_bits < 4 || chash_test_bits > 20) {
@@ -603,10 +616,13 @@ static int __init chash_init(void)
                              chash_test_minfill, chash_test_maxfill,
                              chash_test_iters);
        if (!ret) {
-               ts_delta_us = (local_clock() - ts1_ns) / 1000;
+               u64 ts_delta_us = local_clock() - ts1_ns;
+               u64 iters_per_second = (u64)chash_test_iters * 1000000;
+
+               do_div(ts_delta_us, 1000);
+               do_div(iters_per_second, ts_delta_us);
                pr_info("chash: self test took %llu us, %llu iterations/s\n",
-                       ts_delta_us,
-                       (u64)chash_test_iters * 1000000 / ts_delta_us);
+                       ts_delta_us, iters_per_second);
        } else {
                pr_err("chash: self test failed: %d\n", ret);
        }
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to