[PATCH 1/1] efi_driver: provide SBI based runtime system reset

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Mon Feb 12 17:18:37 CET 2024


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 at canonical.com>
---
 lib/efi_driver/Makefile          |  1 +
 lib/efi_driver/efi_reset_riscv.c | 29 +++++++++++++++++++++++++++++
 lib/efi_loader/Kconfig           |  2 +-
 3 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 lib/efi_driver/efi_reset_riscv.c

diff --git a/lib/efi_driver/Makefile b/lib/efi_driver/Makefile
index f2b6c05cc24..0da20fe91d3 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 00000000000..89b23522e95
--- /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 db5571de1d9..a7c3e05c13a 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"
-- 
2.43.0



More information about the U-Boot mailing list