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:
Marcin Szymczyk 2024-03-15 15:03:57 +01:00 committed by Carles Cufí
parent 292aafef5a
commit d248b7bf07
3 changed files with 33 additions and 1 deletions

View File

@ -3,6 +3,6 @@
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 "")

View File

@ -15,5 +15,6 @@ config RISCV_CORE_NORDIC_VPR
select RISCV_SOC_HAS_ISR_STACKING
select RISCV_SOC_CONTEXT_SAVE
select HAS_FLASH_LOAD_OFFSET
select ARCH_CPU_IDLE_CUSTOM
help
Enable support for the RISC-V Nordic VPR core.

View 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");
}