From a4268466ee69cbf0af9f9d2ee33a461b7a5944bb Mon Sep 17 00:00:00 2001 From: jkim Date: Mon, 23 Mar 2009 22:12:33 +0000 Subject: [PATCH] Add a function to reset system time after resuming, which will be used by amd64 shortly. It can be turned off by setting "debug.acpi.reset_clock" tunable to zero. --- sys/dev/acpica/acpi.c | 25 +++++++++++++++++++++---- sys/dev/acpica/acpivar.h | 1 + 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index e0ea93606af1..50b84a5b5bcd 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -254,6 +254,12 @@ TUNABLE_INT("debug.acpi.do_powerstate", &acpi_do_powerstate); SYSCTL_INT(_debug_acpi, OID_AUTO, do_powerstate, CTLFLAG_RW, &acpi_do_powerstate, 1, "Turn off devices when suspending."); +/* Reset system clock while resuming. XXX Remove once tested. */ +static int acpi_reset_clock = 1; +TUNABLE_INT("debug.acpi.reset_clock", &acpi_reset_clock); +SYSCTL_INT(_debug_acpi, OID_AUTO, reset_clock, CTLFLAG_RW, + &acpi_reset_clock, 1, "Reset system clock while resuming."); + /* Allow users to override quirks. */ TUNABLE_INT("debug.acpi.quirks", &acpi_quirks); @@ -2596,10 +2602,6 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state) mtx_unlock(&Giant); - /* Warm up timecounter again */ - (void)timecounter->tc_get_timecount(timecounter); - (void)timecounter->tc_get_timecount(timecounter); - #ifdef SMP thread_lock(curthread); sched_unbind(curthread); @@ -2617,6 +2619,21 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state) return_ACPI_STATUS (status); } +void +acpi_resync_clock(struct acpi_softc *sc) +{ + + if (!acpi_reset_clock) + return; + + /* + * Warm up timecounter again and reset system clock. + */ + (void)timecounter->tc_get_timecount(timecounter); + (void)timecounter->tc_get_timecount(timecounter); + inittodr(time_second + sc->acpi_sleep_delay); +} + /* Initialize a device's wake GPE. */ int acpi_wake_init(device_t dev, int type) diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index a5ac2de051a1..ce6a24253d2a 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -330,6 +330,7 @@ ACPI_STATUS acpi_SetIntrModel(int model); int acpi_ReqSleepState(struct acpi_softc *sc, int state); int acpi_AckSleepState(struct apm_clone_data *clone, int error); ACPI_STATUS acpi_SetSleepState(struct acpi_softc *sc, int state); +void acpi_resync_clock(struct acpi_softc *sc); int acpi_wake_init(device_t dev, int type); int acpi_wake_set_enable(device_t dev, int enable); int acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);