Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
}
+7 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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)
{