Skip to content

Commit 419b4e9

Browse files
[nrf fromlist] soc: nordic: nrf54h: Add SCB retention for s2ram
For the Suspend to RAM procedures the SCB content also needs to be retained. Signed-off-by: Adam Kondraciuk <[email protected]>
1 parent 7f22cd3 commit 419b4e9

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

soc/nordic/nrf54h/pm_s2ram.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,26 @@ typedef struct {
4040
uint32_t CTRL;
4141
} _mpu_context_t;
4242

43+
typedef struct {
44+
uint32_t ICSR;
45+
uint32_t VTOR;
46+
uint32_t AIRCR;
47+
uint32_t SCR;
48+
uint32_t CCR;
49+
uint32_t SHPR[12U];
50+
uint32_t SHCSR;
51+
uint32_t CFSR;
52+
uint32_t HFSR;
53+
uint32_t DFSR;
54+
uint32_t MMFAR;
55+
uint32_t BFAR;
56+
uint32_t AFSR;
57+
} _scb_context_t;
58+
4359
struct backup {
4460
_nvic_context_t nvic_context;
4561
_mpu_context_t mpu_context;
62+
_scb_context_t scb_context;
4663
};
4764

4865
static __noinit struct backup backup_data;
@@ -107,10 +124,45 @@ static void nvic_resume(_nvic_context_t *backup)
107124
memcpy((uint32_t *)NVIC->IPR, backup->IPR, sizeof(NVIC->IPR));
108125
}
109126

127+
static void scb_suspend(_scb_context_t *backup)
128+
{
129+
backup->ICSR = SCB->ICSR;
130+
backup->VTOR = SCB->VTOR;
131+
backup->AIRCR = SCB->AIRCR;
132+
backup->SCR = SCB->SCR;
133+
backup->CCR = SCB->CCR;
134+
memcpy(backup->SHPR, (uint32_t *)SCB->SHPR, sizeof(SCB->SHPR));
135+
backup->SHCSR = SCB->SHCSR;
136+
backup->CFSR = SCB->CFSR;
137+
backup->HFSR = SCB->HFSR;
138+
backup->DFSR = SCB->DFSR;
139+
backup->MMFAR = SCB->MMFAR;
140+
backup->BFAR = SCB->BFAR;
141+
backup->AFSR = SCB->AFSR;
142+
}
143+
144+
static void scb_resume(_scb_context_t *backup)
145+
{
146+
SCB->ICSR = backup->ICSR;
147+
SCB->VTOR = backup->VTOR;
148+
SCB->AIRCR = backup->AIRCR;
149+
SCB->SCR = backup->SCR;
150+
SCB->CCR = backup->CCR;
151+
memcpy((uint32_t *)SCB->SHPR, backup->SHPR, sizeof(SCB->SHPR));
152+
SCB->SHCSR = backup->SHCSR;
153+
SCB->CFSR = backup->CFSR;
154+
SCB->HFSR = backup->HFSR;
155+
SCB->DFSR = backup->DFSR;
156+
SCB->MMFAR = backup->MMFAR;
157+
SCB->BFAR = backup->BFAR;
158+
SCB->AFSR = backup->AFSR;
159+
}
160+
110161
int soc_s2ram_suspend(pm_s2ram_system_off_fn_t system_off)
111162
{
112163
int ret;
113164

165+
scb_suspend(&backup_data.scb_context);
114166
nvic_suspend(&backup_data.nvic_context);
115167
mpu_suspend(&backup_data.mpu_context);
116168
ret = arch_pm_s2ram_suspend(system_off);
@@ -120,6 +172,7 @@ int soc_s2ram_suspend(pm_s2ram_system_off_fn_t system_off)
120172

121173
mpu_resume(&backup_data.mpu_context);
122174
nvic_resume(&backup_data.nvic_context);
175+
scb_resume(&backup_data.scb_context);
123176

124177
return ret;
125178
}

0 commit comments

Comments
 (0)