From 36d601ff131ef7392e0877788a831bef940b4382 Mon Sep 17 00:00:00 2001 From: Yanfeng Liu Date: Wed, 8 May 2024 11:09:46 +0800 Subject: [PATCH] riscv/virt: M-mode poweroff support This adds poweroff support to `rv-virt/nsh` and `rv-virt/nsh64`. Signed-off-by: Yanfeng Liu --- arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h | 2 ++ arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h | 8 ++++++++ boards/risc-v/qemu-rv/rv-virt/configs/nsh/defconfig | 2 +- boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig | 2 +- boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c | 6 +++++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h index 868f3d698a9db..ce821fe32cbf4 100644 --- a/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h +++ b/arch/risc-v/src/qemu-rv/hardware/qemu_rv_memorymap.h @@ -31,4 +31,6 @@ #define QEMU_RV_ACLINT_BASE 0x02f00000 #define QEMU_RV_PLIC_BASE 0x0c000000 +#define QEMU_RV_RESET_BASE 0x100000 + #endif /* __ARCH_RISCV_SRC_QEMU_RV_HARDWARE_QEMU_RV_MEMORYMAP_H */ diff --git a/arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h b/arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h index 1ce406701ac5e..c8deb5dd22605 100644 --- a/arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h +++ b/arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h @@ -39,4 +39,12 @@ #define QEMU_RV_IDLESTACK_BASE _ebss #endif +#ifndef CONFIG_BUILD_KERNEL +/* QEMU reset chocies */ + +#define QEMU_RV_RESET_DONE 0x5555 +#define QEMU_RV_RESET_FAIL 0x3333 +#define QEMU_RV_RESET_REBOOT 0x7777 +#endif + #endif /* __ARCH_RISCV_SRC_QEMU_RV_QEMU_RV_MEMORYMAP_H */ diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/nsh/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/nsh/defconfig index 2cfe94289bb36..b912e51ca1c0d 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/nsh/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/nsh/defconfig @@ -26,6 +26,7 @@ CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y CONFIG_ARCH_INTERRUPTSTACK=2048 CONFIG_ARCH_RISCV=y CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_POWEROFF=y CONFIG_BOARD_LOOPSPERMSEC=6366 CONFIG_BUILTIN=y CONFIG_DEBUG_FULLOPT=y @@ -37,7 +38,6 @@ CONFIG_FS_HOSTFS=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_INIT_ENTRYPOINT="nsh_main" -CONFIG_INTELHEX_BINARY=y CONFIG_LIBC_ENVPATH=y CONFIG_LIBC_EXECFUNCS=y CONFIG_LIBC_PERROR_STDOUT=y diff --git a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig index 049af34f2f5a7..c1c163d677a0f 100644 --- a/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig +++ b/boards/risc-v/qemu-rv/rv-virt/configs/nsh64/defconfig @@ -27,6 +27,7 @@ CONFIG_ARCH_INTERRUPTSTACK=2048 CONFIG_ARCH_RISCV=y CONFIG_ARCH_STACKDUMP=y CONFIG_BCH=y +CONFIG_BOARDCTL_POWEROFF=y CONFIG_BOARD_LOOPSPERMSEC=6366 CONFIG_BUILTIN=y CONFIG_DEBUG_FULLOPT=y @@ -40,7 +41,6 @@ CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INIT_STACKSIZE=3072 -CONFIG_INTELHEX_BINARY=y CONFIG_LIBC_ENVPATH=y CONFIG_LIBC_EXECFUNCS=y CONFIG_LIBC_PERROR_STDOUT=y diff --git a/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c b/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c index aa38aedd32902..fb3292a84a2a9 100644 --- a/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c +++ b/boards/risc-v/qemu-rv/rv-virt/src/qemu_rv_appinit.c @@ -36,6 +36,10 @@ #include +#ifndef CONFIG_BUILD_KERNEL +#include "hardware/qemu_rv_memorymap.h" +#include "qemu_rv_memorymap.h" +#endif #include "riscv_internal.h" #include "romfs.h" @@ -185,7 +189,7 @@ int board_power_off(int status) #ifdef CONFIG_BUILD_KERNEL riscv_sbi_system_reset(SBI_SRST_TYPE_SHUTDOWN, SBI_SRST_REASON_NONE); #else - #warning "to be done" + *(FAR volatile uint32_t *)QEMU_RV_RESET_BASE = QEMU_RV_RESET_DONE; #endif UNUSED(status);