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: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Nigel Cunningham <nigel@tuxonice.net> Acked-by: Pavel Machek <pavel@suse.cz> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
committed by
Len Brown
parent
b69edc7653
commit
ba84ed9546
@@ -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
|
|||||||
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)
|
|||||||
#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)
|
|||||||
* 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)
|
|||||||
{
|
{
|
||||||
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,7 +507,8 @@ 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) {
|
||||||
error = hibernate_nvs_alloc();
|
if (!s4_no_nvs)
|
||||||
|
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,
|
|||||||
#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 */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user