| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Copyright (C) 2020-2022 Loongson Technology Corporation Limited | |
| */ | |
| #include <linux/kernel.h> | |
| #include <linux/acpi.h> | |
| #include <linux/efi.h> | |
| #include <linux/export.h> | |
| #include <linux/pm.h> | |
| #include <linux/types.h> | |
| #include <linux/reboot.h> | |
| #include <linux/delay.h> | |
| #include <linux/console.h> | |
| #include <acpi/reboot.h> | |
| #include <asm/idle.h> | |
| #include <asm/loongarch.h> | |
| #include <asm/loongson.h> | |
| void (*pm_power_off)(void); | |
| EXPORT_SYMBOL(pm_power_off); | |
| void machine_halt(void) | |
| { | |
| #ifdef CONFIG_SMP | |
| preempt_disable(); | |
| smp_send_stop(); | |
| #endif | |
| local_irq_disable(); | |
| clear_csr_ecfg(ECFG0_IM); | |
| pr_notice("\n\n** You can safely turn off the power now **\n\n"); | |
| console_flush_on_panic(CONSOLE_FLUSH_PENDING); | |
| while (true) { | |
| __arch_cpu_idle(); | |
| } | |
| } | |
| void machine_power_off(void) | |
| { | |
| #ifdef CONFIG_SMP | |
| preempt_disable(); | |
| smp_send_stop(); | |
| #endif | |
| #ifdef CONFIG_PM | |
| if (!acpi_disabled) | |
| enable_pci_wakeup(); | |
| #endif | |
| do_kernel_power_off(); | |
| #ifdef CONFIG_EFI | |
| efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL); | |
| #endif | |
| while (true) { | |
| __arch_cpu_idle(); | |
| } | |
| } | |
| void machine_restart(char *command) | |
| { | |
| #ifdef CONFIG_SMP | |
| preempt_disable(); | |
| smp_send_stop(); | |
| #endif | |
| do_kernel_restart(command); | |
| #ifdef CONFIG_EFI | |
| if (efi_capsule_pending(NULL)) | |
| efi_reboot(REBOOT_WARM, NULL); | |
| else | |
| efi_reboot(REBOOT_COLD, NULL); | |
| #endif | |
| if (!acpi_disabled) | |
| acpi_reboot(); | |
| while (true) { | |
| __arch_cpu_idle(); | |
| } | |
| } |