| // SPDX-License-Identifier: GPL-2.0-or-later | |
| #include <efi_loader.h> | |
| #include <asm/sbi.h> | |
| void __efi_runtime EFIAPI efi_reset_system(enum efi_reset_type reset_type, | |
| efi_status_t reset_status, | |
| unsigned long data_size, | |
| void *reset_data) | |
| { | |
| register unsigned long eid asm("a7") = SBI_EXT_SRST; | |
| register unsigned long fid asm("a6") = SBI_EXT_SRST_RESET; | |
| register unsigned long type asm("a0"); | |
| register unsigned long reason asm("a1") = SBI_SRST_RESET_REASON_NONE; | |
| switch (reset_type) { | |
| case EFI_RESET_WARM: | |
| type = SBI_SRST_RESET_TYPE_WARM_REBOOT; | |
| break; | |
| case EFI_RESET_SHUTDOWN: | |
| type = SBI_SRST_RESET_TYPE_SHUTDOWN; | |
| break; | |
| default: | |
| type = SBI_SRST_RESET_TYPE_COLD_REBOOT; | |
| break; | |
| } | |
| asm volatile ("ecall\n" | |
| : : "r" (eid), "r" (fid), "r" (type), "r" (reason)); | |
| } |