[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Add support for ACPI PM Timer as platform clock source.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1180545122 -3600 # Node ID 2d7d33ac982a0720408d841b13c3b97a2190eae4 # Parent ae073ca6eb76f75a73063ba6e0f944b47b8f8954 Add support for ACPI PM Timer as platform clock source. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/arch/x86/time.c | 56 ++++++++++++++++++++++++++++++++++++++++++- xen/include/asm-x86/config.h | 1 2 files changed, 56 insertions(+), 1 deletion(-) diff -r ae073ca6eb76 -r 2d7d33ac982a xen/arch/x86/time.c --- a/xen/arch/x86/time.c Wed May 30 17:47:00 2007 +0100 +++ b/xen/arch/x86/time.c Wed May 30 18:12:02 2007 +0100 @@ -511,6 +511,60 @@ static int init_cyclone(void) } /************************************************************ + * PLATFORM TIMER 4: ACPI PM TIMER + */ + +u32 pmtmr_ioport; + +/* Protected by platform_timer_lock. */ +static u64 pmtimer_counter64; +static u32 pmtimer_stamp; +static struct timer pmtimer_overflow_timer; + +/* ACPI PM timer ticks at 3.579545 MHz. */ +#define ACPI_PM_FREQUENCY 3579545 + +/* Deltas are 24-bit unsigned values, as counter may be only 24 bits wide. */ +#define pmtimer_delta(c) ((u32)(((c) - pmtimer_stamp) & ((1U<<24)-1))) + +static void pmtimer_overflow(void *unused) +{ + u32 counter; + + spin_lock_irq(&platform_timer_lock); + counter = inl(pmtmr_ioport); + pmtimer_counter64 += pmtimer_delta(counter); + pmtimer_stamp = counter; + spin_unlock_irq(&platform_timer_lock); + + /* Trigger overflow avoidance roughly when counter increments 2^23. */ + set_timer(&pmtimer_overflow_timer, NOW() + MILLISECS(2000)); +} + +static u64 read_pmtimer_count(void) +{ + return pmtimer_counter64 + pmtimer_delta(inl(pmtmr_ioport)); +} + +static int init_pmtimer(void) +{ + if ( pmtmr_ioport == 0 ) + return 0; + + read_platform_count = read_pmtimer_count; + + init_timer(&pmtimer_overflow_timer, pmtimer_overflow, NULL, 0); + pmtimer_overflow(NULL); + platform_timer_stamp = pmtimer_counter64; + set_time_scale(&platform_timer_scale, ACPI_PM_FREQUENCY); + + printk("Platform timer is %s ACPI PM Timer\n", + freq_string(ACPI_PM_FREQUENCY)); + + return 1; +} + +/************************************************************ * GENERIC PLATFORM TIMER INFRASTRUCTURE */ @@ -549,7 +603,7 @@ static void platform_time_calibration(vo static void init_platform_timer(void) { - if ( !init_cyclone() && !init_hpet() ) + if ( !init_cyclone() && !init_hpet() && !init_pmtimer() ) init_pit(); } diff -r ae073ca6eb76 -r 2d7d33ac982a xen/include/asm-x86/config.h --- a/xen/include/asm-x86/config.h Wed May 30 17:47:00 2007 +0100 +++ b/xen/include/asm-x86/config.h Wed May 30 18:12:02 2007 +0100 @@ -22,6 +22,7 @@ #define CONFIG_X86_LOCAL_APIC 1 #define CONFIG_X86_GOOD_APIC 1 #define CONFIG_X86_IO_APIC 1 +#define CONFIG_X86_PM_TIMER 1 #define CONFIG_HPET_TIMER 1 #define CONFIG_X86_MCE_P4THERMAL 1 #define CONFIG_ACPI_NUMA 1 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |