/* * 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) { cycle_t value1, value2; unsigned long count, delta; mach_prepare_counter(); value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm); mach_countup(&count); value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm); 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) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_INFO "PM-Timer running at invalid rate: %lu%% " "of normal - aborting.\n", 100UL * delta / PMTMR_EXPECTED_RATE); #else ; #endif return -1; } return 0; }
unsigned long native_calculate_cpu_khz(void) { unsigned long long start, end; unsigned long count; u64 delta64; int i; unsigned long flags; local_irq_save(flags); /* run 3 times to ensure the cache is warm */ for (i = 0; i < 3; i++) { mach_prepare_counter(); rdtscll(start); mach_countup(&count); rdtscll(end); } /* * Error: ECTCNEVERSET * The CTC wasn't reliable: we got a hit on the very first read, * or the CPU was so fast/slow that the quotient wouldn't fit in * 32 bits.. */ if (count <= 1) goto err; delta64 = end - start; /* cpu freq too fast: */ if (delta64 > (1ULL<<32)) goto err; /* cpu freq too slow: */ if (delta64 <= CALIBRATE_TIME_MSEC) goto err; delta64 += CALIBRATE_TIME_MSEC/2; /* round for do_div */ do_div(delta64,CALIBRATE_TIME_MSEC); local_irq_restore(flags); return (unsigned long)delta64; err: local_irq_restore(flags); return 0; }
/* * 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; }
static int verify_pmtmr_rate(void) { cycle_t value1, value2; unsigned long count, delta; mach_prepare_counter(); value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm); mach_countup(&count); value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm); delta = (value2 - value1) & ACPI_PM_MASK; 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; }