0001 /* SPDX-License-Identifier: GPL-2.0 */
0002
0003 scale=0
0004
0005 define gcd(a,b) {
0006 auto t;
0007 while (b) {
0008 t = b;
0009 b = a % b;
0010 a = t;
0011 }
0012 return a;
0013 }
0014
0015 /* Division by reciprocal multiplication. */
0016 define fmul(b,n,d) {
0017 return (2^b*n+d-1)/d;
0018 }
0019
0020 /* Adjustment factor when a ceiling value is used. Use as:
0021 (imul * n) + (fmulxx * n + fadjxx) >> xx) */
0022 define fadj(b,n,d) {
0023 auto v;
0024 d = d/gcd(n,d);
0025 v = 2^b*(d-1)/d;
0026 return v;
0027 }
0028
0029 /* Compute the appropriate mul/adj values as well as a shift count,
0030 which brings the mul value into the range 2^b-1 <= x < 2^b. Such
0031 a shift value will be correct in the signed integer range and off
0032 by at most one in the upper half of the unsigned range. */
0033 define fmuls(b,n,d) {
0034 auto s, m;
0035 for (s = 0; 1; s++) {
0036 m = fmul(s,n,d);
0037 if (m >= 2^(b-1))
0038 return s;
0039 }
0040 return 0;
0041 }
0042
0043 define timeconst(hz) {
0044 print "/* Automatically generated by kernel/time/timeconst.bc */\n"
0045 print "/* Time conversion constants for HZ == ", hz, " */\n"
0046 print "\n"
0047
0048 print "#ifndef KERNEL_TIMECONST_H\n"
0049 print "#define KERNEL_TIMECONST_H\n\n"
0050
0051 print "#include <linux/param.h>\n"
0052 print "#include <linux/types.h>\n\n"
0053
0054 print "#if HZ != ", hz, "\n"
0055 print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n"
0056 print "#endif\n\n"
0057
0058 if (hz < 2) {
0059 print "#error Totally bogus HZ value!\n"
0060 } else {
0061 s=fmuls(32,1000,hz)
0062 obase=16
0063 print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
0064 print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
0065 obase=10
0066 print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
0067
0068 s=fmuls(32,hz,1000)
0069 obase=16
0070 print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
0071 print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
0072 obase=10
0073 print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
0074
0075 obase=10
0076 cd=gcd(hz,1000)
0077 print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
0078 print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
0079 print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
0080 print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
0081 print "\n"
0082
0083 s=fmuls(32,1000000,hz)
0084 obase=16
0085 print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
0086 print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
0087 obase=10
0088 print "#define HZ_TO_USEC_SHR32\t", s, "\n"
0089
0090 s=fmuls(32,hz,1000000)
0091 obase=16
0092 print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
0093 print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
0094 obase=10
0095 print "#define USEC_TO_HZ_SHR32\t", s, "\n"
0096
0097 obase=10
0098 cd=gcd(hz,1000000)
0099 print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
0100 print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
0101 print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
0102 print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
0103
0104 cd=gcd(hz,1000000000)
0105 print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n"
0106 print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n"
0107 print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
0108 print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n"
0109 print "\n"
0110
0111 print "#endif /* KERNEL_TIMECONST_H */\n"
0112 }
0113 halt
0114 }
0115
0116 hz = read();
0117 timeconst(hz)