diff options
author | Heinrich Schuchardt <heinrich.schuchardt@canonical.com> | 2024-02-12 17:18:37 +0100 |
---|---|---|
committer | Heinrich Schuchardt <heinrich.schuchardt@canonical.com> | 2024-02-28 14:38:47 +0100 |
commit | ee446e15fb3da69076dcef1e14bf5d8e4c7a6218 (patch) | |
tree | 6d01c8c7c3df000f0500ed2707d0bee94532386c | |
parent | c9f368b597a02f9919cb0c1c03e6b231129e9262 (diff) | |
download | u-boot-ee446e15fb3da69076dcef1e14bf5d8e4c7a6218.zip u-boot-ee446e15fb3da69076dcef1e14bf5d8e4c7a6218.tar.gz u-boot-ee446e15fb3da69076dcef1e14bf5d8e4c7a6218.tar.bz2 |
efi_driver: provide SBI based runtime system reset
On RISC-V systems system the Supervisory Binary Interface provides system
reset and poweroff. Use it at EFI runtime.
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
-rw-r--r-- | lib/efi_driver/Makefile | 1 | ||||
-rw-r--r-- | lib/efi_driver/efi_reset_riscv.c | 29 | ||||
-rw-r--r-- | lib/efi_loader/Kconfig | 2 |
3 files changed, 31 insertions, 1 deletions
diff --git a/lib/efi_driver/Makefile b/lib/efi_driver/Makefile index f2b6c05..0da20fe 100644 --- a/lib/efi_driver/Makefile +++ b/lib/efi_driver/Makefile @@ -9,3 +9,4 @@ obj-y += efi_uclass.o ifeq ($(CONFIG_PARTITIONS),y) obj-y += efi_block_device.o endif +obj-$(CONFIG_SYSRESET_SBI) += efi_reset_riscv.o diff --git a/lib/efi_driver/efi_reset_riscv.c b/lib/efi_driver/efi_reset_riscv.c new file mode 100644 index 0000000..89b2352 --- /dev/null +++ b/lib/efi_driver/efi_reset_riscv.c @@ -0,0 +1,29 @@ +// 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)); +} diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index db5571d..a7c3e05 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -366,7 +366,7 @@ config EFI_HAVE_RUNTIME_RESET bool default y depends on ARCH_BCM283X || FSL_LAYERSCAPE || PSCI_RESET || \ - SANDBOX || SYSRESET_X86 + SANDBOX || SYSRESET_SBI || SYSRESET_X86 config EFI_GRUB_ARM32_WORKAROUND bool "Workaround for GRUB on 32bit ARM" |