// 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(); | |
} | |
} |