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
20void (*pm_power_off)(void);
21EXPORT_SYMBOL(pm_power_off);
22
23void 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
40void 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
60void 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

source code of linux/arch/loongarch/kernel/reset.c