drm/i915/perf: Wrap 64bit divides in do_div()
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 23 Nov 2016 15:07:14 +0000 (15:07 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 29 Nov 2016 11:41:33 +0000 (11:41 +0000)
Just a couple of naked 64bit divides causing link errors on 32bit
builds, with:

ERROR: "__udivdi3" [drivers/gpu/drm/i915/i915.ko] undefined!

v2: do_div() is only u64/u32, we need a u32/u64!
v3: div_u64() == u64/u32, div64_u64() == u64/u64

Reported-by: kbuild test robot <fengguang.wu@intel.com>
Fixes: d79651522e89 ("drm/i915: Enable i915 perf stream for Haswell OA unit")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Robert Bragg <robert@sixbynine.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20161123150714.24449-1-chris@chris-wilson.co.uk
Reviewed-by: Robert Bragg <robert@sixbynine.org>
drivers/gpu/drm/i915/i915_perf.c

index 95512824922bcd3e8c31c2a3890ab437a351cf3c..14de9a4eee27af4d78a5842e4c7c897bbb58d58b 100644 (file)
@@ -974,8 +974,8 @@ static void i915_oa_stream_disable(struct i915_perf_stream *stream)
 
 static u64 oa_exponent_to_ns(struct drm_i915_private *dev_priv, int exponent)
 {
-       return 1000000000ULL * (2ULL << exponent) /
-               dev_priv->perf.oa.timestamp_frequency;
+       return div_u64(1000000000ULL * (2ULL << exponent),
+                      dev_priv->perf.oa.timestamp_frequency);
 }
 
 static const struct i915_perf_stream_ops i915_oa_stream_ops = {
@@ -1051,16 +1051,17 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
 
        dev_priv->perf.oa.periodic = props->oa_periodic;
        if (dev_priv->perf.oa.periodic) {
-               u64 period_ns = oa_exponent_to_ns(dev_priv,
-                                                 props->oa_period_exponent);
+               u32 tail;
 
                dev_priv->perf.oa.period_exponent = props->oa_period_exponent;
 
                /* See comment for OA_TAIL_MARGIN_NSEC for details
                 * about this tail_margin...
                 */
-               dev_priv->perf.oa.tail_margin =
-                       ((OA_TAIL_MARGIN_NSEC / period_ns) + 1) * format_size;
+               tail = div64_u64(OA_TAIL_MARGIN_NSEC,
+                                oa_exponent_to_ns(dev_priv,
+                                                  props->oa_period_exponent));
+               dev_priv->perf.oa.tail_margin = (tail + 1) * format_size;
        }
 
        if (stream->ctx) {