1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* |
3 | * Copyright (C) 2020-2022 Loongson Technology Corporation Limited |
4 | */ |
5 | #include <linux/kernel.h> |
6 | #include <linux/acpi.h> |
7 | #include <linux/efi.h> |
8 | #include <linux/export.h> |
9 | #include <linux/pm.h> |
10 | #include <linux/types.h> |
11 | #include <linux/reboot.h> |
12 | #include <linux/delay.h> |
13 | #include <linux/console.h> |
14 | |
15 | #include <acpi/reboot.h> |
16 | #include <asm/idle.h> |
17 | #include <asm/loongarch.h> |
18 | #include <asm/loongson.h> |
19 | |
20 | void (*pm_power_off)(void); |
21 | EXPORT_SYMBOL(pm_power_off); |
22 | |
23 | void machine_halt(void) |
24 | { |
25 | #ifdef CONFIG_SMP |
26 | preempt_disable(); |
27 | smp_send_stop(); |
28 | #endif |
29 | local_irq_disable(); |
30 | clear_csr_ecfg(ECFG0_IM); |
31 | |
32 | pr_notice("\n\n** You can safely turn off the power now **\n\n"); |
33 | console_flush_on_panic(mode: CONSOLE_FLUSH_PENDING); |
34 | |
35 | while (true) { |
36 | __arch_cpu_idle(); |
37 | } |
38 | } |
39 | |
40 | void machine_power_off(void) |
41 | { |
42 | #ifdef CONFIG_SMP |
43 | preempt_disable(); |
44 | smp_send_stop(); |
45 | #endif |
46 | #ifdef CONFIG_PM |
47 | if (!acpi_disabled) |
48 | enable_pci_wakeup(); |
49 | #endif |
50 | do_kernel_power_off(); |
51 | #ifdef CONFIG_EFI |
52 | efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); |
53 | #endif |
54 | |
55 | while (true) { |
56 | __arch_cpu_idle(); |
57 | } |
58 | } |
59 | |
60 | void machine_restart(char *command) |
61 | { |
62 | #ifdef CONFIG_SMP |
63 | preempt_disable(); |
64 | smp_send_stop(); |
65 | #endif |
66 | do_kernel_restart(cmd: command); |
67 | #ifdef CONFIG_EFI |
68 | if (efi_capsule_pending(NULL)) |
69 | efi_reboot(reboot_mode: REBOOT_WARM, NULL); |
70 | else |
71 | efi_reboot(reboot_mode: REBOOT_COLD, NULL); |
72 | #endif |
73 | if (!acpi_disabled) |
74 | acpi_reboot(); |
75 | |
76 | while (true) { |
77 | __arch_cpu_idle(); |
78 | } |
79 | } |
80 |