aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/firmware/efi/reboot.c22
-rw-r--r--include/linux/efi.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/firmware/efi/reboot.c b/drivers/firmware/efi/reboot.c
index 81bf925f70f5..e9eeeb3c6345 100644
--- a/drivers/firmware/efi/reboot.c
+++ b/drivers/firmware/efi/reboot.c
@@ -24,3 +24,25 @@ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused)
24 24
25 efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL); 25 efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL);
26} 26}
27
28bool __weak efi_poweroff_required(void)
29{
30 return false;
31}
32
33static void efi_power_off(void)
34{
35 efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
36}
37
38static int __init efi_shutdown_init(void)
39{
40 if (!efi_enabled(EFI_RUNTIME_SERVICES))
41 return -ENODEV;
42
43 if (efi_poweroff_required())
44 pm_power_off = efi_power_off;
45
46 return 0;
47}
48late_initcall(efi_shutdown_init);
diff --git a/include/linux/efi.h b/include/linux/efi.h
index e6980ba528ec..9917f58ee83e 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -878,6 +878,8 @@ extern void efi_reserve_boot_services(void);
878extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose); 878extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose);
879extern struct efi_memory_map memmap; 879extern struct efi_memory_map memmap;
880 880
881extern bool efi_poweroff_required(void);
882
881/* Iterate through an efi_memory_map */ 883/* Iterate through an efi_memory_map */
882#define for_each_efi_memory_desc(m, md) \ 884#define for_each_efi_memory_desc(m, md) \
883 for ((md) = (m)->map; \ 885 for ((md) = (m)->map; \