9ae3a8
From a548a4b5d3a130ada6498669b4bf01bf47fe4560 Mon Sep 17 00:00:00 2001
9ae3a8
From: Richard Jones <rjones@redhat.com>
9ae3a8
Date: Wed, 1 Nov 2017 11:33:02 +0100
9ae3a8
Subject: [PATCH 7/7] i6300esb: remove muldiv64()
9ae3a8
9ae3a8
RH-Author: Richard Jones <rjones@redhat.com>
9ae3a8
Message-id: <1509535982-27927-4-git-send-email-rjones@redhat.com>
9ae3a8
Patchwork-id: 77463
9ae3a8
O-Subject: [RHEL-7.5 qemu-kvm PATCH v3 3/3] i6300esb: remove muldiv64()
9ae3a8
Bugzilla: 1470244
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Thomas Huth <thuth@redhat.com>
9ae3a8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
9ae3a8
From: Laurent Vivier <lvivier@redhat.com>
9ae3a8
9ae3a8
Originally, timers were ticks based, and it made sense to
9ae3a8
add ticks to current time to know when to trigger an alarm.
9ae3a8
9ae3a8
But since commit:
9ae3a8
9ae3a8
7447545 change all other clock references to use nanosecond resolution accessors
9ae3a8
9ae3a8
All timers use nanoseconds and we need to convert ticks to nanoseconds, by
9ae3a8
doing something like:
9ae3a8
9ae3a8
    y = muldiv64(x, get_ticks_per_sec(), PCI_FREQUENCY)
9ae3a8
9ae3a8
where x is the number of device ticks and y the number of system ticks.
9ae3a8
9ae3a8
y is used as nanoseconds in timer functions,
9ae3a8
it works because 1 tick is 1 nanosecond.
9ae3a8
(get_ticks_per_sec() is 10^9)
9ae3a8
9ae3a8
But as PCI frequency is 33 MHz, we can also do:
9ae3a8
9ae3a8
    y = x * 30; /* 33 MHz PCI period is 30 ns */
9ae3a8
9ae3a8
Which is much more simple.
9ae3a8
9ae3a8
This implies a 33.333333 MHz PCI frequency,
9ae3a8
but this is correct.
9ae3a8
9ae3a8
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
9ae3a8
(cherry picked from commit 9491e9bc019a365dfa9780f462984a0d052f4c0d)
9ae3a8
9ae3a8
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1470244
9ae3a8
Upstream-status: 9491e9bc019a365dfa9780f462984a0d052f4c0d
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 hw/watchdog/wdt_i6300esb.c | 11 +++--------
9ae3a8
 1 file changed, 3 insertions(+), 8 deletions(-)
9ae3a8
9ae3a8
diff --git a/hw/watchdog/wdt_i6300esb.c b/hw/watchdog/wdt_i6300esb.c
9ae3a8
index fa8e3b9..6dede4e 100644
9ae3a8
--- a/hw/watchdog/wdt_i6300esb.c
9ae3a8
+++ b/hw/watchdog/wdt_i6300esb.c
9ae3a8
@@ -125,14 +125,9 @@ static void i6300esb_restart_timer(I6300State *d, int stage)
9ae3a8
     else
9ae3a8
         timeout <<= 5;
9ae3a8
 
9ae3a8
-    /* Get the timeout in units of ticks_per_sec.
9ae3a8
-     *
9ae3a8
-     * ticks_per_sec is typically 10^9 == 0x3B9ACA00 (30 bits), with
9ae3a8
-     * 20 bits of user supplied preload, and 15 bits of scale, the
9ae3a8
-     * multiply here can exceed 64-bits, before we divide by 33MHz, so
9ae3a8
-     * we use a higher-precision intermediate result.
9ae3a8
-     */
9ae3a8
-    timeout = muldiv64(timeout, get_ticks_per_sec(), 33000000);
9ae3a8
+    /* Get the timeout in nanoseconds. */
9ae3a8
+
9ae3a8
+    timeout = timeout * 30; /* on a PCI bus, 1 tick is 30 ns*/
9ae3a8
 
9ae3a8
     i6300esb_debug("stage %d, timeout %" PRIi64 "\n", d->stage, timeout);
9ae3a8
 
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8