ACPI / PM: Introduce efi poweroff for HW-full platforms without _S5
The problem is Linux registers pm_power_off = efi_power_off only if we are in hardware reduced mode. Actually, what we also want is to do this when ACPI S5 is simply not supported on non-legacy platforms. Since some future Intel platforms are HW-full mode where the DSDT fails to supply an _S5 object(without SLP_TYP), we should let such kind of platform to leverage efi runtime service to poweroff. This patch uses efi power off as first choice when S5 is unavailable, even if there is a customized poweroff(driver provided, eg). Meanwhile, the legacy platforms will not be affected because there is no path for them to overwrite the pm_power_off to efi power off. Suggested-by: Len Brown <len.brown@intel.com> Reviewed-by: Matt Fleming <matt@codeblueprint.co.uk> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
9735a22799
commit
1373718194
3 changed files with 9 additions and 1 deletions
|
@ -373,5 +373,5 @@ bool efi_reboot_required(void)
|
|||
|
||||
bool efi_poweroff_required(void)
|
||||
{
|
||||
return !!acpi_gbl_reduced_hardware;
|
||||
return acpi_gbl_reduced_hardware || acpi_no_s5;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,11 @@
|
|||
#include "internal.h"
|
||||
#include "sleep.h"
|
||||
|
||||
/*
|
||||
* Some HW-full platforms do not have _S5, so they may need
|
||||
* to leverage efi power off for a shutdown.
|
||||
*/
|
||||
bool acpi_no_s5;
|
||||
static u8 sleep_states[ACPI_S_STATE_COUNT];
|
||||
|
||||
static void acpi_sleep_tts_switch(u32 acpi_state)
|
||||
|
@ -882,6 +887,8 @@ int __init acpi_sleep_init(void)
|
|||
sleep_states[ACPI_STATE_S5] = 1;
|
||||
pm_power_off_prepare = acpi_power_off_prepare;
|
||||
pm_power_off = acpi_power_off;
|
||||
} else {
|
||||
acpi_no_s5 = true;
|
||||
}
|
||||
|
||||
supported[0] = 0;
|
||||
|
|
|
@ -278,6 +278,7 @@ void acpi_irq_stats_init(void);
|
|||
extern u32 acpi_irq_handled;
|
||||
extern u32 acpi_irq_not_handled;
|
||||
extern unsigned int acpi_sci_irq;
|
||||
extern bool acpi_no_s5;
|
||||
#define INVALID_ACPI_IRQ ((unsigned)-1)
|
||||
static inline bool acpi_sci_irq_valid(void)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue