TF-M Reference Manual  1.2.0
TrustedFirmware-M
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
its_flash.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
3  * Copyright (c) 2020 Cypress Semiconductor Corporation. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  */
8 
9 #include "its_flash.h"
10 
11 #include "flash_fs/its_flash_fs.h"
12 #include "tfm_hal_its.h"
13 #include "tfm_hal_ps.h"
14 
15 #ifndef ITS_MAX_BLOCK_DATA_COPY
16 #define ITS_MAX_BLOCK_DATA_COPY 256
17 #endif
18 
21 
22 static struct its_flash_info_t *const flash_infos[] = {
25 };
26 
28 {
29  struct its_flash_info_t *ret = flash_infos[id];
30 
31  /* Ask the platform for the filesystem config */
32  switch (id) {
34  tfm_hal_its_fs_info(&ret->fs_info.flash_area_addr, &ret->fs_info.flash_area_size);
35  break;
36 
38  tfm_hal_ps_fs_info(&ret->fs_info.flash_area_addr, &ret->fs_info.flash_area_size);
39  break;
40 
41  default:
42  return NULL;
43  }
44 
45  /* Derive num_blocks */
46  ret->num_blocks = ret->fs_info.flash_area_size / ret->block_size;
47 
48  /* Check that the parameters are compatible */
50  ret = NULL;
51  }
52 
53  return ret;
54 }
55 
57  uint32_t dst_block,
58  size_t dst_offset,
59  uint32_t src_block,
60  size_t src_offset,
61  size_t size)
62 {
63  psa_status_t status;
64  size_t bytes_to_move;
65  uint8_t dst_block_data_copy[ITS_MAX_BLOCK_DATA_COPY];
66 
67  while (size > 0) {
68  /* Calculates the number of bytes to move */
69  bytes_to_move = ITS_UTILS_MIN(size, ITS_MAX_BLOCK_DATA_COPY);
70 
71  /* Reads data from source block and store it in the in-memory copy of
72  * destination content.
73  */
74  status = info->read(info, src_block, dst_block_data_copy, src_offset,
75  bytes_to_move);
76  if (status != PSA_SUCCESS) {
77  return status;
78  }
79 
80  /* Writes in flash the in-memory block content after modification */
81  status = info->write(info, dst_block, dst_block_data_copy, dst_offset,
82  bytes_to_move);
83  if (status != PSA_SUCCESS) {
84  return status;
85  }
86 
87  /* Updates pointers to the source and destination flash regions */
88  dst_offset += bytes_to_move;
89  src_offset += bytes_to_move;
90 
91  /* Decrement remaining size to move */
92  size -= bytes_to_move;
93  }
94 
95  return PSA_SUCCESS;
96 }
uint32_t flash_area_addr
Definition: its_flash.h:63
#define PSA_SUCCESS
Definition: crypto_values.h:35
Internal Trusted Storage service filesystem abstraction APIs. The purpose of this abstraction is to h...
psa_status_t its_flash_fs_validate_params(const struct its_flash_info_t *info)
Validates the configuration of the flash filesystem.
Definition: its_flash_fs.c:541
uint16_t block_size
Definition: its_flash.h:160
#define ITS_MAX_BLOCK_DATA_COPY
Definition: its_flash.c:16
struct its_flash_info_t its_flash_info_external
its_flash_id_t
Enumerates the available flash devices.
Definition: its_flash.h:52
struct its_flash_info_t its_flash_info_internal
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.
Definition: its_flash.c:56
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.
Definition: its_flash.h:101
uint16_t num_blocks
Definition: its_flash.h:164
const struct its_flash_info_t * its_flash_get_info(enum its_flash_id_t id)
Gets the flash info structure for the provided flash device.
Definition: its_flash.c:27
size_t flash_area_size
Definition: its_flash.h:64
struct flash_fs_info_t fs_info
Definition: its_flash.h:156
Structure containing the required information about a flash device to be used by the ITS Flash FS...
Definition: its_flash.h:73
int32_t psa_status_t
Function return status.
Definition: crypto_types.h:43
#define ITS_UTILS_MIN(x, y)
Evaluates to the minimum of the two parameters.
Definition: its_utils.h:41
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.
Definition: its_flash.h:121