^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012 Regents of the University of California
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/param.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/timex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * This is copies from arch/arm/include/asm/delay.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Loop (or tick) based delay:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * loops = loops_per_jiffy * jiffies_per_sec * delay_us / us_per_sec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * where:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * jiffies_per_sec = HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * us_per_sec = 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Therefore the constant part is HZ / 1000000 which is a small
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * fractional number. To make this usable with integer math, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * scale up this constant by 2^31, perform the actual multiplication,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * and scale the result back down by 2^31 with a simple shift:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * loops = (loops_per_jiffy * delay_us * UDELAY_MULT) >> 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * where:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * UDELAY_MULT = 2^31 * HZ / 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * = (2^31 / 1000000) * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * = 2147.483648 * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * = 2147 * HZ + 483648 * HZ / 1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * 31 is the biggest scale shift value that won't overflow 32 bits for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * delay_us * UDELAY_MULT assuming HZ <= 1000 and delay_us <= 2000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define MAX_UDELAY_US 2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define MAX_UDELAY_HZ 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define UDELAY_MULT (2147UL * HZ + 483648UL * HZ / 1000000UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define UDELAY_SHIFT 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #if HZ > MAX_UDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #error "HZ > MAX_UDELAY_HZ"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * RISC-V supports both UDELAY and NDELAY. This is largely the same as above,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * but with different constants. I added 10 bits to the shift to get this, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * the result is that I need a 64-bit multiply, which is slow on 32-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * platforms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * NDELAY_MULT = 2^41 * HZ / 1000000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * = (2^41 / 1000000000) * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * = 2199.02325555 * HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * = 2199 * HZ + 23255550 * HZ / 1000000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * The maximum here is to avoid 64-bit overflow, but it isn't checked as it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * won't happen.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define MAX_NDELAY_NS (1ULL << 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define MAX_NDELAY_HZ MAX_UDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define NDELAY_MULT ((unsigned long long)(2199ULL * HZ + 23255550ULL * HZ / 1000000000ULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define NDELAY_SHIFT 41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #if HZ > MAX_NDELAY_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #error "HZ > MAX_NDELAY_HZ"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) void __delay(unsigned long cycles)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u64 t0 = get_cycles();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) while ((unsigned long)(get_cycles() - t0) < cycles)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) cpu_relax();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) EXPORT_SYMBOL(__delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) void udelay(unsigned long usecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u64 ucycles = (u64)usecs * lpj_fine * UDELAY_MULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u64 n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (unlikely(usecs > MAX_UDELAY_US)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) n = (u64)usecs * riscv_timebase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) do_div(n, 1000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) __delay(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) __delay(ucycles >> UDELAY_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) EXPORT_SYMBOL(udelay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) void ndelay(unsigned long nsecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * This doesn't bother checking for overflow, as it won't happen (it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * an hour) of delay.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned long long ncycles = nsecs * lpj_fine * NDELAY_MULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) __delay(ncycles >> NDELAY_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) EXPORT_SYMBOL(ndelay);