blob: 14b65f8f53a2706ce3454fc2b4c7298d2c98ab5c [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 Brandc422cdd2022-07-21 13:32:47 -07003 * Copyright (c) 2021-2022 Cypress Semiconductor Corporation (an Infineon
4 * company) or an affiliate of Cypress Semiconductor Corporation. All rights
5 * reserved.
Mingyang Sunf6a78572021-04-02 16:51:05 +08006 *
7 * SPDX-License-Identifier: BSD-3-Clause
8 *
9 */
10
Sherry Zhangf58f2bd2022-01-10 17:21:11 +080011/***********{{utilities.donotedit_warning}}***********/
Mingyang Sunf6a78572021-04-02 16:51:05 +080012
13#include <stdint.h>
14#include <stddef.h>
15#include "region.h"
Chris Brandb8bf9a92021-11-02 17:22:54 -070016#include "region_defs.h"
Ken Liuea45b0d2021-05-22 17:41:25 +080017#include "spm_ipc.h"
Ken Liu3dd92562021-08-17 16:22:54 +080018#include "load/interrupt_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080019#include "load/partition_defs.h"
20#include "load/service_defs.h"
Ken Liu86686282021-04-27 11:11:15 +080021#include "load/asset_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080022#include "tfm_peripherals_def.h"
23#include "psa_manifest/pid.h"
24#include "psa_manifest/sid.h"
Ken Liu861b0782021-05-22 13:15:08 +080025#include "psa_manifest/{{manifest_out_basename}}.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080026
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080027{% set counter = namespace() %}
Kevin Pengcf7f8132021-10-25 15:36:26 +080028{% set counter.dep_counter = manifest.dependencies|count + manifest.weak_dependencies|count %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080029#define {{"%-55s"|format(manifest.name|upper + "_NDEPS")}} ({{"%d"|format(counter.dep_counter)}})
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080030{% set counter.service_counter = manifest.services|count %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080031#define {{"%-55s"|format(manifest.name|upper + "_NSERVS")}} ({{"%d"|format(counter.service_counter)}})
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080032{% set counter.asset_counter = manifest.mmio_regions|count %}
Ken Liu86686282021-04-27 11:11:15 +080033#if TFM_LVL == 3
34#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}} + 1)
35#else
36#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}})
37#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080038{% set counter.irq_counter = manifest.irqs|count %}
Kevin Peng27e42272021-05-24 17:58:53 +080039#define {{"%-55s"|format(manifest.name|upper + "_NIRQS")}} ({{"%d"|format(counter.irq_counter)}})
Mingyang Sunf6a78572021-04-02 16:51:05 +080040
41/* Memory region declaration */
42#if TFM_LVL == 3
43REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base);
44REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base);
45#endif
Sherry Zhangf865c4e2022-03-23 13:53:38 +080046
47{% if config_impl['CONFIG_TFM_SPM_BACKEND_IPC'] == '1' or manifest.model == "IPC" %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080048extern uint8_t {{manifest.name|lower}}_stack[];
Sherry Zhangf865c4e2022-03-23 13:53:38 +080049{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080050
Kevin Pengec0e5ce2022-02-17 13:48:51 +080051{% if manifest.model == "IPC" %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080052/* Entrypoint function declaration */
53extern void {{manifest.entry_point}}(void);
Shawn Shancaefb8f2021-04-15 14:19:13 +080054{% elif manifest.entry_init %}
55extern psa_status_t {{manifest.entry_init}}(void);
56{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080057
Kevin Pengec239bb2021-09-03 15:40:27 +080058/* Interrupt init functions */
59{% if counter.irq_counter > 0 %}
60 {% for irq in manifest.irqs %}
61 {% if irq.source is number %}}
62extern enum tfm_hal_status_t {{"irq_" + irq.source|string + "_init"}}(void *p_pt,
63 struct irq_load_info_t *p_ildi);
64 {% else %}
65extern enum tfm_hal_status_t {{irq.source|lower + "_init"}}(void *p_pt,
66 struct irq_load_info_t *p_ildi);
67 {% endif %}
68 {% endfor %}
69{% endif %}
70
Mingyang Sun8d004f72021-06-01 10:46:26 +080071/* partition load info type definition */
Ken Liu4520ce32021-05-11 22:49:10 +080072struct partition_{{manifest.name|lower}}_load_info_t {
Mingyang Sun8d004f72021-06-01 10:46:26 +080073 /* common length load data */
74 struct partition_load_info_t load_info;
75 /* per-partition variable length load data */
Ken Liuacd2a572021-05-12 16:19:04 +080076 uintptr_t stack_addr;
77 uintptr_t heap_addr;
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080078{% if counter.dep_counter > 0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080079 uint32_t deps[{{(manifest.name|upper + "_NDEPS")}}];
80{% endif %}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080081{% if counter.service_counter > 0 %}
Ken Liuacd2a572021-05-12 16:19:04 +080082 struct service_load_info_t services[{{(manifest.name|upper + "_NSERVS")}}];
Mingyang Sunf6a78572021-04-02 16:51:05 +080083{% endif %}
Ken Liu86686282021-04-27 11:11:15 +080084#if TFM_LVL == 3
85 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
86#else
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080087{% if counter.asset_counter > 0 %}
Ken Liu86686282021-04-27 11:11:15 +080088 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
89{% endif %}
90#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +080091{% if counter.irq_counter > 0 %}
Kevin Peng27e42272021-05-24 17:58:53 +080092 struct irq_load_info_t irqs[{{(manifest.name|upper + "_NIRQS")}}];
93{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080094} __attribute__((aligned(4)));
95
Mingyang Sun8d004f72021-06-01 10:46:26 +080096/* Partition load, deps, service load data. Put to a dedicated section. */
Michel Jaouenf9de50e2021-08-03 17:42:30 +020097#if defined(__ICCARM__)
Jianliang Shen095d45c2022-04-21 21:43:23 +080098#pragma location = ".part_load_priority_{{manifest.priority|lower}}"
Michel Jaouenf9de50e2021-08-03 17:42:30 +020099__root
100#endif /* __ICCARM__ */
Mingyang Sun8d004f72021-06-01 10:46:26 +0800101const struct partition_{{manifest.name|lower}}_load_info_t {{manifest.name|lower}}_load
Jianliang Shen095d45c2022-04-21 21:43:23 +0800102 __attribute__((used, section(".part_load_priority_{{manifest.priority|lower}}"))) = {
Mingyang Sun8d004f72021-06-01 10:46:26 +0800103 .load_info = {
Mingyang Sunf6a78572021-04-02 16:51:05 +0800104{% if manifest.psa_framework_version == 1.0 %}
105 .psa_ff_ver = 0x0100 | PARTITION_INFO_MAGIC,
106{% elif manifest.psa_framework_version == 1.1 %}
107 .psa_ff_ver = 0x0101 | PARTITION_INFO_MAGIC,
Mingyang Sunf6a78572021-04-02 16:51:05 +0800108{% endif %}
109 .pid = {{manifest.name}},
110 .flags = 0
Kevin Peng5c3fee72022-02-16 22:25:22 +0800111{% if manifest.model == "IPC" %}
Ken Liu59728d02021-10-06 12:47:39 +0800112 | PARTITION_MODEL_IPC
Mingyang Sunf6a78572021-04-02 16:51:05 +0800113{% endif %}
114{% if manifest.type == "PSA-ROT" %}
Ken Liu897e8f12022-02-10 03:21:17 +0100115 | PARTITION_MODEL_PSA_ROT
Mingyang Sunf6a78572021-04-02 16:51:05 +0800116{% endif %}
Chris Brandc422cdd2022-07-21 13:32:47 -0700117{% if manifest.ns_agent is sameas true %}
118 | PARTITION_NS_AGENT
119{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800120 | PARTITION_PRI_{{manifest.priority}},
Kevin Peng5c3fee72022-02-16 22:25:22 +0800121 .entry = ENTRY_TO_POSITION({{manifest.entry}}),
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800122{% if config_impl['CONFIG_TFM_SPM_BACKEND_IPC'] == '1' or manifest.model == "IPC" %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800123 .stack_size = {{manifest.stack_size}},
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800124{% else %}
125 .stack_size = 0,
126{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800127 .heap_size = 0,
128 .ndeps = {{(manifest.name|upper + "_NDEPS")}},
129 .nservices = {{(manifest.name|upper + "_NSERVS")}},
Ken Liu86686282021-04-27 11:11:15 +0800130 .nassets = {{(manifest.name|upper + "_NASSETS")}},
Kevin Peng27e42272021-05-24 17:58:53 +0800131 .nirqs = {{(manifest.name|upper + "_NIRQS")}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800132 },
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800133{% if config_impl['CONFIG_TFM_SPM_BACKEND_IPC'] == '1' or manifest.model == "IPC" %}
Ken Liuacd2a572021-05-12 16:19:04 +0800134 .stack_addr = (uintptr_t){{manifest.name|lower}}_stack,
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800135{% else %}
136 .stack_addr = 0,
137{% endif %}
Ken Liuacd2a572021-05-12 16:19:04 +0800138 .heap_addr = 0,
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800139{% if counter.dep_counter > 0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800140 .deps = {
141 {% for dep in manifest.dependencies %}
142 {{dep}}_SID,
143 {% endfor %}
Kevin Pengcf7f8132021-10-25 15:36:26 +0800144 {% for dep in manifest.weak_dependencies %}
145#ifdef {{dep}}_SID
146 {{dep}}_SID,
147#endif
148 {% endfor %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800149 },
150{% endif %}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800151{% if counter.service_counter > 0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800152 .services = {
153 {% for service in manifest.services %}
154 {
155 .name_strid = STRING_PTR_TO_STRID("{{service.name}}"),
Kevin Peng5c3fee72022-02-16 22:25:22 +0800156 {% if manifest.model == "SFN" %}
Shawn Shancaefb8f2021-04-15 14:19:13 +0800157 .sfn = ENTRY_TO_POSITION({{service.name|lower}}_sfn),
Kevin Peng43160d52022-02-11 13:35:56 +0800158 {% else %}
159 .sfn = 0,
160 {% endif %}
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800161{% if config_impl['CONFIG_TFM_SPM_BACKEND_IPC'] == '1' %}
Kevin Peng5c3fee72022-02-16 22:25:22 +0800162 {% if manifest.model == "SFN" %}
163 .signal = {{service.signal_value}},
Kevin Peng43160d52022-02-11 13:35:56 +0800164 {% else %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800165 .signal = {{service.name}}_SIGNAL,
Kevin Peng43160d52022-02-11 13:35:56 +0800166 {% endif %}
Sherry Zhangf865c4e2022-03-23 13:53:38 +0800167{% endif %}
168
Mingyang Sunf6a78572021-04-02 16:51:05 +0800169 .sid = {{service.sid}},
170 .flags = 0
171 {% if service.non_secure_clients is sameas true %}
172 | SERVICE_FLAG_NS_ACCESSIBLE
173 {% endif %}
Kevin Peng5c3fee72022-02-16 22:25:22 +0800174 {% if service.connection_based is sameas false %}
Mingyang Suna03ad022021-06-01 20:41:15 +0800175 | SERVICE_FLAG_STATELESS | 0x{{"%x"|format(service.stateless_handle_index)}}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800176 {% endif %}
Kevin Peng5c3fee72022-02-16 22:25:22 +0800177 {% if service.mm_iovec == "enable" %}
Shawn Shan7d88ae92021-09-09 15:32:02 +0800178 | SERVICE_FLAG_MM_IOVEC
179 {% endif %}
Ken Liub3b2cb62021-05-22 00:39:28 +0800180 | SERVICE_VERSION_POLICY_{{service.version_policy}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800181 .version = {{service.version}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800182 },
183 {% endfor %}
184 },
185{% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800186#if TFM_LVL == 3
187 .assets = {
188 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800189 .mem.start = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base),
190 .mem.limit = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base),
191 .attr = ASSET_ATTR_READ_WRITE,
Ken Liu86686282021-04-27 11:11:15 +0800192 },
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800193{% if counter.asset_counter > 0 %}
194 {% for region in manifest.mmio_regions %}
195 {% if region.conditional %}
Ken Liu86686282021-04-27 11:11:15 +0800196#ifdef {{region.conditional}}
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800197 {% endif %}
Mingyang Sundf02b852021-07-27 14:29:25 +0800198 {% if region.base and region.size %}
Ken Liu86686282021-04-27 11:11:15 +0800199 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800200 .mem.start = {{region.base}},
201 .mem.limit = {{region.base}} + {{region.size}},
202 .attr = ASSET_ATTR_NUMBERED_MMIO
203 {% elif region.name %}
204 {
205 .dev.dev_ref = PTR_TO_REFERENCE({{region.name}}),
206 .attr = ASSET_ATTR_NAMED_MMIO
207 {% endif %}
208 {% if region.permission == "READ-WRITE" %}
209 | ASSET_ATTR_READ_WRITE,
210 {% else %}
211 | ASSET_ATTR_READ_ONLY,
212 {% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800213 },
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800214 {% if region.conditional %}
Ken Liu86686282021-04-27 11:11:15 +0800215#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800216 {% endif %}
217 {% endfor %}
218{% endif %}
Kevin Peng27e42272021-05-24 17:58:53 +0800219 },
Ken Liu86686282021-04-27 11:11:15 +0800220#else
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800221{% if counter.asset_counter > 0 %}
Ken Liu86686282021-04-27 11:11:15 +0800222 .assets = {
223 {% for region in manifest.mmio_regions %}
224 {% if region.conditional %}
225#ifdef {{region.conditional}}
226 {% endif %}
Mingyang Sundf02b852021-07-27 14:29:25 +0800227 {% if region.base and region.size %}
Ken Liu86686282021-04-27 11:11:15 +0800228 {
Mingyang Sundf02b852021-07-27 14:29:25 +0800229 .mem.start = {{region.base}},
230 .mem.limit = {{region.base}} + {{region.size}},
231 .attr = ASSET_ATTR_NUMBERED_MMIO
232 {% elif region.name %}
233 {
234 .dev.dev_ref = PTR_TO_REFERENCE({{region.name}}),
235 .attr = ASSET_ATTR_NAMED_MMIO
236 {% endif %}
237 {% if region.permission == "READ-WRITE" %}
238 | ASSET_ATTR_READ_WRITE,
239 {% else %}
240 | ASSET_ATTR_READ_ONLY,
241 {% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800242 },
243 {% if region.conditional %}
244#endif
245 {% endif %}
246 {% endfor %}
Kevin Peng27e42272021-05-24 17:58:53 +0800247 },
Ken Liu86686282021-04-27 11:11:15 +0800248{% endif %}
249#endif
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800250{% if counter.irq_counter > 0 %}
Kevin Peng27e42272021-05-24 17:58:53 +0800251 .irqs = {
252 {% for irq in manifest.irqs %}
253 {% set irq_info = namespace() %}
254 {% set irq_info.source = irq.source %}
Kevin Pengec239bb2021-09-03 15:40:27 +0800255 {% if irq.source is number %}}
256 {% set irq_info.source_symbol = "irq_" + irq.source|string %}
257 {% else %}
258 {% set irq_info.source_symbol = irq.source|lower %}
259 {% endif %}
Kevin Peng27e42272021-05-24 17:58:53 +0800260 {% if manifest.psa_framework_version == 1.1 and irq.handling == "FLIH" %}
Kevin Pengec239bb2021-09-03 15:40:27 +0800261 {% set irq_info.flih_func = irq.name|lower + "_flih" %}
Kevin Peng27e42272021-05-24 17:58:53 +0800262 {% else %}
263 {% set irq_info.flih_func = 0 %}
264 {% endif %}
265 {% if manifest.psa_framework_version == 1.0 %}
266 {% set irq_info.signal = irq.signal %}
267 {% else %}
268 {% set irq_info.signal = irq.name + "_SIGNAL" %}
269 {% endif %}
270 {
Kevin Pengec239bb2021-09-03 15:40:27 +0800271 .init = {{irq_info.source_symbol + "_init"}},
Kevin Peng27e42272021-05-24 17:58:53 +0800272 .flih_func = {{irq_info.flih_func}},
Kevin Pengec239bb2021-09-03 15:40:27 +0800273 .pid = {{manifest.name}},
274 .source = {{irq_info.source}},
275 .signal = {{irq_info.signal}},
Kevin Peng27e42272021-05-24 17:58:53 +0800276 },
277 {% endfor %}
278 },
279{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800280};
Ken Liuea45b0d2021-05-22 17:41:25 +0800281
282/* Placeholder for partition and service runtime space. Do not reference it. */
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200283#if defined(__ICCARM__)
Jianliang Shen095d45c2022-04-21 21:43:23 +0800284#pragma location=".bss.part_runtime_priority_{{manifest.priority|lower}}"
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200285__root
286#endif /* __ICCARM__ */
Ken Liuea45b0d2021-05-22 17:41:25 +0800287static struct partition_t {{manifest.name|lower}}_partition_runtime_item
Jianliang Shen095d45c2022-04-21 21:43:23 +0800288 __attribute__((used, section(".bss.part_runtime_priority_{{manifest.priority|lower}}")));
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800289{% if counter.service_counter > 0 %}
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200290#if defined(__ICCARM__)
Jianliang Shen095d45c2022-04-21 21:43:23 +0800291#pragma location = ".bss.serv_runtime_priority_{{manifest.priority|lower}}"
Michel Jaouenf9de50e2021-08-03 17:42:30 +0200292__root
293#endif /* __ICCARM__ */
Ken Liuea45b0d2021-05-22 17:41:25 +0800294static struct service_t {{manifest.name|lower}}_service_runtime_item[{{(manifest.name|upper + "_NSERVS")}}]
Jianliang Shen095d45c2022-04-21 21:43:23 +0800295 __attribute__((used, section(".bss.serv_runtime_priority_{{manifest.priority|lower}}")));
Mingyang Sunb83b7bc2021-07-02 16:25:15 +0800296{% endif %}