1#include <linux/kernel.h>
2#include <linux/sched.h>
3#include <linux/init.h>
4#include <linux/module.h>
5#include <linux/timer.h>
6#include <linux/acpi_pmtmr.h>
7#include <linux/cpufreq.h>
8#include <linux/dmi.h>
9#include <linux/delay.h>
10#include <linux/clocksource.h>
11#include <linux/percpu.h>
12
13#include <asm/hpet.h>
14#include <asm/timer.h>
15#include <asm/vgtod.h>
16#include <asm/time.h>
17#include <asm/delay.h>
18#include <asm/hypervisor.h>
19
20unsigned int cpu_khz;
21EXPORT_SYMBOL(cpu_khz);
22unsigned int tsc_khz;
23EXPORT_SYMBOL(tsc_khz);
24
25
26
27
28static int tsc_unstable;
29
30
31
32
33static int tsc_disabled = -1;
34
35static int tsc_clocksource_reliable;
36
37
38
39u64 native_sched_clock(void)
40{
41 u64 this_offset;
42
43
44
45
46
47
48
49
50
51 if (unlikely(tsc_disabled)) {
52
53 return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
54 }
55
56
57 rdtscll(this_offset);
58
59
60 return __cycles_2_ns(this_offset);
61}
62
63
64
65#ifdef CONFIG_PARAVIRT
66unsigned long long sched_clock(void)
67{
68 return paravirt_sched_clock();
69}
70#else
71unsigned long long
72sched_clock(void) __attribute__((alias("native_sched_clock")));
73#endif
74
75int check_tsc_unstable(void)
76{
77 return tsc_unstable;
78}
79EXPORT_SYMBOL_GPL(check_tsc_unstable);
80
81#ifdef CONFIG_X86_TSC
82int __init notsc_setup(char *str)
83{
84 printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, "
85 "cannot disable TSC completely.\n");
86 tsc_disabled = 1;
87 return 1;
88}
89#else
90
91
92
93
94int __init notsc_setup(char *str)
95{
96 setup_clear_cpu_cap(X86_FEATURE_TSC);
97 return 1;
98}
99#endif
100
101__setup("notsc", notsc_setup);
102
103static int __init tsc_setup(char *str)
104{
105 if (!strcmp(str, "reliable"))
106 tsc_clocksource_reliable = 1;
107 return 1;
108}
109
110__setup("tsc=", tsc_setup);
111
112#define MAX_RETRIES 5
113#define SMI_TRESHOLD 50000
114
115
116
117
118static u64 tsc_read_refs(u64 *p, int hpet)
119{
120 u64 t1, t2;
121 int i;
122
123 for (i = 0; i < MAX_RETRIES; i++) {
124 t1 = get_cycles();
125 if (hpet)
126 *p = hpet_readl(HPET_COUNTER) & 0xFFFFFFFF;
127 else
128 *p = acpi_pm_read_early();
129 t2 = get_cycles();
130 if ((t2 - t1) < SMI_TRESHOLD)
131 return t2;
132 }
133 return ULLONG_MAX;
134}
135
136
137
138
139static unsigned long calc_hpet_ref(u64 deltatsc, u64 hpet1, u64 hpet2)
140{
141 u64 tmp;
142
143 if (hpet2 < hpet1)
144 hpet2 += 0x100000000ULL;
145 hpet2 -= hpet1;
146 tmp = ((u64)hpet2 * hpet_readl(HPET_PERIOD));
147 do_div(tmp, 1000000);
148 do_div(deltatsc, tmp);
149
150 return (unsigned long) deltatsc;
151}
152
153
154
155
156static unsigned long calc_pmtimer_ref(u64 deltatsc, u64 pm1, u64 pm2)
157{
158 u64 tmp;
159
160 if (!pm1 && !pm2)
161 return ULONG_MAX;
162
163 if (pm2 < pm1)
164 pm2 += (u64)ACPI_PM_OVRRUN;
165 pm2 -= pm1;
166 tmp = pm2 * 1000000000LL;
167 do_div(tmp, PMTMR_TICKS_PER_SEC);
168 do_div(deltatsc, tmp);
169
170 return (unsigned long) deltatsc;
171}
172
173#define CAL_MS 10
174#define CAL_LATCH (CLOCK_TICK_RATE / (1000 / CAL_MS))
175#define CAL_PIT_LOOPS 1000
176
177#define CAL2_MS 50
178#define CAL2_LATCH (CLOCK_TICK_RATE / (1000 / CAL2_MS))
179#define CAL2_PIT_LOOPS 5000
180
181
182
183
184
185
186
187
188
189static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin)
190{
191 u64 tsc, t1, t2, delta;
192 unsigned long tscmin, tscmax;
193 int pitcnt;
194
195
196 outb((inb(0x61) & ~0x02) | 0x01, 0x61);
197
198
199
200
201
202
203 outb(0xb0, 0x43);
204 outb(latch & 0xff, 0x42);
205 outb(latch >> 8, 0x42);
206
207 tsc = t1 = t2 = get_cycles();
208
209 pitcnt = 0;
210 tscmax = 0;
211 tscmin = ULONG_MAX;
212 while ((inb(0x61) & 0x20) == 0) {
213 t2 = get_cycles();
214 delta = t2 - tsc;
215 tsc = t2;
216 if ((unsigned long) delta < tscmin)
217 tscmin = (unsigned int) delta;
218 if ((unsigned long) delta > tscmax)
219 tscmax = (unsigned int) delta;
220 pitcnt++;
221 }
222
223
224
225
226
227
228
229
230
231
232 if (pitcnt < loopmin || tscmax > 10 * tscmin)
233 return ULONG_MAX;
234
235
236 delta = t2 - t1;
237 do_div(delta, ms);
238 return delta;
239}
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
277{
278 int count;
279 u64 tsc = 0;
280
281 for (count = 0; count < 50000; count++) {
282
283 inb(0x42);
284 if (inb(0x42) != val)
285 break;
286 tsc = get_cycles();
287 }
288 *deltap = get_cycles() - tsc;
289 *tscp = tsc;
290
291
292
293
294
295 return count > 5;
296}
297
298
299
300
301
302
303
304#define MAX_QUICK_PIT_MS 25
305#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
306
307static unsigned long quick_pit_calibrate(void)
308{
309 int i;
310 u64 tsc, delta;
311 unsigned long d1, d2;
312
313
314 outb((inb(0x61) & ~0x02) | 0x01, 0x61);
315
316
317
318
319
320
321
322
323
324
325 outb(0xb0, 0x43);
326
327
328 outb(0xff, 0x42);
329 outb(0xff, 0x42);
330
331
332
333
334
335
336
337 inb(0x42);
338 inb(0x42);
339
340 if (pit_expect_msb(0xff, &tsc, &d1)) {
341 for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
342 if (!pit_expect_msb(0xff-i, &delta, &d2))
343 break;
344
345
346
347
348 delta -= tsc;
349 if (d1+d2 < delta >> 11)
350 goto success;
351 }
352 }
353 printk("Fast TSC calibration failed\n");
354 return 0;
355
356success:
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372 delta += (long)(d2 - d1)/2;
373 delta *= PIT_TICK_RATE;
374 do_div(delta, i*256*1000);
375 printk("Fast TSC calibration using PIT\n");
376 return delta;
377}
378
379
380
381
382unsigned long native_calibrate_tsc(void)
383{
384 u64 tsc1, tsc2, delta, ref1, ref2;
385 unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX;
386 unsigned long flags, latch, ms, fast_calibrate, tsc_khz;
387 int hpet = is_hpet_enabled(), i, loopmin;
388
389 tsc_khz = get_hypervisor_tsc_freq();
390 if (tsc_khz) {
391 printk(KERN_INFO "TSC: Frequency read from the hypervisor\n");
392 return tsc_khz;
393 }
394
395 local_irq_save(flags);
396 fast_calibrate = quick_pit_calibrate();
397 local_irq_restore(flags);
398 if (fast_calibrate)
399 return fast_calibrate;
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427 latch = CAL_LATCH;
428 ms = CAL_MS;
429 loopmin = CAL_PIT_LOOPS;
430
431 for (i = 0; i < 3; i++) {
432 unsigned long tsc_pit_khz;
433
434
435
436
437
438
439
440 local_irq_save(flags);
441 tsc1 = tsc_read_refs(&ref1, hpet);
442 tsc_pit_khz = pit_calibrate_tsc(latch, ms, loopmin);
443 tsc2 = tsc_read_refs(&ref2, hpet);
444 local_irq_restore(flags);
445
446
447 tsc_pit_min = min(tsc_pit_min, tsc_pit_khz);
448
449
450 if (!hpet && !ref1 && !ref2)
451 continue;
452
453
454 if (tsc1 == ULLONG_MAX || tsc2 == ULLONG_MAX)
455 continue;
456
457 tsc2 = (tsc2 - tsc1) * 1000000LL;
458 if (hpet)
459 tsc2 = calc_hpet_ref(tsc2, ref1, ref2);
460 else
461 tsc2 = calc_pmtimer_ref(tsc2, ref1, ref2);
462
463 tsc_ref_min = min(tsc_ref_min, (unsigned long) tsc2);
464
465
466 delta = ((u64) tsc_pit_min) * 100;
467 do_div(delta, tsc_ref_min);
468
469
470
471
472
473
474
475 if (delta >= 90 && delta <= 110) {
476 printk(KERN_INFO
477 "TSC: PIT calibration matches %s. %d loops\n",
478 hpet ? "HPET" : "PMTIMER", i + 1);
479 return tsc_ref_min;
480 }
481
482
483
484
485
486
487
488 if (i == 1 && tsc_pit_min == ULONG_MAX) {
489 latch = CAL2_LATCH;
490 ms = CAL2_MS;
491 loopmin = CAL2_PIT_LOOPS;
492 }
493 }
494
495
496
497
498 if (tsc_pit_min == ULONG_MAX) {
499
500 printk(KERN_WARNING "TSC: Unable to calibrate against PIT\n");
501
502
503 if (!hpet && !ref1 && !ref2) {
504 printk("TSC: No reference (HPET/PMTIMER) available\n");
505 return 0;
506 }
507
508
509 if (tsc_ref_min == ULONG_MAX) {
510 printk(KERN_WARNING "TSC: HPET/PMTIMER calibration "
511 "failed.\n");
512 return 0;
513 }
514
515
516 printk(KERN_INFO "TSC: using %s reference calibration\n",
517 hpet ? "HPET" : "PMTIMER");
518
519 return tsc_ref_min;
520 }
521
522
523 if (!hpet && !ref1 && !ref2) {
524 printk(KERN_INFO "TSC: Using PIT calibration value\n");
525 return tsc_pit_min;
526 }
527
528
529 if (tsc_ref_min == ULONG_MAX) {
530 printk(KERN_WARNING "TSC: HPET/PMTIMER calibration failed. "
531 "Using PIT calibration\n");
532 return tsc_pit_min;
533 }
534
535
536
537
538
539
540 printk(KERN_WARNING "TSC: PIT calibration deviates from %s: %lu %lu.\n",
541 hpet ? "HPET" : "PMTIMER", tsc_pit_min, tsc_ref_min);
542 printk(KERN_INFO "TSC: Using PIT calibration value\n");
543 return tsc_pit_min;
544}
545
546#ifdef CONFIG_X86_32
547
548int recalibrate_cpu_khz(void)
549{
550#ifndef CONFIG_SMP
551 unsigned long cpu_khz_old = cpu_khz;
552
553 if (cpu_has_tsc) {
554 tsc_khz = calibrate_tsc();
555 cpu_khz = tsc_khz;
556 cpu_data(0).loops_per_jiffy =
557 cpufreq_scale(cpu_data(0).loops_per_jiffy,
558 cpu_khz_old, cpu_khz);
559 return 0;
560 } else
561 return -ENODEV;
562#else
563 return -ENODEV;
564#endif
565}
566
567EXPORT_SYMBOL(recalibrate_cpu_khz);
568
569#endif
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593DEFINE_PER_CPU(unsigned long, cyc2ns);
594
595static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
596{
597 unsigned long long tsc_now, ns_now;
598 unsigned long flags, *scale;
599
600 local_irq_save(flags);
601 sched_clock_idle_sleep_event();
602
603 scale = &per_cpu(cyc2ns, cpu);
604
605 rdtscll(tsc_now);
606 ns_now = __cycles_2_ns(tsc_now);
607
608 if (cpu_khz)
609 *scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz;
610
611 sched_clock_idle_wakeup_event(0);
612 local_irq_restore(flags);
613}
614
615#ifdef CONFIG_CPU_FREQ
616
617
618
619
620
621
622
623
624
625
626
627
628static unsigned int ref_freq;
629static unsigned long loops_per_jiffy_ref;
630static unsigned long tsc_khz_ref;
631
632static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
633 void *data)
634{
635 struct cpufreq_freqs *freq = data;
636 unsigned long *lpj, dummy;
637
638 if (cpu_has(&cpu_data(freq->cpu), X86_FEATURE_CONSTANT_TSC))
639 return 0;
640
641 lpj = &dummy;
642 if (!(freq->flags & CPUFREQ_CONST_LOOPS))
643#ifdef CONFIG_SMP
644 lpj = &cpu_data(freq->cpu).loops_per_jiffy;
645#else
646 lpj = &boot_cpu_data.loops_per_jiffy;
647#endif
648
649 if (!ref_freq) {
650 ref_freq = freq->old;
651 loops_per_jiffy_ref = *lpj;
652 tsc_khz_ref = tsc_khz;
653 }
654 if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) ||
655 (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
656 (val == CPUFREQ_RESUMECHANGE)) {
657 *lpj = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
658
659 tsc_khz = cpufreq_scale(tsc_khz_ref, ref_freq, freq->new);
660 if (!(freq->flags & CPUFREQ_CONST_LOOPS))
661 mark_tsc_unstable("cpufreq changes");
662 }
663
664 set_cyc2ns_scale(tsc_khz, freq->cpu);
665
666 return 0;
667}
668
669static struct notifier_block time_cpufreq_notifier_block = {
670 .notifier_call = time_cpufreq_notifier
671};
672
673static int __init cpufreq_tsc(void)
674{
675 if (!cpu_has_tsc)
676 return 0;
677 if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
678 return 0;
679 cpufreq_register_notifier(&time_cpufreq_notifier_block,
680 CPUFREQ_TRANSITION_NOTIFIER);
681 return 0;
682}
683
684core_initcall(cpufreq_tsc);
685
686#endif
687
688
689
690static struct clocksource clocksource_tsc;
691
692
693
694
695
696
697
698
699
700
701
702
703
704static cycle_t read_tsc(void)
705{
706 cycle_t ret = (cycle_t)get_cycles();
707
708 return ret >= clocksource_tsc.cycle_last ?
709 ret : clocksource_tsc.cycle_last;
710}
711
712#ifdef CONFIG_X86_64
713static cycle_t __vsyscall_fn vread_tsc(void)
714{
715 cycle_t ret = (cycle_t)vget_cycles();
716
717 return ret >= __vsyscall_gtod_data.clock.cycle_last ?
718 ret : __vsyscall_gtod_data.clock.cycle_last;
719}
720#endif
721
722static struct clocksource clocksource_tsc = {
723 .name = "tsc",
724 .rating = 300,
725 .read = read_tsc,
726 .mask = CLOCKSOURCE_MASK(64),
727 .shift = 22,
728 .flags = CLOCK_SOURCE_IS_CONTINUOUS |
729 CLOCK_SOURCE_MUST_VERIFY,
730#ifdef CONFIG_X86_64
731 .vread = vread_tsc,
732#endif
733};
734
735void mark_tsc_unstable(char *reason)
736{
737 if (!tsc_unstable) {
738 tsc_unstable = 1;
739 printk("Marking TSC unstable due to %s\n", reason);
740
741 if (clocksource_tsc.mult)
742 clocksource_change_rating(&clocksource_tsc, 0);
743 else
744 clocksource_tsc.rating = 0;
745 }
746}
747
748EXPORT_SYMBOL_GPL(mark_tsc_unstable);
749
750static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d)
751{
752 printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
753 d->ident);
754 tsc_unstable = 1;
755 return 0;
756}
757
758
759static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
760 {
761 .callback = dmi_mark_tsc_unstable,
762 .ident = "IBM Thinkpad 380XD",
763 .matches = {
764 DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
765 DMI_MATCH(DMI_BOARD_NAME, "2635FA0"),
766 },
767 },
768 {}
769};
770
771static void __init check_system_tsc_reliable(void)
772{
773#ifdef CONFIG_MGEODE_LX
774
775#define RTSC_SUSP 0x100
776 unsigned long res_low, res_high;
777
778 rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
779
780 if (res_low & RTSC_SUSP)
781 tsc_clocksource_reliable = 1;
782#endif
783 if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
784 tsc_clocksource_reliable = 1;
785}
786
787
788
789
790
791__cpuinit int unsynchronized_tsc(void)
792{
793 if (!cpu_has_tsc || tsc_unstable)
794 return 1;
795
796#ifdef CONFIG_X86_SMP
797 if (apic_is_clustered_box())
798 return 1;
799#endif
800
801 if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
802 return 0;
803
804
805
806
807 if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
808
809 if (num_possible_cpus() > 1)
810 tsc_unstable = 1;
811 }
812
813 return tsc_unstable;
814}
815
816static void __init init_tsc_clocksource(void)
817{
818 clocksource_tsc.mult = clocksource_khz2mult(tsc_khz,
819 clocksource_tsc.shift);
820 if (tsc_clocksource_reliable)
821 clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
822
823 if (check_tsc_unstable()) {
824 clocksource_tsc.rating = 0;
825 clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS;
826 }
827 clocksource_register(&clocksource_tsc);
828}
829
830void __init tsc_init(void)
831{
832 u64 lpj;
833 int cpu;
834
835 if (!cpu_has_tsc)
836 return;
837
838 tsc_khz = calibrate_tsc();
839 cpu_khz = tsc_khz;
840
841 if (!tsc_khz) {
842 mark_tsc_unstable("could not calculate TSC khz");
843 return;
844 }
845
846#ifdef CONFIG_X86_64
847 if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) &&
848 (boot_cpu_data.x86_vendor == X86_VENDOR_AMD))
849 cpu_khz = calibrate_cpu();
850#endif
851
852 printk("Detected %lu.%03lu MHz processor.\n",
853 (unsigned long)cpu_khz / 1000,
854 (unsigned long)cpu_khz % 1000);
855
856
857
858
859
860
861
862 for_each_possible_cpu(cpu)
863 set_cyc2ns_scale(cpu_khz, cpu);
864
865 if (tsc_disabled > 0)
866 return;
867
868
869 tsc_disabled = 0;
870
871 lpj = ((u64)tsc_khz * 1000);
872 do_div(lpj, HZ);
873 lpj_fine = lpj;
874
875 use_tsc_delay();
876
877 dmi_check_system(bad_tsc_dmi_table);
878
879 if (unsynchronized_tsc())
880 mark_tsc_unstable("TSCs unsynchronized");
881
882 check_system_tsc_reliable();
883 init_tsc_clocksource();
884}
885
886