blob: 15f415daced13d8da938353e6b618680e4fe7396 [file] [log] [blame]
David Brazdil7a462ec2019-08-15 12:27:47 +01001/*
2 * Copyright 2019 The Hafnium Authors.
3 *
Andrew Walbrane959ec12020-06-17 15:01:09 +01004 * Use of this source code is governed by a BSD-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/BSD-3-Clause.
David Brazdil7a462ec2019-08-15 12:27:47 +01007 */
8
9#pragma once
10
Olivier Deprez62d99e32020-01-09 15:58:07 +010011#include "hf/addr.h"
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -070012#include "hf/fdt.h"
Andrew Walbranb5ab43c2020-04-30 11:32:54 +010013#include "hf/ffa.h"
David Brazdil7a462ec2019-08-15 12:27:47 +010014#include "hf/memiter.h"
David Brazdil136f2942019-09-23 14:11:03 +010015#include "hf/string.h"
Andrew Scullae9962e2019-10-03 16:51:16 +010016#include "hf/vm.h"
David Brazdil0dbb41f2019-09-09 18:03:35 +010017
David Brazdil080ee312020-02-25 15:30:30 -080018#define MANIFEST_INVALID_ADDRESS UINT64_MAX
Madhukar Pappireddy54680c72020-10-23 15:02:38 -050019#define MANIFEST_INVALID_ID UINT32_MAX
David Brazdil080ee312020-02-25 15:30:30 -080020
Olivier Deprez62d99e32020-01-09 15:58:07 +010021#define SP_RTX_BUF_NAME_SIZE 10
22
Olivier Deprez035fa152022-03-14 11:19:10 +010023/** FF-A manifest memory and device regions attributes. */
24#define MANIFEST_REGION_ATTR_READ (UINT32_C(1) << 0)
25#define MANIFEST_REGION_ATTR_WRITE (UINT32_C(1) << 1)
26#define MANIFEST_REGION_ATTR_EXEC (UINT32_C(1) << 2)
27#define MANIFEST_REGION_ATTR_SECURITY (UINT32_C(1) << 3)
28
29#define MANIFEST_REGION_ALL_ATTR_MASK \
30 (MANIFEST_REGION_ATTR_READ | MANIFEST_REGION_ATTR_WRITE | \
31 MANIFEST_REGION_ATTR_EXEC | MANIFEST_REGION_ATTR_SECURITY)
Manish Pandey6542f5c2020-04-27 14:37:46 +010032
Olivier Depreza15f2352022-09-26 09:17:24 +020033#define MANIFEST_POWER_MANAGEMENT_CPU_OFF_SUPPORTED (UINT32_C(1) << 0)
34#define MANIFEST_POWER_MANAGEMENT_CPU_ON_SUPPORTED (UINT32_C(1) << 3)
35#define MANIFEST_POWER_MANAGEMENT_NONE_MASK (UINT32_C(0))
36#define MANIFEST_POWER_MANAGEMENT_ALL_MASK \
37 (MANIFEST_POWER_MANAGEMENT_CPU_OFF_SUPPORTED | \
38 MANIFEST_POWER_MANAGEMENT_CPU_ON_SUPPORTED)
39
J-Alvesbeeb6dc2021-12-08 18:21:32 +000040/* Highest possible value for the boot-order field. */
41#define DEFAULT_BOOT_ORDER 0xFFFF
J-Alves35315782022-01-25 17:58:32 +000042#define DEFAULT_BOOT_GP_REGISTER UINT32_C(-1)
J-Alvesb37fd082020-10-22 12:29:21 +010043
Olivier Deprez62d99e32020-01-09 15:58:07 +010044enum run_time_el {
45 EL1 = 0,
46 S_EL0,
47 S_EL1,
48 SUPERVISOR_MODE,
49 SECURE_USER_MODE,
50 SECURE_SUPERVISOR_MODE
51};
52
53enum execution_state { AARCH64 = 0, AARCH32 };
54
55enum xlat_granule { PAGE_4KB = 0, PAGE_16KB, PAGE_64KB };
56
Olivier Deprez62d99e32020-01-09 15:58:07 +010057/**
Olivier Deprezc13a8692022-04-08 17:47:14 +020058 * Partition Memory region as described in FFA v1.0 spec, Table 10
Manish Pandey6542f5c2020-04-27 14:37:46 +010059 */
60struct memory_region {
61 /**
62 * Specify PA, VA for S-EL0 partitions or IPA
63 * for S-EL1 partitions - optional.
64 */
65 uintptr_t base_address;
66 /** Page count - mandatory */
67 uint32_t page_count;
68 /** Memory attributes - mandatory */
69 uint32_t attributes;
70 /** Name of memory region - optional */
71 struct string name;
72};
73
Raghu Krishnamurthyad38a9c2022-07-20 07:30:36 -070074struct interrupt_info {
Manish Pandeye68e7932020-04-23 15:29:28 +010075 uint32_t id;
76 uint32_t attributes;
Raghu Krishnamurthy98da1ca2022-10-04 08:59:01 -070077 bool mpidr_valid;
78 uint64_t mpidr;
Manish Pandeye68e7932020-04-23 15:29:28 +010079};
80
81/**
Olivier Deprezc13a8692022-04-08 17:47:14 +020082 * Partition Device region as described in FFA v1.0 spec, Table 11
Manish Pandeye68e7932020-04-23 15:29:28 +010083 */
84struct device_region {
85 /** Device base PA - mandatory */
86 uintptr_t base_address;
87 /** Page count - mandatory */
88 uint32_t page_count;
89 /** Memory attributes - mandatory */
90 uint32_t attributes;
91 /** List of physical interrupt ID's and their attributes - optional */
Raghu Krishnamurthyad38a9c2022-07-20 07:30:36 -070092 struct interrupt_info interrupts[PARTITION_MAX_INTERRUPTS_PER_DEVICE];
Madhukar Pappireddy5fc8be12021-08-03 11:42:53 -050093 /** Count of physical interrupts - optional */
94 uint8_t interrupt_count;
Manish Pandeye68e7932020-04-23 15:29:28 +010095 /** SMMU ID - optional */
96 uint32_t smmu_id;
Madhukar Pappireddy54680c72020-10-23 15:02:38 -050097 /** Count of Stream IDs assigned to device - optional */
98 uint8_t stream_count;
Manish Pandeye68e7932020-04-23 15:29:28 +010099 /** List of Stream IDs assigned to device - optional */
Raghu Krishnamurthy641dcd82022-07-19 23:21:20 -0700100 uint32_t stream_ids[PARTITION_MAX_STREAMS_PER_DEVICE];
Manish Pandeye68e7932020-04-23 15:29:28 +0100101 /** Exclusive access to an endpoint - optional */
102 bool exclusive_access;
103 /** Name of Device region - optional */
104 struct string name;
105};
106
Manish Pandey6542f5c2020-04-27 14:37:46 +0100107/**
Manish Pandeyfa1f2912020-05-05 12:57:01 +0100108 * RX/TX buffer, reference to memory-region entries that describe RX/TX
109 * buffers in partition manifest.
110 */
111struct rx_tx {
112 bool available;
113 uint32_t rx_phandle;
114 uint32_t tx_phandle;
115 struct memory_region *rx_buffer;
116 struct memory_region *tx_buffer;
117};
118
119/**
Olivier Deprezc13a8692022-04-08 17:47:14 +0200120 * Partition manifest as described in FF-A v1.0 spec section 3.1
Olivier Deprez62d99e32020-01-09 15:58:07 +0100121 */
Raghu Krishnamurthy8c250a92021-07-02 12:16:42 -0700122struct partition_manifest {
Olivier Deprezc13a8692022-04-08 17:47:14 +0200123 /** FF-A expected version - mandatory */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100124 uint32_t ffa_version;
125 /** UUID - mandatory */
Fuad Tabbae4efcc32020-07-16 15:37:27 +0100126 struct ffa_uuid uuid;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100127 /** Partition id - optional */
128 ffa_vm_id_t id;
129 /** Aux ids for mem transactions - optional */
130 ffa_vm_id_t aux_id;
131
132 /* NOTE: optional name field maps to VM debug_name field */
133
134 /** mandatory */
135 ffa_vcpu_count_t execution_ctx_count;
136 /** EL1 or secure EL1, secure EL0 - mandatory */
137 enum run_time_el run_time_el;
138 /** AArch32 / AArch64 - mandatory */
139 enum execution_state execution_state;
140 /** optional */
141 uintpaddr_t load_addr;
142 /** optional */
143 size_t ep_offset;
J-Alves4369bd92020-08-07 16:35:36 +0100144 /** 4/16/64KB - optional */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100145 enum xlat_granule xlat_granule;
J-Alves35315782022-01-25 17:58:32 +0000146 /** Register id from w0/x0-w3/x3 - optional. */
147 uint32_t gp_register_num;
148 /**
149 * Flags the presence of the optional IMPDEF node to define Partition's
150 * Boot Info.
151 */
152 bool boot_info;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100153 /** optional */
154 uint16_t boot_order;
155
156 /** Optional RX/TX buffers */
Manish Pandeyfa1f2912020-05-05 12:57:01 +0100157 struct rx_tx rxtx;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100158
159 /** mandatory - direct/indirect msg or both */
Maksims Svecovsb596eab2021-04-27 00:52:27 +0100160 uint8_t messaging_method;
Madhukar Pappireddy84154052022-06-21 18:30:25 -0500161 /** mandatory - action in response to non secure interrupt */
162 uint8_t ns_interrupts_action;
Madhukar Pappireddy046dad02022-06-21 18:43:33 -0500163 /** optional - managed exit signaled through vIRQ */
164 bool me_signal_virq;
J-Alvesa4730db2021-11-02 10:31:01 +0000165 /** optional - receipt of notifications. */
166 bool notification_support;
Olivier Depreza15f2352022-09-26 09:17:24 +0200167 /**
168 * optional - power management messages bitfield.
169 *
170 * See [1] power-management-messages manifest field.
171 *
172 * The Hafnium supported combinations for a MP SP are:
173 * Bit 0 - relay PSCI cpu off message to the SP.
174 * Bit 3 - relay PSCI cpu on to the SP.
175 *
176 * [1]
177 * https://trustedfirmware-a.readthedocs.io/en/latest/components/ffa-manifest-binding.html#partition-properties
178 */
179 uint32_t power_management;
Maksims Svecovs9ddf86a2021-05-06 17:17:21 +0100180 /** optional */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100181 bool has_primary_scheduler;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100182 /** optional - tuples SEPID/SMMUID/streamId */
183 uint32_t stream_ep_ids[1];
Manish Pandey6542f5c2020-04-27 14:37:46 +0100184
185 /** Memory regions */
Raghu Krishnamurthy641dcd82022-07-19 23:21:20 -0700186 uint16_t mem_region_count;
187 struct memory_region mem_regions[PARTITION_MAX_MEMORY_REGIONS];
Manish Pandeye68e7932020-04-23 15:29:28 +0100188 /** Device regions */
Raghu Krishnamurthy641dcd82022-07-19 23:21:20 -0700189 uint16_t dev_region_count;
190 struct device_region dev_regions[PARTITION_MAX_DEVICE_REGIONS];
Madhukar Pappireddy5c04a382022-12-28 11:29:26 -0600191 /** optional - action in response to Other-Secure interrupt */
192 uint8_t other_s_interrupts_action;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100193};
194
195/**
David Brazdil7a462ec2019-08-15 12:27:47 +0100196 * Holds information about one of the VMs described in the manifest.
197 */
198struct manifest_vm {
199 /* Properties defined for both primary and secondary VMs. */
David Brazdil136f2942019-09-23 14:11:03 +0100200 struct string debug_name;
201 struct string kernel_filename;
Andrew Scullae9962e2019-10-03 16:51:16 +0100202 struct smc_whitelist smc_whitelist;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100203 bool is_ffa_partition;
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -0700204 bool is_hyp_loaded;
Raghu Krishnamurthy8c250a92021-07-02 12:16:42 -0700205 struct partition_manifest partition;
David Brazdil7a462ec2019-08-15 12:27:47 +0100206
David Brazdile6f83222019-09-23 14:47:37 +0100207 union {
208 /* Properties specific to the primary VM. */
209 struct {
David Brazdil080ee312020-02-25 15:30:30 -0800210 uint64_t boot_address;
David Brazdile6f83222019-09-23 14:47:37 +0100211 struct string ramdisk_filename;
212 } primary;
213 /* Properties specific to secondary VMs. */
214 struct {
215 uint64_t mem_size;
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100216 ffa_vcpu_count_t vcpu_count;
Fuad Tabba50469e02020-06-30 15:14:28 +0100217 struct string fdt_filename;
David Brazdile6f83222019-09-23 14:47:37 +0100218 } secondary;
219 };
David Brazdil7a462ec2019-08-15 12:27:47 +0100220};
221
222/**
223 * Hafnium manifest parsed from FDT.
224 */
225struct manifest {
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100226 bool ffa_tee_enabled;
227 ffa_vm_count_t vm_count;
David Brazdil7a462ec2019-08-15 12:27:47 +0100228 struct manifest_vm vm[MAX_VMS];
229};
230
231enum manifest_return_code {
232 MANIFEST_SUCCESS = 0,
David Brazdila2358d42020-01-27 18:51:38 +0000233 MANIFEST_ERROR_FILE_SIZE,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100234 MANIFEST_ERROR_MALFORMED_DTB,
David Brazdila2358d42020-01-27 18:51:38 +0000235 MANIFEST_ERROR_NO_ROOT_NODE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100236 MANIFEST_ERROR_NO_HYPERVISOR_FDT_NODE,
David Brazdil74e9c3b2019-08-28 11:09:08 +0100237 MANIFEST_ERROR_NOT_COMPATIBLE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100238 MANIFEST_ERROR_RESERVED_VM_ID,
239 MANIFEST_ERROR_NO_PRIMARY_VM,
240 MANIFEST_ERROR_TOO_MANY_VMS,
241 MANIFEST_ERROR_PROPERTY_NOT_FOUND,
242 MANIFEST_ERROR_MALFORMED_STRING,
David Brazdil0dbb41f2019-09-09 18:03:35 +0100243 MANIFEST_ERROR_STRING_TOO_LONG,
David Brazdil7a462ec2019-08-15 12:27:47 +0100244 MANIFEST_ERROR_MALFORMED_INTEGER,
245 MANIFEST_ERROR_INTEGER_OVERFLOW,
Andrew Scullae9962e2019-10-03 16:51:16 +0100246 MANIFEST_ERROR_MALFORMED_INTEGER_LIST,
Andrew Scullb2c3a242019-11-04 13:52:36 +0000247 MANIFEST_ERROR_MALFORMED_BOOLEAN,
J-Alves35315782022-01-25 17:58:32 +0000248 MANIFEST_ERROR_ARGUMENTS_LIST_EMPTY,
Manish Pandey6542f5c2020-04-27 14:37:46 +0100249 MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
Manish Pandeye68e7932020-04-23 15:29:28 +0100250 MANIFEST_ERROR_DEVICE_REGION_NODE_EMPTY,
Manish Pandeyf06c9072020-09-29 15:41:58 +0100251 MANIFEST_ERROR_RXTX_SIZE_MISMATCH,
Varun Wadekar4afbfd72022-10-13 14:30:18 +0100252 MANIFEST_ERROR_MEM_REGION_EMPTY,
Daniel Boulbya7e9e182022-06-27 14:21:01 +0100253 MANIFEST_ERROR_MEM_REGION_OVERLAP,
Raghu Krishnamurthy384693c2021-10-11 13:56:24 -0700254 MANIFEST_ERROR_INVALID_MEM_PERM,
Daniel Boulby801f8ef2022-06-27 14:21:01 +0100255 MANIFEST_ERROR_INTERRUPT_ID_REPEATED,
Madhukar Pappireddy5c04a382022-12-28 11:29:26 -0600256 MANIFEST_ERROR_ILLEGAL_NS_INT_ACTION,
Raghu Krishnamurthy98da1ca2022-10-04 08:59:01 -0700257 MANIFEST_ERROR_INTERRUPT_ID_NOT_IN_LIST,
Madhukar Pappireddy5c04a382022-12-28 11:29:26 -0600258 MANIFEST_ERROR_ILLEGAL_OTHER_S_INT_ACTION,
David Brazdil7a462ec2019-08-15 12:27:47 +0100259};
260
Olivier Deprez62d99e32020-01-09 15:58:07 +0100261enum manifest_return_code manifest_init(struct mm_stage1_locked stage1_locked,
Olivier Deprez93644652022-09-09 11:01:12 +0200262 struct manifest **manifest,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100263 struct memiter *manifest_fdt,
264 struct mpool *ppool);
Daniel Boulby801f8ef2022-06-27 14:21:01 +0100265void manifest_deinit(struct mpool *ppool);
Olivier Deprez62d99e32020-01-09 15:58:07 +0100266
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -0700267enum manifest_return_code parse_ffa_manifest(struct fdt *fdt,
J-Alves35315782022-01-25 17:58:32 +0000268 struct manifest_vm *vm,
269 struct fdt_node *boot_info);
270
Olivier Deprez62d99e32020-01-09 15:58:07 +0100271void manifest_dump(struct manifest_vm *vm);
David Brazdil7a462ec2019-08-15 12:27:47 +0100272
273const char *manifest_strerror(enum manifest_return_code ret_code);