Commit 13737181 authored by Chen Yu's avatar Chen Yu Committed by Rafael J. Wysocki

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: default avatarLen Brown <len.brown@intel.com>
Reviewed-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 9735a227
...@@ -373,5 +373,5 @@ bool efi_reboot_required(void) ...@@ -373,5 +373,5 @@ bool efi_reboot_required(void)
bool efi_poweroff_required(void) bool efi_poweroff_required(void)
{ {
return !!acpi_gbl_reduced_hardware; return acpi_gbl_reduced_hardware || acpi_no_s5;
} }
...@@ -26,6 +26,11 @@ ...@@ -26,6 +26,11 @@
#include "internal.h" #include "internal.h"
#include "sleep.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 u8 sleep_states[ACPI_S_STATE_COUNT];
static void acpi_sleep_tts_switch(u32 acpi_state) static void acpi_sleep_tts_switch(u32 acpi_state)
...@@ -882,6 +887,8 @@ int __init acpi_sleep_init(void) ...@@ -882,6 +887,8 @@ int __init acpi_sleep_init(void)
sleep_states[ACPI_STATE_S5] = 1; sleep_states[ACPI_STATE_S5] = 1;
pm_power_off_prepare = acpi_power_off_prepare; pm_power_off_prepare = acpi_power_off_prepare;
pm_power_off = acpi_power_off; pm_power_off = acpi_power_off;
} else {
acpi_no_s5 = true;
} }
supported[0] = 0; supported[0] = 0;
......
...@@ -278,6 +278,7 @@ void acpi_irq_stats_init(void); ...@@ -278,6 +278,7 @@ void acpi_irq_stats_init(void);
extern u32 acpi_irq_handled; extern u32 acpi_irq_handled;
extern u32 acpi_irq_not_handled; extern u32 acpi_irq_not_handled;
extern unsigned int acpi_sci_irq; extern unsigned int acpi_sci_irq;
extern bool acpi_no_s5;
#define INVALID_ACPI_IRQ ((unsigned)-1) #define INVALID_ACPI_IRQ ((unsigned)-1)
static inline bool acpi_sci_irq_valid(void) static inline bool acpi_sci_irq_valid(void)
{ {
......
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