# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1227023714 0
# Node ID ed8524f4a044efbd6d30f9340c6ddfb00f972407
# Parent 85fda344dba7cf9d22ff0a792d70e032ce6c1b40
x86: Re-initialise HPET on resume from S3
Signed-off-by: Guanqun Lu <guanqun.lu@xxxxxxxxx>
Signed-off-by: Kevin Tian <kevin.tian@xxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
xen/arch/x86/hpet.c | 7 +------
xen/arch/x86/time.c | 20 +++++++++++++++++---
2 files changed, 18 insertions(+), 9 deletions(-)
diff -r 85fda344dba7 -r ed8524f4a044 xen/arch/x86/hpet.c
--- a/xen/arch/x86/hpet.c Tue Nov 18 15:39:31 2008 +0000
+++ b/xen/arch/x86/hpet.c Tue Nov 18 15:55:14 2008 +0000
@@ -264,14 +264,9 @@ int hpet_legacy_irq_tick(void)
u64 hpet_setup(void)
{
- static u64 hpet_rate;
- static int initialised;
+ u64 hpet_rate;
u32 hpet_id, hpet_period, cfg;
int i;
-
- if ( initialised )
- return hpet_rate;
- initialised = 1;
if ( hpet_address == 0 )
return 0;
diff -r 85fda344dba7 -r ed8524f4a044 xen/arch/x86/time.c
--- a/xen/arch/x86/time.c Tue Nov 18 15:39:31 2008 +0000
+++ b/xen/arch/x86/time.c Tue Nov 18 15:55:14 2008 +0000
@@ -60,6 +60,7 @@ struct platform_timesource {
u64 frequency;
u64 (*read_counter)(void);
int (*init)(struct platform_timesource *);
+ void (*resume)(struct platform_timesource *);
int counter_bits;
};
@@ -396,12 +397,21 @@ static int init_hpet(struct platform_tim
return 1;
}
+static void resume_hpet(struct platform_timesource *pts)
+{
+ u64 hpet_rate = hpet_setup();
+
+ BUG_ON(hpet_rate == 0);
+ pts->frequency = hpet_rate;
+}
+
static struct platform_timesource plt_hpet =
{
.name = "HPET",
.read_counter = read_hpet_count,
.counter_bits = 32,
- .init = init_hpet
+ .init = init_hpet,
+ .resume = resume_hpet
};
/************************************************************
@@ -566,6 +576,10 @@ static void platform_time_calibration(vo
static void resume_platform_timer(void)
{
+ /* Timer source can be reset when backing from S3 to S0 */
+ if ( plt_src.resume )
+ plt_src.resume(&plt_src);
+
/* No change in platform_stime across suspend/resume. */
platform_timer_stamp = plt_stamp64;
plt_stamp = plt_src.read_counter();
@@ -1214,12 +1228,12 @@ int time_resume(void)
{
/*u64 tmp = */init_pit_and_calibrate_tsc();
- disable_pit_irq();
-
/* Disable this while calibrate_tsc_ap() also is skipped. */
/*set_time_scale(&this_cpu(cpu_time).tsc_scale, tmp);*/
resume_platform_timer();
+
+ disable_pit_irq();
init_percpu_time();
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|