blob: 908944b7358d0bdf9dcb0863dc504bb5b267c9af [file] [log] [blame]
Mingyang Sunf6a78572021-04-02 16:51:05 +08001/*
2 * Copyright (c) 2021, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8{{utilities.donotedit_warning}}
9
10#include <stdint.h>
11#include <stddef.h>
12#include "region.h"
Ken Liuea45b0d2021-05-22 17:41:25 +080013#include "spm_ipc.h"
Kevin Peng27e42272021-05-24 17:58:53 +080014#include "load/irq_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080015#include "load/partition_defs.h"
16#include "load/service_defs.h"
Ken Liu86686282021-04-27 11:11:15 +080017#include "load/asset_defs.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080018#include "tfm_peripherals_def.h"
19#include "psa_manifest/pid.h"
20#include "psa_manifest/sid.h"
Ken Liu861b0782021-05-22 13:15:08 +080021#include "psa_manifest/{{manifest_out_basename}}.h"
Mingyang Sunf6a78572021-04-02 16:51:05 +080022
Kevin Peng27e42272021-05-24 17:58:53 +080023{% set counter = namespace(dep_counter=0, service_counter=0, asset_counter=0, irq_counter=0) %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080024{% if manifest.dependencies %}
25 {% for dep in manifest.dependencies %}
26 {% set counter.dep_counter = counter.dep_counter + 1 %}
27 {% endfor %}
28{% endif %}
29{% if manifest.services %}
30 {% for service in manifest.services %}
31 {% set counter.service_counter = counter.service_counter + 1 %}
32 {% endfor %}
33{% endif %}
Ken Liu86686282021-04-27 11:11:15 +080034{% if manifest.mmio_regions %}
35 {% for asset in manifest.mmio_regions %}
36 {% set counter.asset_counter = counter.asset_counter + 1 %}
37 {% endfor %}
38{% endif %}
Kevin Peng27e42272021-05-24 17:58:53 +080039{% if manifest.irqs %}
40 {% for irq in manifest.irqs %}
41 {% set counter.irq_counter = counter.irq_counter + 1 %}
42 {% endfor %}
43{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080044#define {{"%-55s"|format(manifest.name|upper + "_NDEPS")}} ({{"%d"|format(counter.dep_counter)}})
45#define {{"%-55s"|format(manifest.name|upper + "_NSERVS")}} ({{"%d"|format(counter.service_counter)}})
Ken Liu86686282021-04-27 11:11:15 +080046#if TFM_LVL == 3
47#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}} + 1)
48#else
49#define {{"%-55s"|format(manifest.name|upper + "_NASSETS")}} ({{"%d"|format(counter.asset_counter)}})
50#endif
Kevin Peng27e42272021-05-24 17:58:53 +080051#define {{"%-55s"|format(manifest.name|upper + "_NIRQS")}} ({{"%d"|format(counter.irq_counter)}})
Mingyang Sunf6a78572021-04-02 16:51:05 +080052
53/* Memory region declaration */
54#if TFM_LVL == 3
55REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base);
56REGION_DECLARE(Image$$, PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base);
57#endif
58extern uint8_t {{manifest.name|lower}}_stack[];
59
Shawn Shancaefb8f2021-04-15 14:19:13 +080060{% if manifest.entry_init and manifest.entry_point %}
61#error "Both manifest.entry_init and manifest.entry_point exist, unsupported!"
62{% elif (manifest.model == "IPC" or manifest.psa_framework_version == 1.0) and (not manifest.entry_point) %}
63#error "The entry_point attribute is required, it should not be empty!"
64{% elif manifest.model == "SFN" and manifest.entry_point %}
65#error "The entry_point attribute should not be exist in SFN mode!"
66{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080067/* Entrypoint function declaration */
Shawn Shancaefb8f2021-04-15 14:19:13 +080068{% if manifest.entry_point %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080069extern void {{manifest.entry_point}}(void);
Shawn Shancaefb8f2021-04-15 14:19:13 +080070{% elif manifest.entry_init %}
71extern psa_status_t {{manifest.entry_init}}(void);
72{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080073
Mingyang Sun8d004f72021-06-01 10:46:26 +080074/* partition load info type definition */
Ken Liu4520ce32021-05-11 22:49:10 +080075struct partition_{{manifest.name|lower}}_load_info_t {
Mingyang Sun8d004f72021-06-01 10:46:26 +080076 /* common length load data */
77 struct partition_load_info_t load_info;
78 /* per-partition variable length load data */
Ken Liuacd2a572021-05-12 16:19:04 +080079 uintptr_t stack_addr;
80 uintptr_t heap_addr;
Mingyang Sunf6a78572021-04-02 16:51:05 +080081{% if manifest.dependencies %}
82 uint32_t deps[{{(manifest.name|upper + "_NDEPS")}}];
83{% endif %}
84{% if manifest.services %}
Ken Liuacd2a572021-05-12 16:19:04 +080085 struct service_load_info_t services[{{(manifest.name|upper + "_NSERVS")}}];
Mingyang Sunf6a78572021-04-02 16:51:05 +080086{% endif %}
Ken Liu86686282021-04-27 11:11:15 +080087#if TFM_LVL == 3
88 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
89#else
90{% if manifest.mmio_regions %}
91 struct asset_desc_t assets[{{(manifest.name|upper + "_NASSETS")}}];
92{% endif %}
93#endif
Kevin Peng27e42272021-05-24 17:58:53 +080094{% if manifest.irqs %}
95 struct irq_load_info_t irqs[{{(manifest.name|upper + "_NIRQS")}}];
96{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +080097} __attribute__((aligned(4)));
98
Mingyang Sun8d004f72021-06-01 10:46:26 +080099/* Partition load, deps, service load data. Put to a dedicated section. */
100const struct partition_{{manifest.name|lower}}_load_info_t {{manifest.name|lower}}_load
101 __attribute__((used, section(".part_load"))) = {
102 .load_info = {
Mingyang Sunf6a78572021-04-02 16:51:05 +0800103{% if manifest.psa_framework_version == 1.0 %}
104 .psa_ff_ver = 0x0100 | PARTITION_INFO_MAGIC,
105{% elif manifest.psa_framework_version == 1.1 %}
106 .psa_ff_ver = 0x0101 | PARTITION_INFO_MAGIC,
107{% else %}
108#error "Unsupported ff version '{{manifest.psa_framework_version}}' for partition '{{manifest.name}}'!"
109{% endif %}
110 .pid = {{manifest.name}},
111 .flags = 0
Shawn Shancaefb8f2021-04-15 14:19:13 +0800112{% if (manifest.psa_framework_version == 1.1 and manifest.model == "IPC") or manifest.psa_framework_version == 1.0 %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800113 | SPM_PART_FLAG_IPC
114{% endif %}
115{% if manifest.type == "PSA-ROT" %}
116 | SPM_PART_FLAG_PSA_ROT
117{% elif manifest.type != "APPLICATION-ROT" %}
118#error "Unsupported type '{{manifest.type}}' for partition '{{manifest.name}}'!"
119{% endif %}
120 | PARTITION_PRI_{{manifest.priority}},
Shawn Shancaefb8f2021-04-15 14:19:13 +0800121{% if manifest.entry_point %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800122 .entry = ENTRY_TO_POSITION({{manifest.entry_point}}),
Shawn Shancaefb8f2021-04-15 14:19:13 +0800123{% elif manifest.entry_init %}
124 .entry = ENTRY_TO_POSITION({{manifest.entry_init}}),
125{% else %}
126 .entry = NULL,
127{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800128 .stack_size = {{manifest.stack_size}},
129 .heap_size = 0,
130 .ndeps = {{(manifest.name|upper + "_NDEPS")}},
131 .nservices = {{(manifest.name|upper + "_NSERVS")}},
Ken Liu86686282021-04-27 11:11:15 +0800132 .nassets = {{(manifest.name|upper + "_NASSETS")}},
Kevin Peng27e42272021-05-24 17:58:53 +0800133 .nirqs = {{(manifest.name|upper + "_NIRQS")}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800134 },
Ken Liuacd2a572021-05-12 16:19:04 +0800135 .stack_addr = (uintptr_t){{manifest.name|lower}}_stack,
136 .heap_addr = 0,
Mingyang Sunf6a78572021-04-02 16:51:05 +0800137{% if manifest.dependencies %}
138 .deps = {
139 {% for dep in manifest.dependencies %}
140 {{dep}}_SID,
141 {% endfor %}
142 },
143{% endif %}
144{% if manifest.services %}
145 .services = {
146 {% for service in manifest.services %}
147 {
148 .name_strid = STRING_PTR_TO_STRID("{{service.name}}"),
Shawn Shancaefb8f2021-04-15 14:19:13 +0800149{% if manifest.psa_framework_version == 1.1 and manifest.model == "SFN" %}
150 .sfn = ENTRY_TO_POSITION({{service.name|lower}}_sfn),
151{% else %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800152 .signal = {{service.name}}_SIGNAL,
Shawn Shancaefb8f2021-04-15 14:19:13 +0800153{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800154 .sid = {{service.sid}},
155 .flags = 0
156 {% if service.non_secure_clients is sameas true %}
157 | SERVICE_FLAG_NS_ACCESSIBLE
158 {% endif %}
159 {% if manifest.psa_framework_version > 1.0 and service.connection_based is sameas false %}
Mingyang Suna03ad022021-06-01 20:41:15 +0800160 | SERVICE_FLAG_STATELESS | 0x{{"%x"|format(service.stateless_handle_index)}}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800161 {% endif %}
162 {% if service.version_policy %}
Ken Liub3b2cb62021-05-22 00:39:28 +0800163 | SERVICE_VERSION_POLICY_{{service.version_policy}},
Mingyang Sunf6a78572021-04-02 16:51:05 +0800164 {% else %}
Ken Liub3b2cb62021-05-22 00:39:28 +0800165 | SERVICE_VERSION_POLICY_STRICT,
Mingyang Sunf6a78572021-04-02 16:51:05 +0800166 {% endif %}
167 {% if service.version %}
168 .version = {{service.version}},
169 {% else %}
170 .version = 1,
171 {% endif %}
172 },
173 {% endfor %}
174 },
175{% endif %}
Ken Liu86686282021-04-27 11:11:15 +0800176#if TFM_LVL == 3
177 .assets = {
178 {
179 .mem.addr_x = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_START$$Base),
180 .mem.addr_y = PART_REGION_ADDR(PT_{{manifest.name}}_PRIVATE, _DATA_END$$Base),
181 .attr = ASSET_MEM_RD_BIT | ASSET_MEM_WR_BIT,
182 },
183{% for region in manifest.mmio_regions %}
184 {% if region.conditional %}
185#ifdef {{region.conditional}}
186 {% endif %}
187 {
Ken Liuacd2a572021-05-12 16:19:04 +0800188 .dev.addr_ref = PTR_TO_REFERENCE({{region.name}}),
Ken Liu86686282021-04-27 11:11:15 +0800189 .attr = ASSET_DEV_REF_BIT,
190 },
191 {% if region.conditional %}
192#endif
193 {% endif %}
194{% endfor %}
Kevin Peng27e42272021-05-24 17:58:53 +0800195 },
Ken Liu86686282021-04-27 11:11:15 +0800196#else
197{% if manifest.mmio_regions %}
198 .assets = {
199 {% for region in manifest.mmio_regions %}
200 {% if region.conditional %}
201#ifdef {{region.conditional}}
202 {% endif %}
203 {
Ken Liuacd2a572021-05-12 16:19:04 +0800204 .dev.addr_ref = PTR_TO_REFERENCE({{region.name}}),
Ken Liu86686282021-04-27 11:11:15 +0800205 .attr = ASSET_DEV_REF_BIT,
206 },
207 {% if region.conditional %}
208#endif
209 {% endif %}
210 {% endfor %}
Kevin Peng27e42272021-05-24 17:58:53 +0800211 },
Ken Liu86686282021-04-27 11:11:15 +0800212{% endif %}
213#endif
Kevin Peng27e42272021-05-24 17:58:53 +0800214{% if manifest.irqs %}
215 .irqs = {
216 {% for irq in manifest.irqs %}
217 {% set irq_info = namespace() %}
218 {% set irq_info.source = irq.source %}
219 {% if manifest.psa_framework_version == 1.1 and irq.handling == "FLIH" %}
220 {% set irq_info.flih_func = "(uint32_t)" + irq.name|lower + "_flih" %}
221 {% else %}
222 {% set irq_info.flih_func = 0 %}
223 {% endif %}
224 {% if manifest.psa_framework_version == 1.0 %}
225 {% set irq_info.signal = irq.signal %}
226 {% else %}
227 {% set irq_info.signal = irq.name + "_SIGNAL" %}
228 {% endif %}
229 {
230 .source = {{irq_info.source}},
231 .flih_func = {{irq_info.flih_func}},
232 .signal = {{irq_info.signal}},
233 },
234 {% endfor %}
235 },
236{% endif %}
Mingyang Sunf6a78572021-04-02 16:51:05 +0800237};
Ken Liuea45b0d2021-05-22 17:41:25 +0800238
239/* Placeholder for partition and service runtime space. Do not reference it. */
240static struct partition_t {{manifest.name|lower}}_partition_runtime_item
241 __attribute__((used, section(".bss.part_runtime")));
242static struct service_t {{manifest.name|lower}}_service_runtime_item[{{(manifest.name|upper + "_NSERVS")}}]
243 __attribute__((used, section(".bss.serv_runtime")));