aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2024-02-12 17:18:37 +0100
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2024-02-28 14:38:47 +0100
commitee446e15fb3da69076dcef1e14bf5d8e4c7a6218 (patch)
tree6d01c8c7c3df000f0500ed2707d0bee94532386c
parentc9f368b597a02f9919cb0c1c03e6b231129e9262 (diff)
downloadu-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/Makefile1
-rw-r--r--lib/efi_driver/efi_reset_riscv.c29
-rw-r--r--lib/efi_loader/Kconfig2
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"