mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[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);
|
acpi_pm_check_graylist);
|
||||||
#endif
|
#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)
|
static int __init init_acpi_pm_clocksource(void)
|
||||||
{
|
{
|
||||||
@ -173,6 +206,9 @@ static int __init init_acpi_pm_clocksource(void)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
pm_good:
|
pm_good:
|
||||||
|
if (verify_pmtmr_rate() != 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
return clocksource_register(&clocksource_acpi_pm);
|
return clocksource_register(&clocksource_acpi_pm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user