Commit a6a80e1d authored by Linus Torvalds's avatar Linus Torvalds

Fix potential fast PIT TSC calibration startup glitch

During bootup, when we reprogram the PIT (programmable interval timer)
to start counting down from 0xffff in order to use it for the fast TSC
calibration, we should also make sure to delay a bit afterwards to allow
the PIT hardware to actually start counting with the new value.

That will happens at the next CLK pulse (1.193182 MHz), so the easiest
way to do that is to just wait at least one microsecond after
programming the new PIT counter value.  We do that by just reading the
counter value back once - which will take about 2us on PC hardware.
Reported-and-tested-by: default avatarjohn stultz <johnstul@us.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 19695ec0
...@@ -315,6 +315,15 @@ static unsigned long quick_pit_calibrate(void) ...@@ -315,6 +315,15 @@ static unsigned long quick_pit_calibrate(void)
outb(0xff, 0x42); outb(0xff, 0x42);
outb(0xff, 0x42); outb(0xff, 0x42);
/*
* The PIT starts counting at the next edge, so we
* need to delay for a microsecond. The easiest way
* to do that is to just read back the 16-bit counter
* once from the PIT.
*/
inb(0x42);
inb(0x42);
if (pit_expect_msb(0xff)) { if (pit_expect_msb(0xff)) {
int i; int i;
u64 t1, t2, delta; u64 t1, t2, delta;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment