Skip to content

Commit 47bdc77

Browse files
tomchynordicjm
authored andcommitted
suit: Change NVV size from 32 to 8 bits
That way we can use up to 32 variables. Ref: NCSDK-NONE Signed-off-by: Tomasz Chyrowicz <[email protected]>
1 parent 0c03767 commit 47bdc77

File tree

6 files changed

+51
-41
lines changed

6 files changed

+51
-41
lines changed

subsys/suit/storage/include/suit_storage.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ suit_plat_err_t suit_storage_install_envelope(const suit_manifest_class_id_t *id
128128
* @retval SUIT_PLAT_ERR_SIZE unable to read NVVs from the provided area.
129129
* @retval SUIT_PLAT_ERR_NOT_FOUND if the index value is too big.
130130
*/
131-
suit_plat_err_t suit_storage_var_get(size_t index, uint32_t *value);
131+
suit_plat_err_t suit_storage_var_get(size_t index, uint8_t *value);
132132

133133
/**
134134
* @brief Set the value of manifest non-volatile variable.
@@ -142,7 +142,7 @@ suit_plat_err_t suit_storage_var_get(size_t index, uint32_t *value);
142142
* @retval SUIT_PLAT_ERR_HW_NOT_READY if NVM controller is unavailable.
143143
* @retval SUIT_PLAT_ERR_IO if unable to change NVM contents.
144144
*/
145-
suit_plat_err_t suit_storage_var_set(size_t index, uint32_t value);
145+
suit_plat_err_t suit_storage_var_set(size_t index, uint8_t value);
146146

147147
/**
148148
* @brief Erase the report area.

subsys/suit/storage/include/suit_storage_nvv.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
extern "C" {
2727
#endif
2828

29-
#define SUIT_STORAGE_NVV_N_VARS 8
29+
#define SUIT_STORAGE_NVV_N_VARS 32
3030

31-
typedef uint32_t suit_storage_nvv_t[SUIT_STORAGE_NVV_N_VARS];
31+
typedef uint8_t suit_storage_nvv_t[SUIT_STORAGE_NVV_N_VARS];
3232

3333
/**
3434
* @brief Initialize the SUIT storage module managing Manifest Non-volatile variables.
@@ -69,7 +69,7 @@ suit_plat_err_t suit_storage_nvv_erase(uint8_t *area_addr, size_t area_size);
6969
* @retval SUIT_PLAT_ERR_NOT_FOUND if the index value is too big.
7070
*/
7171
suit_plat_err_t suit_storage_nvv_get(const uint8_t *area_addr, size_t area_size, size_t index,
72-
uint32_t *value);
72+
uint8_t *value);
7373

7474
/**
7575
* @brief Set the value of manifest non-volatile variable.
@@ -87,7 +87,7 @@ suit_plat_err_t suit_storage_nvv_get(const uint8_t *area_addr, size_t area_size,
8787
* @retval SUIT_PLAT_ERR_IO if unable to change NVM contents.
8888
*/
8989
suit_plat_err_t suit_storage_nvv_set(uint8_t *area_addr, size_t area_size, size_t index,
90-
uint32_t value);
90+
uint8_t value);
9191

9292
#ifdef __cplusplus
9393
}

subsys/suit/storage/src/suit_storage_nrf54h20.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ suit_plat_err_t suit_storage_install_envelope(const suit_manifest_class_id_t *id
10021002
return err;
10031003
}
10041004

1005-
suit_plat_err_t suit_storage_var_get(size_t index, uint32_t *value)
1005+
suit_plat_err_t suit_storage_var_get(size_t index, uint8_t *value)
10061006
{
10071007
struct suit_storage_app *app_storage = (struct suit_storage_app *)SUIT_STORAGE_APP_ADDRESS;
10081008
size_t area_size = offsetof(struct suit_storage_nvv, digest);
@@ -1013,7 +1013,7 @@ suit_plat_err_t suit_storage_var_get(size_t index, uint32_t *value)
10131013
return suit_storage_nvv_get(area_addr, area_size, index, value);
10141014
}
10151015

1016-
suit_plat_err_t suit_storage_var_set(size_t index, uint32_t value)
1016+
suit_plat_err_t suit_storage_var_set(size_t index, uint8_t value)
10171017
{
10181018
struct suit_storage_app *app_storage = (struct suit_storage_app *)SUIT_STORAGE_APP_ADDRESS;
10191019
size_t area_size = offsetof(struct suit_storage_nvv, digest);

subsys/suit/storage/src/suit_storage_nvv.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010

1111
LOG_MODULE_REGISTER(suit_storage_nvv, CONFIG_SUIT_LOG_LEVEL);
1212

13-
typedef struct {
14-
uint8_t *addr;
15-
size_t size;
16-
} suit_storage_nvv_entry_t;
17-
1813
suit_plat_err_t suit_storage_nvv_init(void)
1914
{
2015
const struct device *fdev = SUIT_PLAT_INTERNAL_NVM_DEV;
@@ -29,7 +24,7 @@ suit_plat_err_t suit_storage_nvv_init(void)
2924
suit_plat_err_t suit_storage_nvv_erase(uint8_t *area_addr, size_t area_size)
3025
{
3126
const struct device *fdev = SUIT_PLAT_INTERNAL_NVM_DEV;
32-
uint8_t nvv_buf[EB_SIZE(suit_storage_nvv_t)];
27+
uint8_t nvv_buf[sizeof(suit_storage_nvv_t)];
3328

3429
if (area_addr == NULL) {
3530
return SUIT_PLAT_ERR_INVAL;
@@ -61,7 +56,7 @@ suit_plat_err_t suit_storage_nvv_erase(uint8_t *area_addr, size_t area_size)
6156
}
6257

6358
suit_plat_err_t suit_storage_nvv_get(const uint8_t *area_addr, size_t area_size, size_t index,
64-
uint32_t *value)
59+
uint8_t *value)
6560
{
6661
suit_storage_nvv_t *vars = (suit_storage_nvv_t *)area_addr;
6762

@@ -87,10 +82,10 @@ suit_plat_err_t suit_storage_nvv_get(const uint8_t *area_addr, size_t area_size,
8782
}
8883

8984
suit_plat_err_t suit_storage_nvv_set(uint8_t *area_addr, size_t area_size, size_t index,
90-
uint32_t value)
85+
uint8_t value)
9186
{
9287
const struct device *fdev = SUIT_PLAT_INTERNAL_NVM_DEV;
93-
uint8_t nvv_buf[EB_SIZE(suit_storage_nvv_t)];
88+
uint8_t nvv_buf[sizeof(suit_storage_nvv_t)];
9489
suit_storage_nvv_t *vars = (suit_storage_nvv_t *)&nvv_buf;
9590

9691
if (area_addr == NULL) {
@@ -110,6 +105,11 @@ suit_plat_err_t suit_storage_nvv_set(uint8_t *area_addr, size_t area_size, size_
110105
}
111106

112107
memcpy(nvv_buf, area_addr, sizeof(nvv_buf));
108+
/* Do not update NVM if the value is already set. */
109+
if ((*vars)[index] == value) {
110+
return SUIT_PLAT_SUCCESS;
111+
}
112+
113113
(*vars)[index] = value;
114114

115115
/* Override regular entry. */

tests/subsys/suit/storage_nrf54h20/src/test_nvv_load.c

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_read)
5050
/* ... and sample root class is supported */
5151
assert_sample_root_class();
5252

53-
uint32_t constants[SUIT_STORAGE_NVV_N_VARS] = {
54-
0x00000000, 0xAAAAAAAA, 0x55AA55AA, 0x01000000,
55-
0x00000001, 0xFFFFFFFF, 0x98EFCDAB, 0xFFFFFFFF,
53+
uint8_t constants[SUIT_STORAGE_NVV_N_VARS] = {
54+
0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA,
55+
0xAA, 0x55, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x01,
56+
0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
57+
0xAB, 0xCD, 0xEF, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
5658
};
5759
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
58-
uint32_t value;
60+
uint8_t value;
5961

6062
/* WHEN the NVV value is read */
6163
err = suit_storage_var_get(i, &value);
@@ -105,20 +107,22 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_write)
105107

106108
/* ... and NVV is set with initial values */
107109
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
108-
uint32_t value;
110+
uint8_t value;
109111

110112
err = suit_storage_var_get(i, &value);
111113
zassert_equal(err, SUIT_PLAT_SUCCESS, "Failed to read NVV at index: %d (%d).", i,
112114
err);
113-
zassert_equal(value, 0xFFFFFFFF,
115+
zassert_equal(value, 0xFF,
114116
"Invalid initial NVV value at index: %d (0x%X != 0x%X).", i, value,
115-
0xFFFFFFFF);
117+
0xFF);
116118
}
117119

118120
/* WHEN NVV variables are updated */
119-
uint32_t constants[SUIT_STORAGE_NVV_N_VARS] = {
120-
0x00000000, 0xAAAAAAAA, 0x55AA55AA, 0x01000000,
121-
0x00000001, 0xFFFFFFFF, 0x98EFCDAB, 0xFFFFFFFF,
121+
uint8_t constants[SUIT_STORAGE_NVV_N_VARS] = {
122+
0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA,
123+
0xAA, 0x55, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x01,
124+
0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
125+
0xAB, 0xCD, 0xEF, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
122126
};
123127
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
124128
err = suit_storage_var_set(i, constants[i]);
@@ -174,12 +178,14 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_ro_backup_read)
174178
/* ... and NVV backup is corrupted after initialization*/
175179
erase_area_app_nvv_backup();
176180

177-
uint32_t constants[SUIT_STORAGE_NVV_N_VARS] = {
178-
0x00000000, 0xAAAAAAAA, 0x55AA55AA, 0x01000000,
179-
0x00000001, 0xFFFFFFFF, 0x98EFCDAB, 0xFFFFFFFF,
181+
uint8_t constants[SUIT_STORAGE_NVV_N_VARS] = {
182+
0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA,
183+
0xAA, 0x55, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x01,
184+
0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
185+
0xAB, 0xCD, 0xEF, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
180186
};
181187
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
182-
uint32_t value;
188+
uint8_t value;
183189

184190
/* WHEN the NVV value is read */
185191
err = suit_storage_var_get(i, &value);
@@ -234,7 +240,7 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_ro_backup_write)
234240
erase_area_app_nvv_backup();
235241

236242
/* WHEN NVV variable is updated */
237-
err = suit_storage_var_set(0, 0x00000000);
243+
err = suit_storage_var_set(0, 0x00);
238244

239245
/* THEN the NVV update succeeds */
240246
zassert_equal(err, SUIT_PLAT_SUCCESS, "Failed to write NVV at index: 0 (%d).", err);
@@ -285,12 +291,14 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_ro_read)
285291
/* ... and NVV area is corrupted after initialization*/
286292
erase_area_app_nvv();
287293

288-
uint32_t constants[SUIT_STORAGE_NVV_N_VARS] = {
289-
0x00000000, 0xAAAAAAAA, 0x55AA55AA, 0x01000000,
290-
0x00000001, 0xFFFFFFFF, 0x98EFCDAB, 0xFFFFFFFF,
294+
uint8_t constants[SUIT_STORAGE_NVV_N_VARS] = {
295+
0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA,
296+
0xAA, 0x55, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x01,
297+
0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
298+
0xAB, 0xCD, 0xEF, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
291299
};
292300
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
293-
uint32_t value;
301+
uint8_t value;
294302

295303
/* WHEN the NVV value is read */
296304
err = suit_storage_var_get(i, &value);
@@ -346,7 +354,7 @@ ZTEST(suit_storage_nrf54h20_nvv_tests, test_app_nvv_ro_write)
346354
erase_area_app_nvv();
347355

348356
/* WHEN NVV variable is updated */
349-
err = suit_storage_var_set(0, 0xABABABAB);
357+
err = suit_storage_var_set(0, 0xAB);
350358

351359
/* THEN the NVV update fails */
352360
zassert_equal(err, SUIT_PLAT_ERR_IO, "NVV corrupted by writing to the read-only area");

tests/subsys/suit/storage_nrf54h20/src/test_storage_purge.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,15 @@ ZTEST(suit_storage_nrf54h20_bare_recovery_tests, test_storage_purge_populated_st
167167
}
168168

169169
/* ... and the NVVs are still present */
170-
uint32_t constants[SUIT_STORAGE_NVV_N_VARS] = {
171-
0x00000000, 0xAAAAAAAA, 0x55AA55AA, 0x01000000,
172-
0x00000001, 0xFFFFFFFF, 0x98EFCDAB, 0xFFFFFFFF,
170+
uint8_t constants[SUIT_STORAGE_NVV_N_VARS] = {
171+
0x00, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0xAA, 0xAA,
172+
0xAA, 0x55, 0xAA, 0x55, 0x00, 0x00, 0x00, 0x01,
173+
0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
174+
0xAB, 0xCD, 0xEF, 0x98, 0xFF, 0xFF, 0xFF, 0xFF,
173175
};
174176

175177
for (size_t i = 0; i < SUIT_STORAGE_NVV_N_VARS; i++) {
176-
uint32_t value;
178+
uint8_t value;
177179

178180
/* WHEN the NVV value is read */
179181
err = suit_storage_var_get(i, &value);

0 commit comments

Comments
 (0)