File tree Expand file tree Collapse file tree 3 files changed +47
-17
lines changed Expand file tree Collapse file tree 3 files changed +47
-17
lines changed Original file line number Diff line number Diff line change @@ -496,7 +496,8 @@ if(CONFIG_MCUBOOT_CLEANUP_ARM_CORE)
496496 )
497497endif ()
498498
499- if (CONFIG_SOC_NRF54H20_PM_S2RAM_OVERRIDE)
499+ if (CONFIG_SOC_PRE_RAM_HOOK)
500+ zephyr_library_sources(${BOOT_DIR} /zephyr/nrf54h20_custom_s2ram.S)
500501 zephyr_library_sources(${BOOT_DIR} /zephyr/nrf54h20_custom_s2ram.c)
501502endif ()
502503
Original file line number Diff line number Diff line change 1+ /*
2+ * Copyright (c) 2025, Nordic Semiconductor ASA
3+ *
4+ * SPDX-License-Identifier: Apache-2.0
5+ */
6+
7+ /**
8+ * @file
9+ * @brief ARM Cortex-M suspend-to-RAM resume intermediary code (S2RAM)
10+ */
11+
12+
13+
14+ /*
15+ * resume or
16+ * reboot reboot==T
17+ *[S2RAM sleep]---------->[ boot (reset.S) ]---->[soc_pre_ram_hook]---------->[regular boot]
18+ * |
19+ * | resume==T
20+ * \/
21+ * [jump to well-known]
22+ * [ App reset vector ]
23+ */
24+
25+
26+
27+ #include <zephyr/toolchain.h>
28+ #include <zephyr/arch/cpu.h>
29+
30+ GTEXT(pm_s2ram_mark_check_and_mediate)
31+
32+ GTEXT(soc_pre_ram_hook)
33+ SECTION_FUNC(TEXT, soc_pre_ram_hook)
34+ #if DT_NODE_EXISTS(DT_NODELABEL(pm_s2ram_stack)) &&\
35+ DT_NODE_HAS_COMPAT(DT_NODELABEL(pm_s2ram_stack), zephyr_memory_region)
36+ ldr r0, =DT_REG_ADDR(DT_NODELABEL(pm_s2ram_stack)) + DT_REG_SIZE(DT_NODELABEL(pm_s2ram_stack))
37+ #else
38+ #error "The support of bridge for S2RAM resume requires dedicated small stack"
39+ #endif
40+ msr msp, r0
41+ push {r0, lr}
42+ bl pm_s2ram_mark_check_and_mediate
43+ pop {r0, pc}
Original file line number Diff line number Diff line change @@ -30,18 +30,6 @@ volatile struct mcuboot_resume_s mcuboot_resume;
3030 COND_CODE_0(DT_FIXED_PARTITION_EXISTS(DT_NODELABEL(node_label)), (0), \
3131 (DT_REG_ADDR(DT_GPARENT(DT_NODELABEL(node_label))))))
3232
33-
34- int soc_s2ram_suspend (pm_s2ram_system_off_fn_t system_off )
35- {
36- (void )(system_off );
37- return -1 ;
38- }
39-
40- void pm_s2ram_mark_set (void )
41- {
42- /* empty */
43- }
44-
4533struct arm_vector_table {
4634 uint32_t msp ;
4735 uint32_t reset ;
@@ -52,13 +40,13 @@ struct arm_vector_table {
5240 */
5341#define APP_EXE_START_OFFSET 0x800 /* nRF54H20 */
5442
55- bool pm_s2ram_mark_check_and_clear (void )
43+ void pm_s2ram_mark_check_and_mediate (void )
5644{
5745 uint32_t reset_reason = nrf_resetinfo_resetreas_local_get (NRF_RESETINFO );
5846
5947 if (reset_reason != NRF_RESETINFO_RESETREAS_LOCAL_UNRETAINED_MASK ) {
6048 /* Normal boot */
61- return false ;
49+ return ;
6250 }
6351
6452 /* S2RAM resume expected, do doublecheck */
@@ -92,6 +80,4 @@ bool pm_s2ram_mark_check_and_clear(void)
9280
9381resume_failed :
9482 FIH_PANIC ;
95-
96- return true;
9783}
You can’t perform that action at this time.
0 commit comments