mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * SPDX-License-Identifier: BSD-3-Clause
kenjiArai 0:5b88d5760320 5 *
kenjiArai 0:5b88d5760320 6 */
kenjiArai 0:5b88d5760320 7
kenjiArai 0:5b88d5760320 8 #ifndef __SPM_DB_SETUP_H__
kenjiArai 0:5b88d5760320 9 #define __SPM_DB_SETUP_H__
kenjiArai 0:5b88d5760320 10
kenjiArai 0:5b88d5760320 11 #include <stdint.h>
kenjiArai 0:5b88d5760320 12 #include "spm_db.h"
kenjiArai 0:5b88d5760320 13
kenjiArai 0:5b88d5760320 14 /**
kenjiArai 0:5b88d5760320 15 * \brief Get the index of a partition.
kenjiArai 0:5b88d5760320 16 *
kenjiArai 0:5b88d5760320 17 * Gets the index of a partition in the partition db based on the partition ID
kenjiArai 0:5b88d5760320 18 * provided as a parameter.
kenjiArai 0:5b88d5760320 19 *
kenjiArai 0:5b88d5760320 20 * \param[in] partition_idx The index of the partition
kenjiArai 0:5b88d5760320 21 *
kenjiArai 0:5b88d5760320 22 * \return \ref INVALID_PARTITION_IDX if the provided index is invalid. The
kenjiArai 0:5b88d5760320 23 * index of the partition otherwise.
kenjiArai 0:5b88d5760320 24 */
kenjiArai 0:5b88d5760320 25 uint32_t get_partition_idx(uint32_t partition_id);
kenjiArai 0:5b88d5760320 26
kenjiArai 0:5b88d5760320 27 struct spm_partition_db_t {
kenjiArai 0:5b88d5760320 28 uint32_t is_init;
kenjiArai 0:5b88d5760320 29 uint32_t partition_count;
kenjiArai 0:5b88d5760320 30 uint32_t running_partition_idx;
kenjiArai 0:5b88d5760320 31 struct spm_partition_desc_t partitions[SPM_MAX_PARTITIONS];
kenjiArai 0:5b88d5760320 32 };
kenjiArai 0:5b88d5760320 33
kenjiArai 0:5b88d5760320 34 #define PARTITION_INIT_STATIC_DATA(data, partition, flags, id, priority) \
kenjiArai 0:5b88d5760320 35 do { \
kenjiArai 0:5b88d5760320 36 data.partition_id = partition##_ID; \
kenjiArai 0:5b88d5760320 37 data.partition_flags = flags; \
kenjiArai 0:5b88d5760320 38 data.partition_priority = TFM_PRIORITY(priority); \
kenjiArai 0:5b88d5760320 39 } while (0)
kenjiArai 0:5b88d5760320 40
kenjiArai 0:5b88d5760320 41 /* Changed from #if (TFM_LVL == 1) && !defined(TFM_PSA_API) to #if (TFM_LVL == 1) to avoid linker error.
kenjiArai 0:5b88d5760320 42 TF-M build autogenerates region details (code, ro, rw, zi and stack ) using linker scripts. We do not
kenjiArai 0:5b88d5760320 43 hve that in mbed-os build yet.
kenjiArai 0:5b88d5760320 44 */
kenjiArai 0:5b88d5760320 45 #if (TFM_LVL == 1)
kenjiArai 0:5b88d5760320 46 #define PARTITION_INIT_MEMORY_DATA(data, partition)
kenjiArai 0:5b88d5760320 47 #else
kenjiArai 0:5b88d5760320 48 #define PARTITION_INIT_MEMORY_DATA(data, partition) \
kenjiArai 0:5b88d5760320 49 do { \
kenjiArai 0:5b88d5760320 50 data.code_start = PART_REGION_ADDR(partition, $$Base); \
kenjiArai 0:5b88d5760320 51 data.code_limit = PART_REGION_ADDR(partition, $$Limit); \
kenjiArai 0:5b88d5760320 52 data.ro_start = PART_REGION_ADDR(partition, $$RO$$Base); \
kenjiArai 0:5b88d5760320 53 data.ro_limit = PART_REGION_ADDR(partition, $$RO$$Limit); \
kenjiArai 0:5b88d5760320 54 data.rw_start = PART_REGION_ADDR(partition, _DATA$$RW$$Base); \
kenjiArai 0:5b88d5760320 55 data.rw_limit = PART_REGION_ADDR(partition, _DATA$$RW$$Limit); \
kenjiArai 0:5b88d5760320 56 data.zi_start = PART_REGION_ADDR(partition, _DATA$$ZI$$Base); \
kenjiArai 0:5b88d5760320 57 data.zi_limit = PART_REGION_ADDR(partition, _DATA$$ZI$$Limit); \
kenjiArai 0:5b88d5760320 58 data.stack_bottom = PART_REGION_ADDR(partition, _STACK$$ZI$$Base); \
kenjiArai 0:5b88d5760320 59 data.stack_top = PART_REGION_ADDR(partition, _STACK$$ZI$$Limit); \
kenjiArai 0:5b88d5760320 60 } while (0)
kenjiArai 0:5b88d5760320 61 #endif
kenjiArai 0:5b88d5760320 62
kenjiArai 0:5b88d5760320 63 #if TFM_LVL == 1
kenjiArai 0:5b88d5760320 64 #define PARTITION_INIT_RUNTIME_DATA(data, partition) \
kenjiArai 0:5b88d5760320 65 do { \
kenjiArai 0:5b88d5760320 66 data.partition_state = SPM_PARTITION_STATE_UNINIT; \
kenjiArai 0:5b88d5760320 67 } while (0)
kenjiArai 0:5b88d5760320 68 #else
kenjiArai 0:5b88d5760320 69 #define PARTITION_INIT_RUNTIME_DATA(data, partition) \
kenjiArai 0:5b88d5760320 70 do { \
kenjiArai 0:5b88d5760320 71 data.partition_state = SPM_PARTITION_STATE_UNINIT; \
kenjiArai 0:5b88d5760320 72 /* The top of the stack is reserved for the iovec */ \
kenjiArai 0:5b88d5760320 73 /* parameters of the service called. That's why in */ \
kenjiArai 0:5b88d5760320 74 /* data.stack_ptr we extract sizeof(struct iovec_args_t) */ \
kenjiArai 0:5b88d5760320 75 /* from the limit. */ \
kenjiArai 0:5b88d5760320 76 data.stack_ptr = \
kenjiArai 0:5b88d5760320 77 PART_REGION_ADDR(partition, _STACK$$ZI$$Limit - \
kenjiArai 0:5b88d5760320 78 sizeof(struct iovec_args_t)); \
kenjiArai 0:5b88d5760320 79 } while (0)
kenjiArai 0:5b88d5760320 80 #endif
kenjiArai 0:5b88d5760320 81
kenjiArai 0:5b88d5760320 82 #define PARTITION_DECLARE(partition, flag, type, id, priority, part_stack_size) \
kenjiArai 0:5b88d5760320 83 do { \
kenjiArai 0:5b88d5760320 84 REGION_DECLARE(Image$$, partition, $$Base); \
kenjiArai 0:5b88d5760320 85 REGION_DECLARE(Image$$, partition, $$Limit); \
kenjiArai 0:5b88d5760320 86 REGION_DECLARE(Image$$, partition, $$RO$$Base); \
kenjiArai 0:5b88d5760320 87 REGION_DECLARE(Image$$, partition, $$RO$$Limit); \
kenjiArai 0:5b88d5760320 88 REGION_DECLARE(Image$$, partition, _DATA$$RW$$Base); \
kenjiArai 0:5b88d5760320 89 REGION_DECLARE(Image$$, partition, _DATA$$RW$$Limit); \
kenjiArai 0:5b88d5760320 90 REGION_DECLARE(Image$$, partition, _DATA$$ZI$$Base); \
kenjiArai 0:5b88d5760320 91 REGION_DECLARE(Image$$, partition, _DATA$$ZI$$Limit); \
kenjiArai 0:5b88d5760320 92 REGION_DECLARE(Image$$, partition, _STACK$$ZI$$Base); \
kenjiArai 0:5b88d5760320 93 REGION_DECLARE(Image$$, partition, _STACK$$ZI$$Limit); \
kenjiArai 0:5b88d5760320 94 int32_t flags = flag; \
kenjiArai 0:5b88d5760320 95 if (tfm_memcmp(type, TFM_PARTITION_TYPE_APP, \
kenjiArai 0:5b88d5760320 96 strlen(TFM_PARTITION_TYPE_APP)) == 0) { \
kenjiArai 0:5b88d5760320 97 flags |= SPM_PART_FLAG_APP_ROT; \
kenjiArai 0:5b88d5760320 98 } else if (tfm_memcmp(type, TFM_PARTITION_TYPE_PSA, \
kenjiArai 0:5b88d5760320 99 strlen(TFM_PARTITION_TYPE_PSA)) == 0) { \
kenjiArai 0:5b88d5760320 100 flags |= SPM_PART_FLAG_PSA_ROT | SPM_PART_FLAG_APP_ROT; \
kenjiArai 0:5b88d5760320 101 } else { \
kenjiArai 0:5b88d5760320 102 return SPM_ERR_INVALID_CONFIG; \
kenjiArai 0:5b88d5760320 103 } \
kenjiArai 0:5b88d5760320 104 struct spm_partition_desc_t *part_ptr; \
kenjiArai 0:5b88d5760320 105 if (g_spm_partition_db.partition_count >= SPM_MAX_PARTITIONS) { \
kenjiArai 0:5b88d5760320 106 return SPM_ERR_INVALID_CONFIG; \
kenjiArai 0:5b88d5760320 107 } \
kenjiArai 0:5b88d5760320 108 __attribute__((section(".data.partitions_stacks"))) \
kenjiArai 0:5b88d5760320 109 static uint8_t partition##_stack[part_stack_size] __attribute__((aligned(8))); \
kenjiArai 0:5b88d5760320 110 part_ptr = &(g_spm_partition_db.partitions[ \
kenjiArai 0:5b88d5760320 111 g_spm_partition_db.partition_count]); \
kenjiArai 0:5b88d5760320 112 part_ptr->memory_data.stack_bottom = (uint32_t)partition##_stack; \
kenjiArai 0:5b88d5760320 113 part_ptr->memory_data.stack_top = part_ptr->memory_data.stack_bottom + part_stack_size; \
kenjiArai 0:5b88d5760320 114 PARTITION_INIT_STATIC_DATA(part_ptr->static_data, partition, flags, \
kenjiArai 0:5b88d5760320 115 id, priority); \
kenjiArai 0:5b88d5760320 116 PARTITION_INIT_RUNTIME_DATA(part_ptr->runtime_data, partition); \
kenjiArai 0:5b88d5760320 117 PARTITION_INIT_MEMORY_DATA(part_ptr->memory_data, partition); \
kenjiArai 0:5b88d5760320 118 ++g_spm_partition_db.partition_count; \
kenjiArai 0:5b88d5760320 119 } while (0)
kenjiArai 0:5b88d5760320 120
kenjiArai 0:5b88d5760320 121 #define PARTITION_ADD_INIT_FUNC(partition, init_func) \
kenjiArai 0:5b88d5760320 122 do { \
kenjiArai 0:5b88d5760320 123 extern int32_t init_func(void); \
kenjiArai 0:5b88d5760320 124 uint32_t partition_idx = get_partition_idx(partition##_ID); \
kenjiArai 0:5b88d5760320 125 struct spm_partition_desc_t *part_ptr = \
kenjiArai 0:5b88d5760320 126 &(g_spm_partition_db.partitions[partition_idx]); \
kenjiArai 0:5b88d5760320 127 part_ptr->static_data.partition_init = init_func; \
kenjiArai 0:5b88d5760320 128 } while (0)
kenjiArai 0:5b88d5760320 129
kenjiArai 0:5b88d5760320 130 #define PARTITION_ADD_PERIPHERAL(partition, peripheral) \
kenjiArai 0:5b88d5760320 131 do { \
kenjiArai 0:5b88d5760320 132 uint32_t partition_idx = get_partition_idx(partition##_ID); \
kenjiArai 0:5b88d5760320 133 struct spm_partition_desc_t *part_ptr = \
kenjiArai 0:5b88d5760320 134 &(g_spm_partition_db.partitions[partition_idx]); \
kenjiArai 0:5b88d5760320 135 part_ptr->platform_data = peripheral; \
kenjiArai 0:5b88d5760320 136 } while (0)
kenjiArai 0:5b88d5760320 137
kenjiArai 0:5b88d5760320 138 #endif /* __SPM_DB_SETUP_H__ */