Skip to content

Commit 0c03767

Browse files
tomchynordicjm
authored andcommitted
suit: Introduce foreground DFU states
Introduce missing values for foreground DFU in SUIT execution mode as well as SUIT orchestrator module. Ref: NCSDK-29996 Signed-off-by: Tomasz Chyrowicz <[email protected]>
1 parent d7b9164 commit 0c03767

35 files changed

+1587
-219
lines changed

subsys/suit/execution_mode/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
zephyr_interface_library_named(suit_execution_mode)
99
target_include_directories(suit_execution_mode INTERFACE include)
1010
target_link_libraries(suit_execution_mode INTERFACE suit_platform_err)
11+
target_link_libraries(suit_execution_mode INTERFACE suit_metadata)
1112

1213
zephyr_library()
1314
zephyr_library_sources(src/suit_execution_mode.c)

subsys/suit/execution_mode/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
config SUIT_EXECUTION_MODE
88
bool "Enable SUIT execution mode module"
9+
depends on SUIT_METADATA
910

1011
config APP_LINK_WITH_SUIT_EXECUTION_MODE
1112
bool

subsys/suit/execution_mode/include/suit_execution_mode.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,31 @@
99

1010
#include <stdbool.h>
1111
#include <suit_plat_err.h>
12+
#include <suit_metadata.h>
1213

1314
#ifdef __cplusplus
1415
extern "C" {
1516
#endif
1617

18+
/**
19+
* @brief SUIT orchestrator execution mode.
20+
*/
1721
typedef enum {
1822
EXECUTION_MODE_STARTUP = 0,
1923
EXECUTION_MODE_INVOKE,
24+
EXECUTION_MODE_INVOKE_FOREGROUND_DFU,
2025
EXECUTION_MODE_INVOKE_RECOVERY,
2126
EXECUTION_MODE_INSTALL,
27+
EXECUTION_MODE_INSTALL_FOREGROUND_DFU,
2228
EXECUTION_MODE_INSTALL_RECOVERY,
2329
EXECUTION_MODE_POST_INVOKE,
30+
EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU,
2431
EXECUTION_MODE_POST_INVOKE_RECOVERY,
2532
EXECUTION_MODE_FAIL_NO_MPI,
2633
EXECUTION_MODE_FAIL_MPI_INVALID,
2734
EXECUTION_MODE_FAIL_MPI_INVALID_MISSING,
2835
EXECUTION_MODE_FAIL_MPI_UNSUPPORTED,
36+
EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU,
2937
EXECUTION_MODE_FAIL_INVOKE_RECOVERY,
3038
EXECUTION_MODE_FAIL_INSTALL_NORDIC_TOP,
3139
EXECUTION_MODE_FAIL_STARTUP,
@@ -111,6 +119,16 @@ bool suit_execution_mode_updating(void);
111119
*/
112120
bool suit_execution_mode_failed(void);
113121

122+
/**
123+
* @brief Convert internal execution mode used by the SUIT orchestrator to the
124+
* corresponding value of suit_boot_mode_t enum.
125+
*
126+
* @param[in] exec_mode The value of SUIT orchestrator execution mode
127+
*
128+
* @retval Value of the suit_boot_mode_t enum
129+
*/
130+
suit_boot_mode_t suit_execution_mode_to_boot_mode(suit_execution_mode_t exec_mode);
131+
114132
#ifdef __cplusplus
115133
}
116134
#endif

subsys/suit/execution_mode/src/suit_execution_mode.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,14 @@ void suit_execution_mode_startup_failed(void)
3333
case EXECUTION_MODE_FAIL_INSTALL_NORDIC_TOP:
3434
/* SUIT processes update candiadate. */
3535
case EXECUTION_MODE_INSTALL:
36+
/* SUIT processes recovery as foreground update. */
37+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
3638
/* SUIT processes recovery update. */
3739
case EXECUTION_MODE_INSTALL_RECOVERY:
3840
/* SUIT boots from root manifest. */
3941
case EXECUTION_MODE_INVOKE:
42+
/* SUIT boots from recovery manifest as foreground update. */
43+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
4044
/* SUIT boots from recovery manifest. */
4145
case EXECUTION_MODE_INVOKE_RECOVERY:
4246
current_execution_mode = EXECUTION_MODE_FAIL_STARTUP;
@@ -50,10 +54,14 @@ void suit_execution_mode_startup_failed(void)
5054
case EXECUTION_MODE_FAIL_MPI_INVALID_MISSING:
5155
/* System not booted, MPI misconfigured. */
5256
case EXECUTION_MODE_FAIL_MPI_UNSUPPORTED:
57+
/* System not booted, unable to boot recovery manifest as foreground update. */
58+
case EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU:
5359
/* System not booted, unable to boot recovery manifest. */
5460
case EXECUTION_MODE_FAIL_INVOKE_RECOVERY:
5561
/* System booted from root manifest. */
5662
case EXECUTION_MODE_POST_INVOKE:
63+
/* System booted from recovery manifest as foreground update. */
64+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
5765
/* System booted from recovery manifest. */
5866
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
5967
/* System failed before invoking SUIT orchestrator. */
@@ -68,12 +76,16 @@ bool suit_execution_mode_booting(void)
6876
switch (current_execution_mode) {
6977
/* SUIT processes update candiadate. */
7078
case EXECUTION_MODE_INSTALL:
79+
/* SUIT processes recovery as foreground update. */
80+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
7181
/* SUIT processes recovery update. */
7282
case EXECUTION_MODE_INSTALL_RECOVERY:
7383
/* System is unprovisioned, SUIT updates Nordic components. */
7484
case EXECUTION_MODE_FAIL_INSTALL_NORDIC_TOP:
7585
/* System booted from root manifest. */
7686
case EXECUTION_MODE_POST_INVOKE:
87+
/* System booted from recovery manifest as foreground update. */
88+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
7789
/* System booted from recovery manifest. */
7890
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
7991
/* System not booted, application MPI missing. */
@@ -84,6 +96,8 @@ bool suit_execution_mode_booting(void)
8496
case EXECUTION_MODE_FAIL_MPI_INVALID_MISSING:
8597
/* System not booted, MPI misconfigured. */
8698
case EXECUTION_MODE_FAIL_MPI_UNSUPPORTED:
99+
/* System not booted, unable to boot recovery manifest as foreground update. */
100+
case EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU:
87101
/* System not booted, unable to boot recovery manifest. */
88102
case EXECUTION_MODE_FAIL_INVOKE_RECOVERY:
89103
/* System failed before invoking SUIT orchestrator. */
@@ -94,6 +108,8 @@ bool suit_execution_mode_booting(void)
94108
case EXECUTION_MODE_STARTUP:
95109
/* SUIT boots from root manifest. */
96110
case EXECUTION_MODE_INVOKE:
111+
/* SUIT boots from recovery manifest as foreground update. */
112+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
97113
/* SUIT boots from recovery manifest. */
98114
case EXECUTION_MODE_INVOKE_RECOVERY:
99115
break;
@@ -108,10 +124,14 @@ bool suit_execution_mode_updating(void)
108124
switch (current_execution_mode) {
109125
/* SUIT boots from root manifest. */
110126
case EXECUTION_MODE_INVOKE:
127+
/* SUIT boots from recovery manifest as foreground update. */
128+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
111129
/* SUIT boots from recovery manifest. */
112130
case EXECUTION_MODE_INVOKE_RECOVERY:
113131
/* System booted from root manifest. */
114132
case EXECUTION_MODE_POST_INVOKE:
133+
/* System booted from recovery manifest as foreground update. */
134+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
115135
/* System booted from recovery manifest. */
116136
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
117137
/* System not booted, application MPI missing. */
@@ -122,6 +142,8 @@ bool suit_execution_mode_updating(void)
122142
case EXECUTION_MODE_FAIL_MPI_INVALID_MISSING:
123143
/* System not booted, MPI misconfigured. */
124144
case EXECUTION_MODE_FAIL_MPI_UNSUPPORTED:
145+
/* System not booted, unable to boot recovery manifest as foreground update. */
146+
case EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU:
125147
/* System not booted, unable to boot recovery manifest. */
126148
case EXECUTION_MODE_FAIL_INVOKE_RECOVERY:
127149
/* System failed before invoking SUIT orchestrator. */
@@ -132,6 +154,8 @@ bool suit_execution_mode_updating(void)
132154
case EXECUTION_MODE_STARTUP:
133155
/* SUIT processes update candiadate. */
134156
case EXECUTION_MODE_INSTALL:
157+
/* SUIT processes recovery as foreground update. */
158+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
135159
/* SUIT processes recovery update. */
136160
case EXECUTION_MODE_INSTALL_RECOVERY:
137161
/* System is unprovisioned, SUIT updates Nordic components. */
@@ -150,14 +174,20 @@ bool suit_execution_mode_failed(void)
150174
case EXECUTION_MODE_STARTUP:
151175
/* SUIT processes update candiadate. */
152176
case EXECUTION_MODE_INSTALL:
177+
/* SUIT processes recovery as foreground update. */
178+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
153179
/* SUIT processes recovery update. */
154180
case EXECUTION_MODE_INSTALL_RECOVERY:
155181
/* SUIT boots from root manifest. */
156182
case EXECUTION_MODE_INVOKE:
183+
/* SUIT boots from recovery manifest as foreground update. */
184+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
157185
/* SUIT boots from recovery manifest. */
158186
case EXECUTION_MODE_INVOKE_RECOVERY:
159187
/* System booted from root manifest. */
160188
case EXECUTION_MODE_POST_INVOKE:
189+
/* System booted from recovery manifest as foreground update. */
190+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
161191
/* System booted from recovery manifest. */
162192
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
163193
/* System is unprovisioned, SUIT updates Nordic components. */
@@ -172,6 +202,8 @@ bool suit_execution_mode_failed(void)
172202
case EXECUTION_MODE_FAIL_MPI_INVALID_MISSING:
173203
/* System not booted, MPI misconfigured. */
174204
case EXECUTION_MODE_FAIL_MPI_UNSUPPORTED:
205+
/* System not booted, unable to boot recovery manifest as foreground update. */
206+
case EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU:
175207
/* System not booted, unable to boot recovery manifest. */
176208
case EXECUTION_MODE_FAIL_INVOKE_RECOVERY:
177209
/* System failed before invoking SUIT orchestrator. */
@@ -182,3 +214,47 @@ bool suit_execution_mode_failed(void)
182214

183215
return true;
184216
}
217+
218+
suit_boot_mode_t suit_execution_mode_to_boot_mode(suit_execution_mode_t exec_mode)
219+
{
220+
switch (exec_mode) {
221+
case EXECUTION_MODE_INVOKE:
222+
return SUIT_BOOT_MODE_INVOKE;
223+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
224+
return SUIT_BOOT_MODE_INVOKE_FOREGROUND_DFU;
225+
case EXECUTION_MODE_INVOKE_RECOVERY:
226+
return SUIT_BOOT_MODE_INVOKE_RECOVERY;
227+
case EXECUTION_MODE_INSTALL:
228+
return SUIT_BOOT_MODE_INSTALL;
229+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
230+
return SUIT_BOOT_MODE_INSTALL_FOREGROUND_DFU;
231+
case EXECUTION_MODE_INSTALL_RECOVERY:
232+
return SUIT_BOOT_MODE_INSTALL_RECOVERY;
233+
case EXECUTION_MODE_POST_INVOKE:
234+
return SUIT_BOOT_MODE_POST_INVOKE;
235+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
236+
return SUIT_BOOT_MODE_POST_INVOKE_FOREGROUND_DFU;
237+
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
238+
return SUIT_BOOT_MODE_POST_INVOKE_RECOVERY;
239+
case EXECUTION_MODE_FAIL_NO_MPI:
240+
return SUIT_BOOT_MODE_FAIL_NO_MPI;
241+
case EXECUTION_MODE_FAIL_MPI_INVALID:
242+
return SUIT_BOOT_MODE_FAIL_MPI_INVALID;
243+
case EXECUTION_MODE_FAIL_MPI_INVALID_MISSING:
244+
return SUIT_BOOT_MODE_FAIL_MPI_INVALID_MISSING;
245+
case EXECUTION_MODE_FAIL_MPI_UNSUPPORTED:
246+
return SUIT_BOOT_MODE_FAIL_MPI_UNSUPPORTED;
247+
case EXECUTION_MODE_FAIL_INVOKE_FOREGROUND_DFU:
248+
return SUIT_BOOT_MODE_FAIL_INVOKE_FOREGROUND_DFU;
249+
case EXECUTION_MODE_FAIL_INVOKE_RECOVERY:
250+
return SUIT_BOOT_MODE_FAIL_INVOKE_RECOVERY;
251+
case EXECUTION_MODE_FAIL_INSTALL_NORDIC_TOP:
252+
return SUIT_BOOT_MODE_FAIL_INSTALL_NORDIC_TOP;
253+
case EXECUTION_MODE_FAIL_STARTUP:
254+
return SUIT_BOOT_MODE_FAIL_STARTUP;
255+
default:
256+
break;
257+
}
258+
259+
return SUIT_BOOT_MODE_UNKNOWN;
260+
}

subsys/suit/mci/src/suit_mci_nrf54h20.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ mci_err_t suit_mci_invoke_order_get(const suit_manifest_class_id_t **class_id, s
6060
}
6161
break;
6262

63+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
6364
case EXECUTION_MODE_INVOKE_RECOVERY:
6465
if (suit_storage_mpi_class_get(SUIT_MANIFEST_SEC_TOP, &class_id[0]) !=
6566
SUIT_PLAT_SUCCESS) {
@@ -143,8 +144,11 @@ mci_err_t suit_mci_independent_update_policy_get(const suit_manifest_class_id_t
143144
* update candidate before resetting the SoC.
144145
*/
145146
switch (suit_execution_mode_get()) {
147+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
146148
case EXECUTION_MODE_INVOKE_RECOVERY:
149+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
147150
case EXECUTION_MODE_INSTALL_RECOVERY:
151+
case EXECUTION_MODE_POST_INVOKE_FOREGROUND_DFU:
148152
case EXECUTION_MODE_POST_INVOKE_RECOVERY:
149153
if ((role == SUIT_MANIFEST_APP_RECOVERY) || (role == SUIT_MANIFEST_RAD_RECOVERY)) {
150154
*policy = SUIT_INDEPENDENT_UPDATE_DENIED;
@@ -248,7 +252,7 @@ mci_err_t suit_mci_signing_key_id_validate(const suit_manifest_class_id_t *class
248252
return SUIT_PLAT_SUCCESS;
249253
} else if ((mpi->signature_verification_policy ==
250254
SUIT_MPI_SIGNATURE_CHECK_ENABLED_ON_UPDATE) &&
251-
(suit_execution_mode_get() == EXECUTION_MODE_INVOKE)) {
255+
suit_execution_mode_booting()) {
252256
/* By allowing key_id == 0 in the invoke path, the platform will verify
253257
* the signature only during updates.
254258
*/
@@ -641,6 +645,7 @@ suit_mci_manifest_process_dependency_validate(const suit_manifest_class_id_t *pa
641645
}
642646
break;
643647

648+
case EXECUTION_MODE_INSTALL_FOREGROUND_DFU:
644649
case EXECUTION_MODE_INSTALL_RECOVERY:
645650
if ((parent_role == SUIT_MANIFEST_SEC_TOP) &&
646651
((child_role == SUIT_MANIFEST_SEC_SYSCTRL) ||
@@ -658,6 +663,7 @@ suit_mci_manifest_process_dependency_validate(const suit_manifest_class_id_t *pa
658663
}
659664
break;
660665

666+
case EXECUTION_MODE_INVOKE_FOREGROUND_DFU:
661667
case EXECUTION_MODE_INVOKE_RECOVERY:
662668
if ((parent_role == SUIT_MANIFEST_SEC_TOP) &&
663669
((child_role == SUIT_MANIFEST_SEC_SYSCTRL) ||

subsys/suit/metadata/include/suit_metadata.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,30 @@ typedef enum {
178178
SUIT_SECDOM_COMPONENT_NUMBER_SDFW_RECOVERY = 2,
179179
} suit_secure_domain_component_number_t;
180180

181+
/**
182+
* @brief SUIT boot mode.
183+
*/
184+
typedef enum {
185+
SUIT_BOOT_MODE_UNKNOWN = 0,
186+
SUIT_BOOT_MODE_INVOKE = 1,
187+
SUIT_BOOT_MODE_INVOKE_FOREGROUND_DFU = 2,
188+
SUIT_BOOT_MODE_INVOKE_RECOVERY = 3,
189+
SUIT_BOOT_MODE_INSTALL = 4,
190+
SUIT_BOOT_MODE_INSTALL_FOREGROUND_DFU = 5,
191+
SUIT_BOOT_MODE_INSTALL_RECOVERY = 6,
192+
SUIT_BOOT_MODE_POST_INVOKE = 7,
193+
SUIT_BOOT_MODE_POST_INVOKE_FOREGROUND_DFU = 8,
194+
SUIT_BOOT_MODE_POST_INVOKE_RECOVERY = 9,
195+
SUIT_BOOT_MODE_FAIL_NO_MPI = 10,
196+
SUIT_BOOT_MODE_FAIL_MPI_INVALID = 11,
197+
SUIT_BOOT_MODE_FAIL_MPI_INVALID_MISSING = 12,
198+
SUIT_BOOT_MODE_FAIL_MPI_UNSUPPORTED = 13,
199+
SUIT_BOOT_MODE_FAIL_INVOKE_FOREGROUND_DFU = 14,
200+
SUIT_BOOT_MODE_FAIL_INVOKE_RECOVERY = 15,
201+
SUIT_BOOT_MODE_FAIL_INSTALL_NORDIC_TOP = 16,
202+
SUIT_BOOT_MODE_FAIL_STARTUP = 17,
203+
} suit_boot_mode_t;
204+
181205
/**
182206
* @brief Checks if two suit_uuid_t structures hold the same uuid value
183207
*

0 commit comments

Comments
 (0)