forked from Minki/linux
[PATCH] time: re-add verify_pmtmr_rate
This patch re-adds the verify_pmtmr_rate functionality from 2.6.17 that I dropped 2.6.18. This resolves problems seen on older K6 ASUS boards where the ACPI PM timer runs too fast. See: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=211902 http://bugme.osdl.org/show_bug.cgi?id=2375 Thanks to Ian Campbell for re-reporting this and testing the fix! Signed-off-by: John Stultz <johnstul@us.ibm.com> Cc: Andi Kleen <ak@suse.de> Cc: Ian Campbell <ijc@hellion.org.uk> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a2ee8649ba
commit
562f9c574e
@ -142,6 +142,39 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE,
|
||||
acpi_pm_check_graylist);
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_X86_64
|
||||
#include "mach_timer.h"
|
||||
#define PMTMR_EXPECTED_RATE \
|
||||
((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10))
|
||||
/*
|
||||
* Some boards have the PMTMR running way too fast. We check
|
||||
* the PMTMR rate against PIT channel 2 to catch these cases.
|
||||
*/
|
||||
static int verify_pmtmr_rate(void)
|
||||
{
|
||||
u32 value1, value2;
|
||||
unsigned long count, delta;
|
||||
|
||||
mach_prepare_counter();
|
||||
value1 = read_pmtmr();
|
||||
mach_countup(&count);
|
||||
value2 = read_pmtmr();
|
||||
delta = (value2 - value1) & ACPI_PM_MASK;
|
||||
|
||||
/* Check that the PMTMR delta is within 5% of what we expect */
|
||||
if (delta < (PMTMR_EXPECTED_RATE * 19) / 20 ||
|
||||
delta > (PMTMR_EXPECTED_RATE * 21) / 20) {
|
||||
printk(KERN_INFO "PM-Timer running at invalid rate: %lu%% "
|
||||
"of normal - aborting.\n",
|
||||
100UL * delta / PMTMR_EXPECTED_RATE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define verify_pmtmr_rate() (0)
|
||||
#endif
|
||||
|
||||
static int __init init_acpi_pm_clocksource(void)
|
||||
{
|
||||
@ -173,6 +206,9 @@ static int __init init_acpi_pm_clocksource(void)
|
||||
return -ENODEV;
|
||||
|
||||
pm_good:
|
||||
if (verify_pmtmr_rate() != 0)
|
||||
return -ENODEV;
|
||||
|
||||
return clocksource_register(&clocksource_acpi_pm);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user