1*35728b82SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0 */ 2*35728b82SThomas Gleixner 35cee9645SThomas Gleixnerscale=0 45cee9645SThomas Gleixner 55cee9645SThomas Gleixnerdefine gcd(a,b) { 65cee9645SThomas Gleixner auto t; 75cee9645SThomas Gleixner while (b) { 85cee9645SThomas Gleixner t = b; 95cee9645SThomas Gleixner b = a % b; 105cee9645SThomas Gleixner a = t; 115cee9645SThomas Gleixner } 125cee9645SThomas Gleixner return a; 135cee9645SThomas Gleixner} 145cee9645SThomas Gleixner 155cee9645SThomas Gleixner/* Division by reciprocal multiplication. */ 165cee9645SThomas Gleixnerdefine fmul(b,n,d) { 175cee9645SThomas Gleixner return (2^b*n+d-1)/d; 185cee9645SThomas Gleixner} 195cee9645SThomas Gleixner 205cee9645SThomas Gleixner/* Adjustment factor when a ceiling value is used. Use as: 215cee9645SThomas Gleixner (imul * n) + (fmulxx * n + fadjxx) >> xx) */ 225cee9645SThomas Gleixnerdefine fadj(b,n,d) { 235cee9645SThomas Gleixner auto v; 245cee9645SThomas Gleixner d = d/gcd(n,d); 255cee9645SThomas Gleixner v = 2^b*(d-1)/d; 265cee9645SThomas Gleixner return v; 275cee9645SThomas Gleixner} 285cee9645SThomas Gleixner 295cee9645SThomas Gleixner/* Compute the appropriate mul/adj values as well as a shift count, 305cee9645SThomas Gleixner which brings the mul value into the range 2^b-1 <= x < 2^b. Such 315cee9645SThomas Gleixner a shift value will be correct in the signed integer range and off 325cee9645SThomas Gleixner by at most one in the upper half of the unsigned range. */ 335cee9645SThomas Gleixnerdefine fmuls(b,n,d) { 345cee9645SThomas Gleixner auto s, m; 355cee9645SThomas Gleixner for (s = 0; 1; s++) { 365cee9645SThomas Gleixner m = fmul(s,n,d); 375cee9645SThomas Gleixner if (m >= 2^(b-1)) 385cee9645SThomas Gleixner return s; 395cee9645SThomas Gleixner } 405cee9645SThomas Gleixner return 0; 415cee9645SThomas Gleixner} 425cee9645SThomas Gleixner 435cee9645SThomas Gleixnerdefine timeconst(hz) { 4403f136a2SJason A. Donenfeld print "/* Automatically generated by kernel/time/timeconst.bc */\n" 455cee9645SThomas Gleixner print "/* Time conversion constants for HZ == ", hz, " */\n" 465cee9645SThomas Gleixner print "\n" 475cee9645SThomas Gleixner 485cee9645SThomas Gleixner print "#ifndef KERNEL_TIMECONST_H\n" 495cee9645SThomas Gleixner print "#define KERNEL_TIMECONST_H\n\n" 505cee9645SThomas Gleixner 515cee9645SThomas Gleixner print "#include <linux/param.h>\n" 525cee9645SThomas Gleixner print "#include <linux/types.h>\n\n" 535cee9645SThomas Gleixner 545cee9645SThomas Gleixner print "#if HZ != ", hz, "\n" 550a227985SNicholas Mc Guire print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n" 565cee9645SThomas Gleixner print "#endif\n\n" 575cee9645SThomas Gleixner 585cee9645SThomas Gleixner if (hz < 2) { 595cee9645SThomas Gleixner print "#error Totally bogus HZ value!\n" 605cee9645SThomas Gleixner } else { 615cee9645SThomas Gleixner s=fmuls(32,1000,hz) 625cee9645SThomas Gleixner obase=16 635cee9645SThomas Gleixner print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n" 645cee9645SThomas Gleixner print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n" 655cee9645SThomas Gleixner obase=10 665cee9645SThomas Gleixner print "#define HZ_TO_MSEC_SHR32\t", s, "\n" 675cee9645SThomas Gleixner 685cee9645SThomas Gleixner s=fmuls(32,hz,1000) 695cee9645SThomas Gleixner obase=16 705cee9645SThomas Gleixner print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n" 715cee9645SThomas Gleixner print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n" 725cee9645SThomas Gleixner obase=10 735cee9645SThomas Gleixner print "#define MSEC_TO_HZ_SHR32\t", s, "\n" 745cee9645SThomas Gleixner 755cee9645SThomas Gleixner obase=10 765cee9645SThomas Gleixner cd=gcd(hz,1000) 775cee9645SThomas Gleixner print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n" 785cee9645SThomas Gleixner print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n" 795cee9645SThomas Gleixner print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n" 805cee9645SThomas Gleixner print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n" 815cee9645SThomas Gleixner print "\n" 825cee9645SThomas Gleixner 835cee9645SThomas Gleixner s=fmuls(32,1000000,hz) 845cee9645SThomas Gleixner obase=16 855cee9645SThomas Gleixner print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n" 865cee9645SThomas Gleixner print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n" 875cee9645SThomas Gleixner obase=10 885cee9645SThomas Gleixner print "#define HZ_TO_USEC_SHR32\t", s, "\n" 895cee9645SThomas Gleixner 905cee9645SThomas Gleixner s=fmuls(32,hz,1000000) 915cee9645SThomas Gleixner obase=16 925cee9645SThomas Gleixner print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n" 935cee9645SThomas Gleixner print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n" 945cee9645SThomas Gleixner obase=10 955cee9645SThomas Gleixner print "#define USEC_TO_HZ_SHR32\t", s, "\n" 965cee9645SThomas Gleixner 975cee9645SThomas Gleixner obase=10 985cee9645SThomas Gleixner cd=gcd(hz,1000000) 995cee9645SThomas Gleixner print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n" 1005cee9645SThomas Gleixner print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n" 1015cee9645SThomas Gleixner print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n" 1025cee9645SThomas Gleixner print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n" 10307e5f5e3SFrederic Weisbecker 10407e5f5e3SFrederic Weisbecker cd=gcd(hz,1000000000) 10507e5f5e3SFrederic Weisbecker print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n" 10607e5f5e3SFrederic Weisbecker print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n" 10707e5f5e3SFrederic Weisbecker print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n" 10807e5f5e3SFrederic Weisbecker print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n" 1095cee9645SThomas Gleixner print "\n" 1105cee9645SThomas Gleixner 1115cee9645SThomas Gleixner print "#endif /* KERNEL_TIMECONST_H */\n" 1125cee9645SThomas Gleixner } 1135cee9645SThomas Gleixner halt 1145cee9645SThomas Gleixner} 1155cee9645SThomas Gleixner 1160a227985SNicholas Mc Guirehz = read(); 1175cee9645SThomas Gleixnertimeconst(hz) 118