diff options
-rw-r--r-- | drivers/firmware/efi/reboot.c | 22 | ||||
-rw-r--r-- | include/linux/efi.h | 2 |
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 | |||
28 | bool __weak efi_poweroff_required(void) | ||
29 | { | ||
30 | return false; | ||
31 | } | ||
32 | |||
33 | static void efi_power_off(void) | ||
34 | { | ||
35 | efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); | ||
36 | } | ||
37 | |||
38 | static 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 | } | ||
48 | late_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); | |||
878 | extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose); | 878 | extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose); |
879 | extern struct efi_memory_map memmap; | 879 | extern struct efi_memory_map memmap; |
880 | 880 | ||
881 | extern 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; \ |