soc: nordic: vpr: add workaround for MSTATUS.MIE not waking VPR up
Due to HW issue, VPR needs to keep MSTATUS.MIE enabled during sleep. Otherwise, interrupts will not wake it up. Signed-off-by: Marcin Szymczyk <marcin.szymczyk@nordicsemi.no>
This commit is contained in:
parent
292aafef5a
commit
d248b7bf07
3 changed files with 33 additions and 1 deletions
|
@ -3,6 +3,6 @@
|
||||||
|
|
||||||
zephyr_include_directories(.)
|
zephyr_include_directories(.)
|
||||||
|
|
||||||
zephyr_library_sources(soc_irq.S soc_irq.c vector.S)
|
zephyr_library_sources(soc_idle.c soc_irq.S soc_irq.c vector.S)
|
||||||
|
|
||||||
set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/riscv/common/linker.ld CACHE INTERNAL "")
|
set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/riscv/common/linker.ld CACHE INTERNAL "")
|
||||||
|
|
|
@ -15,5 +15,6 @@ config RISCV_CORE_NORDIC_VPR
|
||||||
select RISCV_SOC_HAS_ISR_STACKING
|
select RISCV_SOC_HAS_ISR_STACKING
|
||||||
select RISCV_SOC_CONTEXT_SAVE
|
select RISCV_SOC_CONTEXT_SAVE
|
||||||
select HAS_FLASH_LOAD_OFFSET
|
select HAS_FLASH_LOAD_OFFSET
|
||||||
|
select ARCH_CPU_IDLE_CUSTOM
|
||||||
help
|
help
|
||||||
Enable support for the RISC-V Nordic VPR core.
|
Enable support for the RISC-V Nordic VPR core.
|
||||||
|
|
31
soc/nordic/common/vpr/soc_idle.c
Normal file
31
soc/nordic/common/vpr/soc_idle.c
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Nordic Semiconductor ASA
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/irq.h>
|
||||||
|
#include <zephyr/tracing/tracing.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Due to a HW issue, VPR requires MSTATUS.MIE to be enabled when entering sleep.
|
||||||
|
* Otherwise it would not wake up.
|
||||||
|
*/
|
||||||
|
void arch_cpu_idle(void)
|
||||||
|
{
|
||||||
|
sys_trace_idle();
|
||||||
|
irq_unlock(MSTATUS_IEN);
|
||||||
|
__asm__ volatile("wfi");
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_cpu_atomic_idle(unsigned int key)
|
||||||
|
{
|
||||||
|
sys_trace_idle();
|
||||||
|
irq_unlock(MSTATUS_IEN);
|
||||||
|
__asm__ volatile("wfi");
|
||||||
|
|
||||||
|
/* Disable interrupts if needed. */
|
||||||
|
__asm__ volatile ("csrc mstatus, %0"
|
||||||
|
:
|
||||||
|
: "r" (~key & MSTATUS_IEN)
|
||||||
|
: "memory");
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue