]>
Commit | Line | Data |
---|---|---|
35728b82 TG |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
70730bca PA |
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) { | |
03f136a2 | 44 | print "/* Automatically generated by kernel/time/timeconst.bc */\n" |
70730bca PA |
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" | |
0a227985 | 55 | print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n" |
70730bca PA |
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" | |
07e5f5e3 FW |
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" | |
70730bca PA |
109 | print "\n" |
110 | ||
111 | print "#endif /* KERNEL_TIMECONST_H */\n" | |
112 | } | |
113 | halt | |
114 | } | |
115 | ||
0a227985 | 116 | hz = read(); |
70730bca | 117 | timeconst(hz) |