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(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(command); 67 #ifdef CONFIG_EFI 68 if (efi_capsule_pending(NULL)) 69 efi_reboot(REBOOT_WARM, NULL); 70 else 71 efi_reboot(REBOOT_COLD, NULL); 72 #endif 73 if (!acpi_disabled) 74 acpi_reboot(); 75 76 while (true) { 77 __arch_cpu_idle(); 78 } 79 } 80