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