17 #define ITS_METADATA_BLOCK0 0
18 #define ITS_METADATA_BLOCK1 1
25 #define ITS_OTHER_META_BLOCK(metablock) \
26 (((metablock) == ITS_METADATA_BLOCK0) ? \
27 (ITS_METADATA_BLOCK1) : (ITS_METADATA_BLOCK0))
29 #define ITS_BLOCK_META_HEADER_SIZE sizeof(struct its_metadata_block_header_t)
30 #define ITS_BLOCK_METADATA_SIZE sizeof(struct its_block_meta_t)
31 #define ITS_FILE_METADATA_SIZE sizeof(struct its_file_meta_t)
42 __attribute__((always_inline))
43 static inline uint32_t its_init_scratch_dblock(
50 return fs_ctx->flash_info->num_blocks == 2 ? 1 : 2;
61 __attribute__((always_inline))
68 return fs_ctx->flash_info->num_blocks == 2 ? 0 : 3;
96 __attribute__((always_inline))
102 return its_num_dedicated_dblocks(fs_ctx) + 1;
112 static size_t its_mblock_block_meta_offset(uint32_t lblock)
155 static uint8_t its_mblock_latest_meta_block(
169 if ((meta1_swap_count == 0) && (meta0_swap_count != 1)) {
175 }
else if ((meta0_swap_count == 0) && (meta1_swap_count != 1)) {
181 }
else if (meta1_swap_count > meta0_swap_count) {
197 #ifdef ITS_VALIDATE_METADATA_FROM_FLASH
208 __attribute__((always_inline))
209 static inline
psa_status_t its_mblock_validate_file_meta(
218 if (file_meta->lblock >= its_num_active_dblocks(fs_ctx)) {
227 if (file_meta->max_size > fs_ctx->flash_info->max_file_size) {
234 if (file_meta->cur_size > file_meta->max_size) {
240 if (file_meta->data_idx < its_mblock_file_meta_offset(fs_ctx,
241 fs_ctx->flash_info->max_num_files)) {
249 file_meta->max_size);
268 __attribute__((always_inline))
269 static inline
psa_status_t its_mblock_validate_block_meta(
275 size_t valid_data_start_value = 0;
277 if (block_meta->phy_id >= fs_ctx->flash_info->num_blocks) {
285 block_meta->data_start,
286 block_meta->free_size);
297 valid_data_start_value = its_mblock_file_meta_offset(fs_ctx,
298 fs_ctx->flash_info->max_num_files);
301 if (block_meta->data_start != valid_data_start_value) {
361 uint32_t scratch_datablock;
398 static psa_status_t its_mblock_update_scratch_block_meta(
406 pos = its_mblock_block_meta_offset(lblock);
409 (
const uint8_t *)block_meta, pos,
421 static psa_status_t its_mblock_copy_remaining_block_meta(
429 uint32_t scratch_block;
454 block_meta.
phy_id = scratch_block;
467 size = its_mblock_block_meta_offset(lblock) - pos;
472 scratch_block, pos, meta_block,
481 pos = its_mblock_block_meta_offset(lblock+1);
483 size = its_mblock_file_meta_offset(fs_ctx, 0) - pos;
486 meta_block, pos, size);
497 __attribute__((always_inline))
498 static inline
psa_status_t its_mblock_validate_swap_count(
514 return (swap_count == fs_ctx->flash_info->erase_val)
526 __attribute__((always_inline))
527 static inline
psa_status_t its_mblock_validate_fs_version(uint8_t fs_version)
552 err = its_mblock_validate_fs_version(h_meta->
fs_version);
567 static psa_status_t its_mblock_write_scratch_meta_header(
575 err = its_mblock_validate_swap_count(fs_ctx,
624 const uint8_t *fid,
size_t size,
632 for (i = 0; i < its_num_active_dblocks(fs_ctx); i++) {
646 file_meta->
flags = flags;
672 uint8_t num_valid_meta_blocks = 0;
681 (uint8_t *)&h_meta0, 0,
684 if (its_mblock_validate_header_meta(fs_ctx, &h_meta0) ==
PSA_SUCCESS) {
685 num_valid_meta_blocks++;
691 (uint8_t *)&h_meta1, 0,
694 if (its_mblock_validate_header_meta(fs_ctx, &h_meta1) ==
PSA_SUCCESS) {
695 num_valid_meta_blocks++;
704 if (num_valid_meta_blocks > 1) {
705 cur_meta_block = its_mblock_latest_meta_block(&h_meta0, &h_meta1);
706 }
else if (num_valid_meta_blocks == 0) {
721 size_t pos_start = its_mblock_file_meta_offset(fs_ctx, idx_start);
722 size_t pos_end = its_mblock_file_meta_offset(fs_ctx, idx_end);
730 pos_end - pos_start);
785 if (tmp_metadata.
flags & flags) {
805 err = its_init_get_active_metablock(fs_ctx);
810 err = its_mblock_read_meta_header(fs_ctx);
816 return its_mblock_erase_scratch_blocks(fs_ctx);
825 err = its_mblock_write_scratch_meta_header(fs_ctx);
837 its_mblock_swap_metablocks(fs_ctx);
840 return its_mblock_erase_scratch_blocks(fs_ctx);
876 offset = its_mblock_file_meta_offset(fs_ctx, idx);
878 (uint8_t *)file_meta, offset,
881 #ifdef ITS_VALIDATE_METADATA_FROM_FLASH
883 err = its_mblock_validate_file_meta(fs_ctx, file_meta);
898 pos = its_mblock_block_meta_offset(lblock);
900 (uint8_t *)block_meta, pos,
903 #ifdef ITS_VALIDATE_METADATA_FROM_FLASH
905 err = its_mblock_validate_block_meta(fs_ctx, block_meta);
924 err = its_mblock_reserve_file(fs_ctx, fid, size, flags, file_meta,
927 *idx = its_get_free_file_index(fs_ctx, use_spare);
949 if (its_init_get_active_metablock(fs_ctx) ==
PSA_SUCCESS) {
954 metablock_to_erase_first);
993 for (i = 0; i < its_num_dedicated_dblocks(fs_ctx); i++) {
998 i + its_init_dblock_start(fs_ctx));
1008 for (i = 0; i < its_num_dedicated_dblocks(fs_ctx); i++) {
1009 block_meta.
phy_id = i + its_init_dblock_start(fs_ctx);
1010 err = its_mblock_update_scratch_block_meta(fs_ctx, i + 1, &block_meta);
1029 err = its_mblock_write_scratch_meta_header(fs_ctx);
1041 its_mblock_swap_metablocks(fs_ctx);
1047 uint32_t phy_id, uint32_t lblock)
1069 err = its_mblock_update_scratch_block_meta(fs_ctx, lblock, block_meta);
1074 return its_mblock_copy_remaining_block_meta(fs_ctx, lblock);
1085 pos = its_mblock_file_meta_offset(fs_ctx, idx);
1088 (
const uint8_t *)file_meta, pos,
#define ITS_OTHER_META_BLOCK(metablock)
Macro to get the the swap metadata block.
psa_status_t its_flash_fs_mblock_update_scratch_block_meta(struct its_flash_fs_ctx_t *fs_ctx, uint32_t lblock, struct its_block_meta_t *block_meta)
Puts logical block's metadata in scratch metadata block.
const struct its_flash_info_t * flash_info
#define ITS_LOGICAL_DBLOCK0
Defines logical data block 0 ID.
psa_status_t its_flash_fs_mblock_get_file_idx(struct its_flash_fs_ctx_t *fs_ctx, const uint8_t *fid, uint32_t *idx)
Gets file metadata entry index.
psa_status_t(* erase)(const struct its_flash_info_t *info, uint32_t block_id)
Erases block ID data.
#define PSA_ERROR_STORAGE_FAILURE
__STATIC_INLINE void * tfm_memset(void *ptr, int value, size_t num)
uint32_t scratch_metablock
#define ITS_BLOCK_META_HEADER_SIZE
uint32_t active_metablock
psa_status_t its_utils_validate_fid(const uint8_t *fid)
Validates file ID.
psa_status_t its_flash_fs_mblock_read_block_metadata(struct its_flash_fs_ctx_t *fs_ctx, uint32_t lblock, struct its_block_meta_t *block_meta)
Reads specified logical block metadata.
#define ITS_FILE_METADATA_SIZE
struct its_metadata_block_header_t meta_block_header
psa_status_t its_flash_block_to_block_move(const struct its_flash_info_t *info, uint32_t dst_block, size_t dst_offset, uint32_t src_block, size_t src_offset, size_t size)
Moves data from source block ID to destination block ID.
uint32_t its_flash_fs_mblock_cur_data_scratch_id(struct its_flash_fs_ctx_t *fs_ctx, uint32_t lblock)
Gets current scratch datablock physical ID.
psa_status_t its_flash_fs_mblock_reserve_file(struct its_flash_fs_ctx_t *fs_ctx, const uint8_t *fid, bool use_spare, size_t size, uint32_t flags, uint32_t *idx, struct its_file_meta_t *file_meta, struct its_block_meta_t *block_meta)
Reserves space for a file.
#define PSA_ERROR_INSUFFICIENT_STORAGE
void its_flash_fs_mblock_set_data_scratch(struct its_flash_fs_ctx_t *fs_ctx, uint32_t phy_id, uint32_t lblock)
Sets current data scratch block.
psa_status_t(* read)(const struct its_flash_info_t *info, uint32_t block_id, uint8_t *buff, size_t offset, size_t size)
Reads block data from the position specified by block ID and offset.
#define PSA_ERROR_GENERIC_ERROR
psa_status_t its_flash_fs_mblock_reset_metablock(struct its_flash_fs_ctx_t *fs_ctx)
Resets metablock by cleaning and initializing the metadatablock.
psa_status_t its_utils_check_contained_in(size_t superset_size, size_t subset_offset, size_t subset_size)
Checks if a subset region is fully contained within a superset region.
#define ITS_METADATA_INVALID_INDEX
Defines the invalid index value when the metadata table is full.
#define ITS_SUPPORTED_VERSION
Defines the supported version.
psa_status_t(* flush)(const struct its_flash_info_t *info)
Flushes modifications to a block to flash. Must be called after a sequence of calls to write() (inclu...
psa_status_t its_flash_fs_mblock_meta_update_finalize(struct its_flash_fs_ctx_t *fs_ctx)
Finalizes an update operation. Last step when a create/write/delete is performed. ...
#define ITS_BLOCK_METADATA_SIZE
psa_status_t its_flash_fs_mblock_read_file_meta(struct its_flash_fs_ctx_t *fs_ctx, uint32_t idx, struct its_file_meta_t *file_meta)
Reads specified file metadata.
psa_status_t its_flash_fs_mblock_get_file_idx_flag(struct its_flash_fs_ctx_t *fs_ctx, uint32_t flags, uint32_t *idx)
Gets file metadata entry index of the first file with one of the provided flags set.
__STATIC_INLINE void * tfm_memcpy(void *dest, const void *src, size_t num)
__STATIC_INLINE int tfm_memcmp(const void *ptr1, const void *ptr2, size_t num)
psa_status_t its_flash_fs_mblock_cp_file_meta(struct its_flash_fs_ctx_t *fs_ctx, uint32_t idx_start, uint32_t idx_end)
Copies the file metadata entries between two indexes from the active metadata block to the scratch me...
Structure to store the ITS flash file system context.
psa_status_t(* init)(const struct its_flash_info_t *info)
Initialize the Flash Interface.
#define ITS_METADATA_BLOCK1
#define PSA_ERROR_DOES_NOT_EXIST
#define ITS_BLOCK_INVALID_ID
psa_status_t its_flash_fs_mblock_update_scratch_file_meta(struct its_flash_fs_ctx_t *fs_ctx, uint32_t idx, const struct its_file_meta_t *file_meta)
Writes a file metadata entry into scratch metadata block.
int32_t psa_status_t
Function return status.
#define PSA_ERROR_DATA_CORRUPT
#define ITS_DEFAULT_EMPTY_BUFF_VAL
psa_status_t its_flash_fs_mblock_init(struct its_flash_fs_ctx_t *fs_ctx)
Initializes metadata block with the valid/active metablock.
#define ITS_METADATA_BLOCK0
psa_status_t(* write)(const struct its_flash_info_t *info, uint32_t block_id, const uint8_t *buff, size_t offset, size_t size)
Writes block data to the position specified by block ID and offset.
psa_status_t its_flash_fs_mblock_migrate_lb0_data_to_scratch(struct its_flash_fs_ctx_t *fs_ctx)
Writes the files data area of logical block 0 into the scratch block.