diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 2 | ||||
-rw-r--r-- | drivers/acpi/sleep/main.c | 18 | ||||
-rw-r--r-- | include/linux/acpi.h | 1 |
4 files changed, 23 insertions, 3 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e0f346d201ed..1d089eeff3cf 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -149,7 +149,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
149 | default: 0 | 149 | default: 0 |
150 | 150 | ||
151 | acpi_sleep= [HW,ACPI] Sleep options | 151 | acpi_sleep= [HW,ACPI] Sleep options |
152 | Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, old_ordering } | 152 | Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, |
153 | old_ordering, s4_nonvs } | ||
153 | See Documentation/power/video.txt for s3_bios and s3_mode. | 154 | See Documentation/power/video.txt for s3_bios and s3_mode. |
154 | s3_beep is for debugging; it makes the PC's speaker beep | 155 | s3_beep is for debugging; it makes the PC's speaker beep |
155 | as soon as the kernel's real-mode entry point is called. | 156 | as soon as the kernel's real-mode entry point is called. |
@@ -159,6 +160,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
159 | control method, wrt putting devices into low power | 160 | control method, wrt putting devices into low power |
160 | states, to be enforced (the ACPI 2.0 ordering of _PTS is | 161 | states, to be enforced (the ACPI 2.0 ordering of _PTS is |
161 | used by default). | 162 | used by default). |
163 | s4_nonvs prevents the kernel from saving/restoring the | ||
164 | ACPI NVS memory during hibernation. | ||
162 | 165 | ||
163 | acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode | 166 | acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode |
164 | Format: { level | edge | high | low } | 167 | Format: { level | edge | high | low } |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 806b4e9051b4..707c1f6f95fa 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
@@ -159,6 +159,8 @@ static int __init acpi_sleep_setup(char *str) | |||
159 | #endif | 159 | #endif |
160 | if (strncmp(str, "old_ordering", 12) == 0) | 160 | if (strncmp(str, "old_ordering", 12) == 0) |
161 | acpi_old_suspend_ordering(); | 161 | acpi_old_suspend_ordering(); |
162 | if (strncmp(str, "s4_nonvs", 8) == 0) | ||
163 | acpi_s4_no_nvs(); | ||
162 | str = strchr(str, ','); | 164 | str = strchr(str, ','); |
163 | if (str != NULL) | 165 | if (str != NULL) |
164 | str += strspn(str, ", \t"); | 166 | str += strspn(str, ", \t"); |
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index 45a8015e4217..bef41fd4c877 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -101,6 +101,19 @@ void __init acpi_old_suspend_ordering(void) | |||
101 | * cases. | 101 | * cases. |
102 | */ | 102 | */ |
103 | static bool set_sci_en_on_resume; | 103 | static bool set_sci_en_on_resume; |
104 | /* | ||
105 | * The ACPI specification wants us to save NVS memory regions during hibernation | ||
106 | * and to restore them during the subsequent resume. However, it is not certain | ||
107 | * if this mechanism is going to work on all machines, so we allow the user to | ||
108 | * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line | ||
109 | * option. | ||
110 | */ | ||
111 | static bool s4_no_nvs; | ||
112 | |||
113 | void __init acpi_s4_no_nvs(void) | ||
114 | { | ||
115 | s4_no_nvs = true; | ||
116 | } | ||
104 | 117 | ||
105 | /** | 118 | /** |
106 | * acpi_pm_disable_gpes - Disable the GPEs. | 119 | * acpi_pm_disable_gpes - Disable the GPEs. |
@@ -396,7 +409,7 @@ static int acpi_hibernation_begin(void) | |||
396 | { | 409 | { |
397 | int error; | 410 | int error; |
398 | 411 | ||
399 | error = hibernate_nvs_alloc(); | 412 | error = s4_no_nvs ? 0 : hibernate_nvs_alloc(); |
400 | if (!error) { | 413 | if (!error) { |
401 | acpi_target_sleep_state = ACPI_STATE_S4; | 414 | acpi_target_sleep_state = ACPI_STATE_S4; |
402 | acpi_sleep_tts_switch(acpi_target_sleep_state); | 415 | acpi_sleep_tts_switch(acpi_target_sleep_state); |
@@ -494,7 +507,8 @@ static int acpi_hibernation_begin_old(void) | |||
494 | error = acpi_sleep_prepare(ACPI_STATE_S4); | 507 | error = acpi_sleep_prepare(ACPI_STATE_S4); |
495 | 508 | ||
496 | if (!error) { | 509 | if (!error) { |
497 | error = hibernate_nvs_alloc(); | 510 | if (!s4_no_nvs) |
511 | error = hibernate_nvs_alloc(); | ||
498 | if (!error) | 512 | if (!error) |
499 | acpi_target_sleep_state = ACPI_STATE_S4; | 513 | acpi_target_sleep_state = ACPI_STATE_S4; |
500 | } | 514 | } |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index fba8051fb297..dfa0a5356c53 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -270,6 +270,7 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n, | |||
270 | #ifdef CONFIG_PM_SLEEP | 270 | #ifdef CONFIG_PM_SLEEP |
271 | void __init acpi_no_s4_hw_signature(void); | 271 | void __init acpi_no_s4_hw_signature(void); |
272 | void __init acpi_old_suspend_ordering(void); | 272 | void __init acpi_old_suspend_ordering(void); |
273 | void __init acpi_s4_no_nvs(void); | ||
273 | #endif /* CONFIG_PM_SLEEP */ | 274 | #endif /* CONFIG_PM_SLEEP */ |
274 | #else /* CONFIG_ACPI */ | 275 | #else /* CONFIG_ACPI */ |
275 | 276 | ||