1/* 2 * Copyright (C) 2014 Intel Corporation; author Matt Fleming 3 * Copyright (c) 2014 Red Hat, Inc., Mark Salter <msalter@redhat.com> 4 */ 5#include <linux/efi.h> 6#include <linux/reboot.h> 7 8int efi_reboot_quirk_mode = -1; 9 10void efi_reboot(enum reboot_mode reboot_mode, const char *__unused) 11{ 12 int efi_mode; 13 14 if (!efi_enabled(EFI_RUNTIME_SERVICES)) 15 return; 16 17 switch (reboot_mode) { 18 case REBOOT_WARM: 19 case REBOOT_SOFT: 20 efi_mode = EFI_RESET_WARM; 21 break; 22 default: 23 efi_mode = EFI_RESET_COLD; 24 break; 25 } 26 27 /* 28 * If a quirk forced an EFI reset mode, always use that. 29 */ 30 if (efi_reboot_quirk_mode != -1) 31 efi_mode = efi_reboot_quirk_mode; 32 33 efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL); 34} 35 36bool __weak efi_poweroff_required(void) 37{ 38 return false; 39} 40 41static void efi_power_off(void) 42{ 43 efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); 44} 45 46static int __init efi_shutdown_init(void) 47{ 48 if (!efi_enabled(EFI_RUNTIME_SERVICES)) 49 return -ENODEV; 50 51 if (efi_poweroff_required()) 52 pm_power_off = efi_power_off; 53 54 return 0; 55} 56late_initcall(efi_shutdown_init); 57