Skip to content

Commit

Permalink
[nrf noup] soc: nordic: nrf54h20: Turn off MRAM suspend
Browse files Browse the repository at this point in the history
Turn off suspending MRAM for nRF54H20 SoC.
This change is required so sections of code depending on critical
timings will not have unacceptable latency.

Signed-off-by: Jan Zyczkowski <[email protected]>
Signed-off-by: Gerard Marull-Paretas <[email protected]>
(cherry picked from commit 58284ff)
(cherry picked from commit 9b6cae8)
(cherry picked from commit 2c2f60d)
  • Loading branch information
zycz authored and gmarull committed Nov 8, 2024
1 parent 4b246a0 commit a70d6bd
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 0 deletions.
2 changes: 2 additions & 0 deletions soc/nordic/nrf54h/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ zephyr_library_sources_ifdef(CONFIG_PM_S2RAM pm_s2ram.c)

zephyr_include_directories(.)

zephyr_library_sources_ifdef(CONFIG_SOC_NRF54H20_NO_MRAM_LATENCY mram.c)

# Ensure that image size aligns with 16 bytes so that MRAMC finalizes all writes
# for the image correctly
zephyr_linker_sources(SECTIONS SORT_KEY zzz_place_align_at_end align.ld)
Expand Down
6 changes: 6 additions & 0 deletions soc/nordic/nrf54h/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,9 @@ config SOC_NRF54H20_ENGB_CPUFLPR
depends on RISCV_CORE_NORDIC_VPR

rsource "gpd/Kconfig"

config SOC_NRF54H20_NO_MRAM_LATENCY
bool "Disallow MRAM latency"
imply NRFS
imply NRFS_MRAM_SERVICE_ENABLED
default y if SOC_NRF54H20_CPUAPP || SOC_NRF54H20_ENGB_CPUAPP
59 changes: 59 additions & 0 deletions soc/nordic/nrf54h/mram.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/init.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/toolchain.h>

#include <services/nrfs_mram.h>
#include <nrfs_backend_ipc_service.h>

LOG_MODULE_REGISTER(mram, CONFIG_SOC_LOG_LEVEL);

static void mram_latency_handler(nrfs_mram_latency_evt_t const *p_evt, void *context)
{
ARG_UNUSED(context);

switch (p_evt->type) {
case NRFS_MRAM_LATENCY_REQ_APPLIED:
LOG_DBG("MRAM latency not allowed setting applied");
break;
case NRFS_MRAM_LATENCY_REQ_REJECTED:
LOG_ERR("MRAM latency not allowed setting rejected");
k_panic();
break;
default:
LOG_WRN("Unexpected event: %d", p_evt->type);
}
}

/* Turn off mram automatic suspend as it causes delays in time depended code sections. */
static int turn_off_suspend_mram(void)
{
nrfs_err_t err;

/* Wait for ipc initialization */
nrfs_backend_wait_for_connection(K_FOREVER);

err = nrfs_mram_init(mram_latency_handler);
if (err != NRFS_SUCCESS) {
LOG_ERR("MRAM service init failed: %d", err);
return -EIO;
}

LOG_DBG("MRAM service initialized, disallow latency");

err = nrfs_mram_set_latency(MRAM_LATENCY_NOT_ALLOWED, NULL);
if (err != NRFS_SUCCESS) {
LOG_ERR("MRAM: set latency failed (%d)", err);
return -EIO;
}

return 0;
}

SYS_INIT(turn_off_suspend_mram, APPLICATION, 90);

0 comments on commit a70d6bd

Please sign in to comment.