blob: ca9e531f3a320891b83fb4c35951600d2cd87c9f [file] [log] [blame]
Mingyang Sunf6a78572021-04-02 16:51:05 +08001/*
Sherry Zhangf58f2bd2022-01-10 17:21:11 +08002 * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
Chris Brandb8bf9a92021-11-02 17:22:54 -07003 * Copyright (c) 2021, Cypress Semiconductor Corporation. All rights reserved.
Mingyang Sunf6a78572021-04-02 16:51:05 +08004 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 */
8
Sherry Zhangf58f2bd2022-01-10 17:21:11 +08009/***********{{utilities.donotedit_warning}}***********/
Mingyang Sunf6a78572021-04-02 16:51:05 +080010
11#include <stdint.h>
12#include <stddef.h>
13#include "region.h"
Chris Brandb8bf9a92021-11-02 17:22:54 -070014#include "region_defs.h"
Ken Liuea45b0d2021-05-22 17:41:25 +080015#include "spm_ipc.h"
Ken Liu3dd92562021-08-17 16:22:54 +080016#include "load/interrupt_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080017#include "load/partition_defs.h"
18#include "load/service_defs.h"
Ken Liu86686282021-04-27 11:11:15 +080019#include "load/asset_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080020#include "tfm_peripherals_def.h"
21#include "psa_manifest/pid.h"
22#include "psa_manifest/sid.h"
Ken Liu861b0782021-05-22 13:15:08 +080023#include "psa_manifest/{{manifest_out_basename}}.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080024
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080025{% set counter = namespace() %}
Kevin Pengcf7f8132021-10-25 15:36:26 +080026{% set counter.dep_counter = manifest.dependencies|count + manifest.weak_dependencies|count %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080027#define {{"%-55s"|format(manifest.name|upper + "_NDEPS")}} ({{"%d"|format(counter.dep_counter)}})
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080028{% set counter.service_counter = manifest.services|count %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080029#define {{"%-55s"|format(manifest.name|upper + "_NSERVS")}} ({{"%d"|format(counter.service_counter)}})
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080030{% set counter.asset_counter = manifest.mmio_regions|count %}
Ken Liu86686282021-04-27 11:11:15 +080031#if TFM_LVL == 3
32#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}} + 1)
33#else
34#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}})
35#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080036{% set counter.irq_counter = manifest.irqs|count %}
Kevin Peng27e42272021-05-24 17:58:53 +080037#define {{"%-55s"|format(manifest.name|upper + "_NIRQS")}} ({{"%d"|format(counter.irq_counter)}})
Mingyang Sunf6a78572021-04-02 16:51:05 +080038
39/* Memory region declaration */
40#if TFM_LVL == 3
41REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base);
42REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base);
43#endif
44extern uint8_t {{manifest.name|lower}}_stack[];
45
Shawn Shancaefb8f2021-04-15 14:19:13 +080046{% if manifest.entry_init and manifest.entry_point %}
47#error "Both manifest.entry_init and manifest.entry_point exist, unsupported!"
48{% elif (manifest.model == "IPC" or manifest.psa_framework_version == 1.0) and (not manifest.entry_point) %}
49#error "The entry_point attribute is required, it should not be empty!"
50{% elif manifest.model == "SFN" and manifest.entry_point %}
51#error "The entry_point attribute should not be exist in SFN mode!"
52{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080053/* Entrypoint function declaration */
Shawn Shancaefb8f2021-04-15 14:19:13 +080054{% if manifest.entry_point %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080055extern void {{manifest.entry_point}}(void);
Shawn Shancaefb8f2021-04-15 14:19:13 +080056{% elif manifest.entry_init %}
57extern psa_status_t {{manifest.entry_init}}(void);
58{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080059
Kevin Pengec239bb2021-09-03 15:40:27 +080060/* Interrupt init functions */
61{% if counter.irq_counter > 0 %}
62 {% for irq in manifest.irqs %}
63 {% if irq.source is number %}}
64extern enum tfm_hal_status_t {{"irq_" + irq.source|string + "_init"}}(void *p_pt,
65 struct irq_load_info_t *p_ildi);
66 {% else %}
67extern enum tfm_hal_status_t {{irq.source|lower + "_init"}}(void *p_pt,
68 struct irq_load_info_t *p_ildi);
69 {% endif %}
70 {% endfor %}
71{% endif %}
72
Mingyang Sun8d004f72021-06-01 10:46:26 +080073/* partition load info type definition */
Ken Liu4520ce32021-05-11 22:49:10 +080074struct partition_{{manifest.name|lower}}_load_info_t {
Mingyang Sun8d004f72021-06-01 10:46:26 +080075 /* common length load data */
76 struct partition_load_info_t load_info;
77 /* per-partition variable length load data */
Ken Liuacd2a572021-05-12 16:19:04 +080078 uintptr_t stack_addr;
79 uintptr_t heap_addr;
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080080{% if counter.dep_counter > 0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080081 uint32_t deps[{{(manifest.name|upper + "_NDEPS")}}];
82{% endif %}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080083{% if counter.service_counter > 0 %}
Ken Liuacd2a572021-05-12 16:19:04 +080084 struct service_load_info_t services[{{(manifest.name|upper + "_NSERVS")}}];
Mingyang Sunf6a78572021-04-02 16:51:05 +080085{% endif %}
Ken Liu86686282021-04-27 11:11:15 +080086#if TFM_LVL == 3
87 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
88#else
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080089{% if counter.asset_counter > 0 %}
Ken Liu86686282021-04-27 11:11:15 +080090 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
91{% endif %}
92#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080093{% if counter.irq_counter > 0 %}
Kevin Peng27e42272021-05-24 17:58:53 +080094 struct irq_load_info_t irqs[{{(manifest.name|upper + "_NIRQS")}}];
95{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080096} __attribute__((aligned(4)));
97
Mingyang Sun8d004f72021-06-01 10:46:26 +080098/* Partition load, deps, service load data. Put to a dedicated section. */
Michel Jaouenf9de50e2021-08-03 17:42:30 +020099#if defined(__ICCARM__)
100#pragma location = ".part_load"
101__root
102#endif /* __ICCARM__ */
Mingyang Sun8d004f72021-06-01 10:46:26 +0800103const struct partition_{{manifest.name|lower}}_load_info_t {{manifest.name|lower}}_load
104 __attribute__((used, section(".part_load"))) = {
105 .load_info = {
Mingyang Sunf6a78572021-04-02 16:51:05 +0800106{% if manifest.psa_framework_version == 1.0 %}
107 .psa_ff_ver = 0x0100 | PARTITION_INFO_MAGIC,
108{% elif manifest.psa_framework_version == 1.1 %}
109 .psa_ff_ver = 0x0101 | PARTITION_INFO_MAGIC,
110{% else %}
111#error "Unsupported ff version '{{manifest.psa_framework_version}}' for partition '{{manifest.name}}'!"
112{% endif %}
113 .pid = {{manifest.name}},
114 .flags = 0
Shawn Shancaefb8f2021-04-15 14:19:13 +0800115{% if (manifest.psa_framework_version == 1.1 and manifest.model == "IPC") or manifest.psa_framework_version == 1.0 %}
Ken Liu59728d02021-10-06 12:47:39 +0800116 | PARTITION_MODEL_IPC
Mingyang Sunf6a78572021-04-02 16:51:05 +0800117{% endif %}
118{% if manifest.type == "PSA-ROT" %}
Ken Liu897e8f12022-02-10 03:21:17 +0100119 | PARTITION_MODEL_PSA_ROT
Mingyang Sunf6a78572021-04-02 16:51:05 +0800120{% elif manifest.type != "APPLICATION-ROT" %}
121#error "Unsupported type '{{manifest.type}}' for partition '{{manifest.name}}'!"
122{% endif %}
123 | PARTITION_PRI_{{manifest.priority}},
Shawn Shancaefb8f2021-04-15 14:19:13 +0800124{% if manifest.entry_point %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800125 .entry = ENTRY_TO_POSITION({{manifest.entry_point}}),
Shawn Shancaefb8f2021-04-15 14:19:13 +0800126{% elif manifest.entry_init %}
127 .entry = ENTRY_TO_POSITION({{manifest.entry_init}}),
128{% else %}
Ken Liuf39d8eb2021-10-07 12:55:33 +0800129 .entry = 0,
Shawn Shancaefb8f2021-04-15 14:19:13 +0800130{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800131 .stack_size = {{manifest.stack_size}},
132 .heap_size = 0,
133 .ndeps = {{(manifest.name|upper + "_NDEPS")}},
134 .nservices = {{(manifest.name|upper + "_NSERVS")}},
Ken Liu86686282021-04-27 11:11:15 +0800135 .nassets = {{(manifest.name|upper + "_NASSETS")}},
Kevin Peng27e42272021-05-24 17:58:53 +0800136 .nirqs = {{(manifest.name|upper + "_NIRQS")}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800137 },
Ken Liuacd2a572021-05-12 16:19:04 +0800138 .stack_addr = (uintptr_t){{manifest.name|lower}}_stack,
139 .heap_addr = 0,
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800140{% if counter.dep_counter > 0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800141 .deps = {
142 {% for dep in manifest.dependencies %}
143 {{dep}}_SID,
144 {% endfor %}
Kevin Pengcf7f8132021-10-25 15:36:26 +0800145 {% for dep in manifest.weak_dependencies %}
146#ifdef {{dep}}_SID
147 {{dep}}_SID,
148#endif
149 {% endfor %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800150 },
151{% endif %}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800152{% if counter.service_counter > 0 %}
Kevin Peng43160d52022-02-11 13:35:56 +0800153 {% set service_signal = namespace(bit=0) %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800154 .services = {
155 {% for service in manifest.services %}
156 {
157 .name_strid = STRING_PTR_TO_STRID("{{service.name}}"),
Kevin Peng43160d52022-02-11 13:35:56 +0800158 {% if manifest.psa_framework_version == 1.1 and manifest.model == "SFN" %}
Shawn Shancaefb8f2021-04-15 14:19:13 +0800159 .sfn = ENTRY_TO_POSITION({{service.name|lower}}_sfn),
Kevin Peng43160d52022-02-11 13:35:56 +0800160 {% else %}
161 .sfn = 0,
162 {% endif %}
163#if CONFIG_TFM_SPM_BACKEND_IPC == 1
164 {% if manifest.psa_framework_version == 1.1 and manifest.model == "SFN" %}
165 .signal = (1U << {{"%d"|format(service_signal.bit)}}),
166 {% else %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800167 .signal = {{service.name}}_SIGNAL,
Kevin Peng43160d52022-02-11 13:35:56 +0800168 {% endif %}
169#endif /* CONFIG_TFM_SPM_BACKEND_IPC == 1 */
Mingyang Sunf6a78572021-04-02 16:51:05 +0800170 .sid = {{service.sid}},
171 .flags = 0
172 {% if service.non_secure_clients is sameas true %}
173 | SERVICE_FLAG_NS_ACCESSIBLE
174 {% endif %}
175 {% if manifest.psa_framework_version > 1.0 and service.connection_based is sameas false %}
Mingyang Suna03ad022021-06-01 20:41:15 +0800176 | SERVICE_FLAG_STATELESS | 0x{{"%x"|format(service.stateless_handle_index)}}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800177 {% endif %}
Shawn Shan7d88ae92021-09-09 15:32:02 +0800178 {% if manifest.psa_framework_version > 1.0 and service.mm_iovec == "enable" %}
179 | SERVICE_FLAG_MM_IOVEC
180 {% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800181 {% if service.version_policy %}
Ken Liub3b2cb62021-05-22 00:39:28 +0800182 | SERVICE_VERSION_POLICY_{{service.version_policy}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800183 {% else %}
Ken Liub3b2cb62021-05-22 00:39:28 +0800184 | SERVICE_VERSION_POLICY_STRICT,
Mingyang Sunf6a78572021-04-02 16:51:05 +0800185 {% endif %}
186 {% if service.version %}
187 .version = {{service.version}},
188 {% else %}
189 .version = 1,
190 {% endif %}
191 },
Kevin Peng43160d52022-02-11 13:35:56 +0800192 {% set service_signal.bit = service_signal.bit + 1 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800193 {% endfor %}
194 },
Kevin Peng43160d52022-02-11 13:35:56 +0800195 {% if service_signal.bit > 32 %}
196#error "Too many services!"
197 {% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800198{% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800199#if TFM_LVL == 3
200 .assets = {
201 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800202 .mem.start = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base),
203 .mem.limit = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base),
204 .attr = ASSET_ATTR_READ_WRITE,
Ken Liu86686282021-04-27 11:11:15 +0800205 },
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800206{% if counter.asset_counter > 0 %}
207 {% for region in manifest.mmio_regions %}
208 {% if region.conditional %}
Ken Liu86686282021-04-27 11:11:15 +0800209#ifdef {{region.conditional}}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800210 {% endif %}
Mingyang Sundf02b852021-07-27 14:29:25 +0800211 {% if region.base and region.size %}
Ken Liu86686282021-04-27 11:11:15 +0800212 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800213 .mem.start = {{region.base}},
214 .mem.limit = {{region.base}} + {{region.size}},
215 .attr = ASSET_ATTR_NUMBERED_MMIO
216 {% elif region.name %}
217 {
218 .dev.dev_ref = PTR_TO_REFERENCE({{region.name}}),
219 .attr = ASSET_ATTR_NAMED_MMIO
220 {% endif %}
221 {% if region.permission == "READ-WRITE" %}
222 | ASSET_ATTR_READ_WRITE,
223 {% else %}
224 | ASSET_ATTR_READ_ONLY,
225 {% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800226 },
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800227 {% if region.conditional %}
Ken Liu86686282021-04-27 11:11:15 +0800228#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800229 {% endif %}
230 {% endfor %}
231{% endif %}
Kevin Peng27e42272021-05-24 17:58:53 +0800232 },
Ken Liu86686282021-04-27 11:11:15 +0800233#else
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800234{% if counter.asset_counter > 0 %}
Ken Liu86686282021-04-27 11:11:15 +0800235 .assets = {
236 {% for region in manifest.mmio_regions %}
237 {% if region.conditional %}
238#ifdef {{region.conditional}}
239 {% endif %}
Mingyang Sundf02b852021-07-27 14:29:25 +0800240 {% if region.base and region.size %}
Ken Liu86686282021-04-27 11:11:15 +0800241 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800242 .mem.start = {{region.base}},
243 .mem.limit = {{region.base}} + {{region.size}},
244 .attr = ASSET_ATTR_NUMBERED_MMIO
245 {% elif region.name %}
246 {
247 .dev.dev_ref = PTR_TO_REFERENCE({{region.name}}),
248 .attr = ASSET_ATTR_NAMED_MMIO
249 {% endif %}
250 {% if region.permission == "READ-WRITE" %}
251 | ASSET_ATTR_READ_WRITE,
252 {% else %}
253 | ASSET_ATTR_READ_ONLY,
254 {% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800255 },
256 {% if region.conditional %}
257#endif
258 {% endif %}
259 {% endfor %}
Kevin Peng27e42272021-05-24 17:58:53 +0800260 },
Ken Liu86686282021-04-27 11:11:15 +0800261{% endif %}
262#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800263{% if counter.irq_counter > 0 %}
Kevin Peng27e42272021-05-24 17:58:53 +0800264 .irqs = {
265 {% for irq in manifest.irqs %}
266 {% set irq_info = namespace() %}
267 {% set irq_info.source = irq.source %}
Kevin Pengec239bb2021-09-03 15:40:27 +0800268 {% if irq.source is number %}}
269 {% set irq_info.source_symbol = "irq_" + irq.source|string %}
270 {% else %}
271 {% set irq_info.source_symbol = irq.source|lower %}
272 {% endif %}
Kevin Peng27e42272021-05-24 17:58:53 +0800273 {% if manifest.psa_framework_version == 1.1 and irq.handling == "FLIH" %}
Kevin Pengec239bb2021-09-03 15:40:27 +0800274 {% set irq_info.flih_func = irq.name|lower + "_flih" %}
Kevin Peng27e42272021-05-24 17:58:53 +0800275 {% else %}
276 {% set irq_info.flih_func = 0 %}
277 {% endif %}
278 {% if manifest.psa_framework_version == 1.0 %}
279 {% set irq_info.signal = irq.signal %}
280 {% else %}
281 {% set irq_info.signal = irq.name + "_SIGNAL" %}
282 {% endif %}
283 {
Kevin Pengec239bb2021-09-03 15:40:27 +0800284 .init = {{irq_info.source_symbol + "_init"}},
Kevin Peng27e42272021-05-24 17:58:53 +0800285 .flih_func = {{irq_info.flih_func}},
Kevin Pengec239bb2021-09-03 15:40:27 +0800286 .pid = {{manifest.name}},
287 .source = {{irq_info.source}},
288 .signal = {{irq_info.signal}},
Kevin Peng27e42272021-05-24 17:58:53 +0800289 },
290 {% endfor %}
291 },
292{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800293};
Ken Liuea45b0d2021-05-22 17:41:25 +0800294
295/* Placeholder for partition and service runtime space. Do not reference it. */
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200296#if defined(__ICCARM__)
297#pragma location=".bss.part_runtime"
298__root
299#endif /* __ICCARM__ */
Ken Liuea45b0d2021-05-22 17:41:25 +0800300static struct partition_t {{manifest.name|lower}}_partition_runtime_item
301 __attribute__((used, section(".bss.part_runtime")));
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800302{% if counter.service_counter > 0 %}
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200303#if defined(__ICCARM__)
304#pragma location = ".bss.serv_runtime"
305__root
306#endif /* __ICCARM__ */
Ken Liuea45b0d2021-05-22 17:41:25 +0800307static struct service_t {{manifest.name|lower}}_service_runtime_item[{{(manifest.name|upper + "_NSERVS")}}]
308 __attribute__((used, section(".bss.serv_runtime")));
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800309{% endif %}