Blame view

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