|
@@ -81,6 +81,20 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|
#ifdef CONFIG_ACPI_SLEEP
|
|
#ifdef CONFIG_ACPI_SLEEP
|
|
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
|
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * The ACPI specification wants us to save NVS memory regions during hibernation
|
|
|
|
+ * and to restore them during the subsequent resume. Windows does that also for
|
|
|
|
+ * suspend to RAM. However, it is known that this mechanism does not work on
|
|
|
|
+ * all machines, so we allow the user to disable it with the help of the
|
|
|
|
+ * 'acpi_sleep=nonvs' kernel command line option.
|
|
|
|
+ */
|
|
|
|
+static bool nvs_nosave;
|
|
|
|
+
|
|
|
|
+void __init acpi_nvs_nosave(void)
|
|
|
|
+{
|
|
|
|
+ nvs_nosave = true;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
|
|
* ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
|
|
* user to request that behavior by using the 'acpi_old_suspend_ordering'
|
|
* user to request that behavior by using the 'acpi_old_suspend_ordering'
|
|
@@ -197,8 +211,7 @@ static int acpi_suspend_begin(suspend_state_t pm_state)
|
|
u32 acpi_state = acpi_suspend_states[pm_state];
|
|
u32 acpi_state = acpi_suspend_states[pm_state];
|
|
int error = 0;
|
|
int error = 0;
|
|
|
|
|
|
- error = suspend_nvs_alloc();
|
|
|
|
-
|
|
|
|
|
|
+ error = nvs_nosave ? 0 : suspend_nvs_alloc();
|
|
if (error)
|
|
if (error)
|
|
return error;
|
|
return error;
|
|
|
|
|
|
@@ -388,20 +401,6 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
|
|
#endif /* CONFIG_SUSPEND */
|
|
#endif /* CONFIG_SUSPEND */
|
|
|
|
|
|
#ifdef CONFIG_HIBERNATION
|
|
#ifdef CONFIG_HIBERNATION
|
|
-/*
|
|
|
|
- * The ACPI specification wants us to save NVS memory regions during hibernation
|
|
|
|
- * and to restore them during the subsequent resume. However, it is not certain
|
|
|
|
- * if this mechanism is going to work on all machines, so we allow the user to
|
|
|
|
- * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line
|
|
|
|
- * option.
|
|
|
|
- */
|
|
|
|
-static bool s4_no_nvs;
|
|
|
|
-
|
|
|
|
-void __init acpi_s4_no_nvs(void)
|
|
|
|
-{
|
|
|
|
- s4_no_nvs = true;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static unsigned long s4_hardware_signature;
|
|
static unsigned long s4_hardware_signature;
|
|
static struct acpi_table_facs *facs;
|
|
static struct acpi_table_facs *facs;
|
|
static bool nosigcheck;
|
|
static bool nosigcheck;
|
|
@@ -415,7 +414,7 @@ static int acpi_hibernation_begin(void)
|
|
{
|
|
{
|
|
int error;
|
|
int error;
|
|
|
|
|
|
- error = s4_no_nvs ? 0 : suspend_nvs_alloc();
|
|
|
|
|
|
+ error = nvs_nosave ? 0 : suspend_nvs_alloc();
|
|
if (!error) {
|
|
if (!error) {
|
|
acpi_target_sleep_state = ACPI_STATE_S4;
|
|
acpi_target_sleep_state = ACPI_STATE_S4;
|
|
acpi_sleep_tts_switch(acpi_target_sleep_state);
|
|
acpi_sleep_tts_switch(acpi_target_sleep_state);
|
|
@@ -510,7 +509,7 @@ static int acpi_hibernation_begin_old(void)
|
|
error = acpi_sleep_prepare(ACPI_STATE_S4);
|
|
error = acpi_sleep_prepare(ACPI_STATE_S4);
|
|
|
|
|
|
if (!error) {
|
|
if (!error) {
|
|
- if (!s4_no_nvs)
|
|
|
|
|
|
+ if (!nvs_nosave)
|
|
error = suspend_nvs_alloc();
|
|
error = suspend_nvs_alloc();
|
|
if (!error)
|
|
if (!error)
|
|
acpi_target_sleep_state = ACPI_STATE_S4;
|
|
acpi_target_sleep_state = ACPI_STATE_S4;
|