Commit ba84ed95 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Len Brown

ACPI hibernate: Introduce new kernel parameter acpi_sleep=s4_nonvs

On some machines it may be necessary to disable the saving/restoring
of the ACPI NVS memory region during hibernation/resume.  For this
purpose, introduce new ACPI kernel command line option
acpi_sleep=s4_nonvs.

Based on a patch by Zhang Rui.
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Acked-by: default avatarNigel Cunningham <nigel@tuxonice.net>
Acked-by: default avatarPavel Machek <pavel@suse.cz>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent b69edc76
...@@ -149,7 +149,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -149,7 +149,8 @@ and is between 256 and 4096 characters. It is defined in the file
default: 0 default: 0
acpi_sleep= [HW,ACPI] Sleep options acpi_sleep= [HW,ACPI] Sleep options
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, old_ordering } Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
old_ordering, s4_nonvs }
See Documentation/power/video.txt for s3_bios and s3_mode. See Documentation/power/video.txt for s3_bios and s3_mode.
s3_beep is for debugging; it makes the PC's speaker beep s3_beep is for debugging; it makes the PC's speaker beep
as soon as the kernel's real-mode entry point is called. 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,6 +160,8 @@ and is between 256 and 4096 characters. It is defined in the file
control method, wrt putting devices into low power control method, wrt putting devices into low power
states, to be enforced (the ACPI 2.0 ordering of _PTS is states, to be enforced (the ACPI 2.0 ordering of _PTS is
used by default). used by default).
s4_nonvs prevents the kernel from saving/restoring the
ACPI NVS memory during hibernation.
acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
Format: { level | edge | high | low } Format: { level | edge | high | low }
......
...@@ -159,6 +159,8 @@ static int __init acpi_sleep_setup(char *str) ...@@ -159,6 +159,8 @@ static int __init acpi_sleep_setup(char *str)
#endif #endif
if (strncmp(str, "old_ordering", 12) == 0) if (strncmp(str, "old_ordering", 12) == 0)
acpi_old_suspend_ordering(); acpi_old_suspend_ordering();
if (strncmp(str, "s4_nonvs", 8) == 0)
acpi_s4_no_nvs();
str = strchr(str, ','); str = strchr(str, ',');
if (str != NULL) if (str != NULL)
str += strspn(str, ", \t"); str += strspn(str, ", \t");
......
...@@ -101,6 +101,19 @@ void __init acpi_old_suspend_ordering(void) ...@@ -101,6 +101,19 @@ void __init acpi_old_suspend_ordering(void)
* cases. * cases.
*/ */
static bool set_sci_en_on_resume; static bool set_sci_en_on_resume;
/*
* 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;
}
/** /**
* acpi_pm_disable_gpes - Disable the GPEs. * acpi_pm_disable_gpes - Disable the GPEs.
...@@ -396,7 +409,7 @@ static int acpi_hibernation_begin(void) ...@@ -396,7 +409,7 @@ static int acpi_hibernation_begin(void)
{ {
int error; int error;
error = hibernate_nvs_alloc(); error = s4_no_nvs ? 0 : hibernate_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);
...@@ -494,6 +507,7 @@ static int acpi_hibernation_begin_old(void) ...@@ -494,6 +507,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)
error = hibernate_nvs_alloc(); error = hibernate_nvs_alloc();
if (!error) if (!error)
acpi_target_sleep_state = ACPI_STATE_S4; acpi_target_sleep_state = ACPI_STATE_S4;
......
...@@ -270,6 +270,7 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n, ...@@ -270,6 +270,7 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n,
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
void __init acpi_no_s4_hw_signature(void); void __init acpi_no_s4_hw_signature(void);
void __init acpi_old_suspend_ordering(void); void __init acpi_old_suspend_ordering(void);
void __init acpi_s4_no_nvs(void);
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */
#else /* CONFIG_ACPI */ #else /* CONFIG_ACPI */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment