diff options
Diffstat (limited to 'arch/x86/kernel/reboot.c')
| -rw-r--r-- | arch/x86/kernel/reboot.c | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 52b1157c53eb..17962e667a91 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -28,6 +28,7 @@  #include <linux/mc146818rtc.h>  #include <asm/realmode.h>  #include <asm/x86_init.h> +#include <asm/efi.h>  /*   * Power off function, if any @@ -401,12 +402,25 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  static int __init reboot_init(void)  { +	int rv; +  	/*  	 * Only do the DMI check if reboot_type hasn't been overridden  	 * on the command line  	 */ -	if (reboot_default) -		dmi_check_system(reboot_dmi_table); +	if (!reboot_default) +		return 0; + +	/* +	 * The DMI quirks table takes precedence. If no quirks entry +	 * matches and the ACPI Hardware Reduced bit is set, force EFI +	 * reboot. +	 */ +	rv = dmi_check_system(reboot_dmi_table); + +	if (!rv && efi_reboot_required()) +		reboot_type = BOOT_EFI; +  	return 0;  }  core_initcall(reboot_init); @@ -528,11 +542,7 @@ static void native_machine_emergency_restart(void)  			break;  		case BOOT_EFI: -			if (efi_enabled(EFI_RUNTIME_SERVICES)) -				efi.reset_system(reboot_mode == REBOOT_WARM ? -						 EFI_RESET_WARM : -						 EFI_RESET_COLD, -						 EFI_SUCCESS, 0, NULL); +			efi_reboot(reboot_mode, NULL);  			reboot_type = BOOT_BIOS;  			break;  |