Skip to content

Commit 1373718

Browse files
yu-chen-surfrafaeljw
authored andcommitted
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 <[email protected]> Reviewed-by: Matt Fleming <[email protected]> Signed-off-by: Chen Yu <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 9735a22 commit 1373718

File tree

3 files changed

+9
-1
lines changed

3 files changed

+9
-1
lines changed

arch/x86/platform/efi/quirks.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,5 +373,5 @@ bool efi_reboot_required(void)
373373

374374
bool efi_poweroff_required(void)
375375
{
376-
return !!acpi_gbl_reduced_hardware;
376+
return acpi_gbl_reduced_hardware || acpi_no_s5;
377377
}

drivers/acpi/sleep.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
#include "internal.h"
2727
#include "sleep.h"
2828

29+
/*
30+
* Some HW-full platforms do not have _S5, so they may need
31+
* to leverage efi power off for a shutdown.
32+
*/
33+
bool acpi_no_s5;
2934
static u8 sleep_states[ACPI_S_STATE_COUNT];
3035

3136
static void acpi_sleep_tts_switch(u32 acpi_state)
@@ -882,6 +887,8 @@ int __init acpi_sleep_init(void)
882887
sleep_states[ACPI_STATE_S5] = 1;
883888
pm_power_off_prepare = acpi_power_off_prepare;
884889
pm_power_off = acpi_power_off;
890+
} else {
891+
acpi_no_s5 = true;
885892
}
886893

887894
supported[0] = 0;

include/linux/acpi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ void acpi_irq_stats_init(void);
278278
extern u32 acpi_irq_handled;
279279
extern u32 acpi_irq_not_handled;
280280
extern unsigned int acpi_sci_irq;
281+
extern bool acpi_no_s5;
281282
#define INVALID_ACPI_IRQ ((unsigned)-1)
282283
static inline bool acpi_sci_irq_valid(void)
283284
{

0 commit comments

Comments
 (0)