Back to home page

OSCL-LXR

 
 

    


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)