^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) scale=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) define gcd(a,b) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) auto t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) while (b) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) t = b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) b = a % b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) a = t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) return a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /* Division by reciprocal multiplication. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) define fmul(b,n,d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) return (2^b*n+d-1)/d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /* Adjustment factor when a ceiling value is used. Use as:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) (imul * n) + (fmulxx * n + fadjxx) >> xx) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) define fadj(b,n,d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) auto v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) d = d/gcd(n,d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) v = 2^b*(d-1)/d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) return v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* Compute the appropriate mul/adj values as well as a shift count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) which brings the mul value into the range 2^b-1 <= x < 2^b. Such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) a shift value will be correct in the signed integer range and off
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) by at most one in the upper half of the unsigned range. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) define fmuls(b,n,d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) auto s, m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) for (s = 0; 1; s++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) m = fmul(s,n,d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) if (m >= 2^(b-1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) return s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) define timeconst(hz) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) print "/* Automatically generated by kernel/time/timeconst.bc */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) print "/* Time conversion constants for HZ == ", hz, " */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) print "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) print "#ifndef KERNEL_TIMECONST_H\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) print "#define KERNEL_TIMECONST_H\n\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) print "#include <linux/param.h>\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) print "#include <linux/types.h>\n\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) print "#if HZ != ", hz, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) print "#endif\n\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if (hz < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) print "#error Totally bogus HZ value!\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) s=fmuls(32,1000,hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) obase=16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) s=fmuls(32,hz,1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) obase=16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) cd=gcd(hz,1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) print "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) s=fmuls(32,1000000,hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) obase=16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) print "#define HZ_TO_USEC_SHR32\t", s, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) s=fmuls(32,hz,1000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) obase=16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) print "#define USEC_TO_HZ_SHR32\t", s, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) obase=10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) cd=gcd(hz,1000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) cd=gcd(hz,1000000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) print "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) print "#endif /* KERNEL_TIMECONST_H */\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) halt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) hz = read();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) timeconst(hz)