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