tsc.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. /*
  2. * This code largely moved from arch/i386/kernel/timer/timer_tsc.c
  3. * which was originally moved from arch/i386/kernel/time.c.
  4. * See comments there for proper credits.
  5. */
  6. #include <linux/clocksource.h>
  7. #include <linux/workqueue.h>
  8. #include <linux/cpufreq.h>
  9. #include <linux/jiffies.h>
  10. #include <linux/init.h>
  11. #include <linux/dmi.h>
  12. #include <asm/delay.h>
  13. #include <asm/tsc.h>
  14. #include <asm/io.h>
  15. #include "mach_timer.h"
  16. /*
  17. * On some systems the TSC frequency does not
  18. * change with the cpu frequency. So we need
  19. * an extra value to store the TSC freq
  20. */
  21. unsigned int tsc_khz;
  22. unsigned long long (*custom_sched_clock)(void);
  23. int tsc_disable;
  24. #ifdef CONFIG_X86_TSC
  25. static int __init tsc_setup(char *str)
  26. {
  27. printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, "
  28. "cannot disable TSC.\n");
  29. return 1;
  30. }
  31. #else
  32. /*
  33. * disable flag for tsc. Takes effect by clearing the TSC cpu flag
  34. * in cpu/common.c
  35. */
  36. static int __init tsc_setup(char *str)
  37. {
  38. tsc_disable = 1;
  39. return 1;
  40. }
  41. #endif
  42. __setup("notsc", tsc_setup);
  43. /*
  44. * code to mark and check if the TSC is unstable
  45. * due to cpufreq or due to unsynced TSCs
  46. */
  47. static int tsc_unstable;
  48. static inline int check_tsc_unstable(void)
  49. {
  50. return tsc_unstable;
  51. }
  52. /* Accellerators for sched_clock()
  53. * convert from cycles(64bits) => nanoseconds (64bits)
  54. * basic equation:
  55. * ns = cycles / (freq / ns_per_sec)
  56. * ns = cycles * (ns_per_sec / freq)
  57. * ns = cycles * (10^9 / (cpu_khz * 10^3))
  58. * ns = cycles * (10^6 / cpu_khz)
  59. *
  60. * Then we use scaling math (suggested by george@mvista.com) to get:
  61. * ns = cycles * (10^6 * SC / cpu_khz) / SC
  62. * ns = cycles * cyc2ns_scale / SC
  63. *
  64. * And since SC is a constant power of two, we can convert the div
  65. * into a shift.
  66. *
  67. * We can use khz divisor instead of mhz to keep a better percision, since
  68. * cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits.
  69. * (mathieu.desnoyers@polymtl.ca)
  70. *
  71. * -johnstul@us.ibm.com "math is hard, lets go shopping!"
  72. */
  73. static unsigned long cyc2ns_scale __read_mostly;
  74. #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
  75. static inline void set_cyc2ns_scale(unsigned long cpu_khz)
  76. {
  77. cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR)/cpu_khz;
  78. }
  79. static inline unsigned long long cycles_2_ns(unsigned long long cyc)
  80. {
  81. return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
  82. }
  83. /*
  84. * Scheduler clock - returns current time in nanosec units.
  85. */
  86. unsigned long long sched_clock(void)
  87. {
  88. unsigned long long this_offset;
  89. if (unlikely(custom_sched_clock))
  90. return (*custom_sched_clock)();
  91. /*
  92. * Fall back to jiffies if there's no TSC available:
  93. */
  94. if (unlikely(tsc_disable))
  95. /* No locking but a rare wrong value is not a big deal: */
  96. return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
  97. /* read the Time Stamp Counter: */
  98. rdtscll(this_offset);
  99. /* return the value in ns */
  100. return cycles_2_ns(this_offset);
  101. }
  102. static unsigned long calculate_cpu_khz(void)
  103. {
  104. unsigned long long start, end;
  105. unsigned long count;
  106. u64 delta64;
  107. int i;
  108. unsigned long flags;
  109. local_irq_save(flags);
  110. /* run 3 times to ensure the cache is warm */
  111. for (i = 0; i < 3; i++) {
  112. mach_prepare_counter();
  113. rdtscll(start);
  114. mach_countup(&count);
  115. rdtscll(end);
  116. }
  117. /*
  118. * Error: ECTCNEVERSET
  119. * The CTC wasn't reliable: we got a hit on the very first read,
  120. * or the CPU was so fast/slow that the quotient wouldn't fit in
  121. * 32 bits..
  122. */
  123. if (count <= 1)
  124. goto err;
  125. delta64 = end - start;
  126. /* cpu freq too fast: */
  127. if (delta64 > (1ULL<<32))
  128. goto err;
  129. /* cpu freq too slow: */
  130. if (delta64 <= CALIBRATE_TIME_MSEC)
  131. goto err;
  132. delta64 += CALIBRATE_TIME_MSEC/2; /* round for do_div */
  133. do_div(delta64,CALIBRATE_TIME_MSEC);
  134. local_irq_restore(flags);
  135. return (unsigned long)delta64;
  136. err:
  137. local_irq_restore(flags);
  138. return 0;
  139. }
  140. int recalibrate_cpu_khz(void)
  141. {
  142. #ifndef CONFIG_SMP
  143. unsigned long cpu_khz_old = cpu_khz;
  144. if (cpu_has_tsc) {
  145. cpu_khz = calculate_cpu_khz();
  146. tsc_khz = cpu_khz;
  147. cpu_data[0].loops_per_jiffy =
  148. cpufreq_scale(cpu_data[0].loops_per_jiffy,
  149. cpu_khz_old, cpu_khz);
  150. return 0;
  151. } else
  152. return -ENODEV;
  153. #else
  154. return -ENODEV;
  155. #endif
  156. }
  157. EXPORT_SYMBOL(recalibrate_cpu_khz);
  158. void __init tsc_init(void)
  159. {
  160. if (!cpu_has_tsc || tsc_disable)
  161. goto out_no_tsc;
  162. cpu_khz = calculate_cpu_khz();
  163. tsc_khz = cpu_khz;
  164. if (!cpu_khz)
  165. goto out_no_tsc;
  166. printk("Detected %lu.%03lu MHz processor.\n",
  167. (unsigned long)cpu_khz / 1000,
  168. (unsigned long)cpu_khz % 1000);
  169. set_cyc2ns_scale(cpu_khz);
  170. use_tsc_delay();
  171. return;
  172. out_no_tsc:
  173. /*
  174. * Set the tsc_disable flag if there's no TSC support, this
  175. * makes it a fast flag for the kernel to see whether it
  176. * should be using the TSC.
  177. */
  178. tsc_disable = 1;
  179. }
  180. #ifdef CONFIG_CPU_FREQ
  181. /*
  182. * if the CPU frequency is scaled, TSC-based delays will need a different
  183. * loops_per_jiffy value to function properly.
  184. */
  185. static unsigned int ref_freq = 0;
  186. static unsigned long loops_per_jiffy_ref = 0;
  187. static unsigned long cpu_khz_ref = 0;
  188. static int
  189. time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, void *data)
  190. {
  191. struct cpufreq_freqs *freq = data;
  192. if (val != CPUFREQ_RESUMECHANGE && val != CPUFREQ_SUSPENDCHANGE)
  193. write_seqlock_irq(&xtime_lock);
  194. if (!ref_freq) {
  195. if (!freq->old){
  196. ref_freq = freq->new;
  197. goto end;
  198. }
  199. ref_freq = freq->old;
  200. loops_per_jiffy_ref = cpu_data[freq->cpu].loops_per_jiffy;
  201. cpu_khz_ref = cpu_khz;
  202. }
  203. if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) ||
  204. (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
  205. (val == CPUFREQ_RESUMECHANGE)) {
  206. if (!(freq->flags & CPUFREQ_CONST_LOOPS))
  207. cpu_data[freq->cpu].loops_per_jiffy =
  208. cpufreq_scale(loops_per_jiffy_ref,
  209. ref_freq, freq->new);
  210. if (cpu_khz) {
  211. if (num_online_cpus() == 1)
  212. cpu_khz = cpufreq_scale(cpu_khz_ref,
  213. ref_freq, freq->new);
  214. if (!(freq->flags & CPUFREQ_CONST_LOOPS)) {
  215. tsc_khz = cpu_khz;
  216. set_cyc2ns_scale(cpu_khz);
  217. /*
  218. * TSC based sched_clock turns
  219. * to junk w/ cpufreq
  220. */
  221. mark_tsc_unstable();
  222. }
  223. }
  224. }
  225. end:
  226. if (val != CPUFREQ_RESUMECHANGE && val != CPUFREQ_SUSPENDCHANGE)
  227. write_sequnlock_irq(&xtime_lock);
  228. return 0;
  229. }
  230. static struct notifier_block time_cpufreq_notifier_block = {
  231. .notifier_call = time_cpufreq_notifier
  232. };
  233. static int __init cpufreq_tsc(void)
  234. {
  235. return cpufreq_register_notifier(&time_cpufreq_notifier_block,
  236. CPUFREQ_TRANSITION_NOTIFIER);
  237. }
  238. core_initcall(cpufreq_tsc);
  239. #endif
  240. /* clock source code */
  241. static unsigned long current_tsc_khz = 0;
  242. static cycle_t read_tsc(void)
  243. {
  244. cycle_t ret;
  245. rdtscll(ret);
  246. return ret;
  247. }
  248. static struct clocksource clocksource_tsc = {
  249. .name = "tsc",
  250. .rating = 300,
  251. .read = read_tsc,
  252. .mask = CLOCKSOURCE_MASK(64),
  253. .mult = 0, /* to be set */
  254. .shift = 22,
  255. .flags = CLOCK_SOURCE_IS_CONTINUOUS |
  256. CLOCK_SOURCE_MUST_VERIFY,
  257. };
  258. void mark_tsc_unstable(void)
  259. {
  260. if (!tsc_unstable) {
  261. tsc_unstable = 1;
  262. /* Can be called before registration */
  263. if (clocksource_tsc.mult)
  264. clocksource_change_rating(&clocksource_tsc, 0);
  265. else
  266. clocksource_tsc.rating = 0;
  267. }
  268. }
  269. EXPORT_SYMBOL_GPL(mark_tsc_unstable);
  270. static int __init dmi_mark_tsc_unstable(struct dmi_system_id *d)
  271. {
  272. printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
  273. d->ident);
  274. tsc_unstable = 1;
  275. return 0;
  276. }
  277. /* List of systems that have known TSC problems */
  278. static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
  279. {
  280. .callback = dmi_mark_tsc_unstable,
  281. .ident = "IBM Thinkpad 380XD",
  282. .matches = {
  283. DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
  284. DMI_MATCH(DMI_BOARD_NAME, "2635FA0"),
  285. },
  286. },
  287. {}
  288. };
  289. /*
  290. * Make an educated guess if the TSC is trustworthy and synchronized
  291. * over all CPUs.
  292. */
  293. __cpuinit int unsynchronized_tsc(void)
  294. {
  295. if (!cpu_has_tsc || tsc_unstable)
  296. return 1;
  297. /*
  298. * Intel systems are normally all synchronized.
  299. * Exceptions must mark TSC as unstable:
  300. */
  301. if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
  302. /* assume multi socket systems are not synchronized: */
  303. if (num_possible_cpus() > 1)
  304. tsc_unstable = 1;
  305. }
  306. return tsc_unstable;
  307. }
  308. /*
  309. * Geode_LX - the OLPC CPU has a possibly a very reliable TSC
  310. */
  311. #ifdef CONFIG_MGEODE_LX
  312. /* RTSC counts during suspend */
  313. #define RTSC_SUSP 0x100
  314. static void __init check_geode_tsc_reliable(void)
  315. {
  316. unsigned long val;
  317. rdmsrl(MSR_GEODE_BUSCONT_CONF0, val);
  318. if ((val & RTSC_SUSP))
  319. clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
  320. }
  321. #else
  322. static inline void check_geode_tsc_reliable(void) { }
  323. #endif
  324. static int __init init_tsc_clocksource(void)
  325. {
  326. if (cpu_has_tsc && tsc_khz && !tsc_disable) {
  327. /* check blacklist */
  328. dmi_check_system(bad_tsc_dmi_table);
  329. unsynchronized_tsc();
  330. check_geode_tsc_reliable();
  331. current_tsc_khz = tsc_khz;
  332. clocksource_tsc.mult = clocksource_khz2mult(current_tsc_khz,
  333. clocksource_tsc.shift);
  334. /* lower the rating if we already know its unstable: */
  335. if (check_tsc_unstable()) {
  336. clocksource_tsc.rating = 0;
  337. clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS;
  338. }
  339. return clocksource_register(&clocksource_tsc);
  340. }
  341. return 0;
  342. }
  343. module_init(init_tsc_clocksource);