blob: 8a0188351b69c0c17e07ea2a0ee48e76e165db70 [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"
Andrew Walbranb5ab43c2020-04-30 11:32:54 +010012#include "hf/ffa.h"
David Brazdil7a462ec2019-08-15 12:27:47 +010013#include "hf/memiter.h"
David Brazdil136f2942019-09-23 14:11:03 +010014#include "hf/string.h"
Andrew Scullae9962e2019-10-03 16:51:16 +010015#include "hf/vm.h"
David Brazdil0dbb41f2019-09-09 18:03:35 +010016
David Brazdil080ee312020-02-25 15:30:30 -080017#define MANIFEST_INVALID_ADDRESS UINT64_MAX
Madhukar Pappireddy54680c72020-10-23 15:02:38 -050018#define MANIFEST_INVALID_ID UINT32_MAX
David Brazdil080ee312020-02-25 15:30:30 -080019
Olivier Deprez62d99e32020-01-09 15:58:07 +010020#define SP_PKG_HEADER_MAGIC (0x474b5053)
21#define SP_PKG_HEADER_VERSION (0x1)
22
23#define SP_RTX_BUF_NAME_SIZE 10
24
Manish Pandey6542f5c2020-04-27 14:37:46 +010025#define SP_MAX_MEMORY_REGIONS 8
Manish Pandeye68e7932020-04-23 15:29:28 +010026#define SP_MAX_DEVICE_REGIONS 8
27#define SP_MAX_INTERRUPTS_PER_DEVICE 4
28#define SP_MAX_STREAMS_PER_DEVICE 4
Manish Pandey6542f5c2020-04-27 14:37:46 +010029
30/** Mask for getting read/write/execute permission */
31#define MM_PERM_MASK 0x7
32
J-Alvesb37fd082020-10-22 12:29:21 +010033#define DEFAULT_BOOT_ORDER 0x0
34
Olivier Deprez62d99e32020-01-09 15:58:07 +010035enum run_time_el {
36 EL1 = 0,
37 S_EL0,
38 S_EL1,
39 SUPERVISOR_MODE,
40 SECURE_USER_MODE,
41 SECURE_SUPERVISOR_MODE
42};
43
44enum execution_state { AARCH64 = 0, AARCH32 };
45
46enum xlat_granule { PAGE_4KB = 0, PAGE_16KB, PAGE_64KB };
47
48enum messaging_method {
49 DIRECT_MESSAGING = 0,
50 INDIRECT_MESSAGING,
Manish Pandeyf3be6392020-09-24 17:26:09 +010051 BOTH_MESSAGING,
52 DIRECT_MESSAGING_MANAGED_EXIT,
53 BOTH_MESSAGING_MANAGED_EXIT
Olivier Deprez62d99e32020-01-09 15:58:07 +010054};
55
56/**
Manish Pandey6542f5c2020-04-27 14:37:46 +010057 * Partition Memory region as described in PSA FFA v1.0 spec, Table 10
58 */
59struct memory_region {
60 /**
61 * Specify PA, VA for S-EL0 partitions or IPA
62 * for S-EL1 partitions - optional.
63 */
64 uintptr_t base_address;
65 /** Page count - mandatory */
66 uint32_t page_count;
67 /** Memory attributes - mandatory */
68 uint32_t attributes;
69 /** Name of memory region - optional */
70 struct string name;
71};
72
Manish Pandeye68e7932020-04-23 15:29:28 +010073struct interrupt {
74 uint32_t id;
75 uint32_t attributes;
76};
77
78/**
79 * Partition Device region as described in PSA FFA v1.0 spec, Table 11
80 */
81struct device_region {
82 /** Device base PA - mandatory */
83 uintptr_t base_address;
84 /** Page count - mandatory */
85 uint32_t page_count;
86 /** Memory attributes - mandatory */
87 uint32_t attributes;
88 /** List of physical interrupt ID's and their attributes - optional */
89 struct interrupt interrupts[SP_MAX_INTERRUPTS_PER_DEVICE];
90 /** SMMU ID - optional */
91 uint32_t smmu_id;
Madhukar Pappireddy54680c72020-10-23 15:02:38 -050092 /** Count of Stream IDs assigned to device - optional */
93 uint8_t stream_count;
Manish Pandeye68e7932020-04-23 15:29:28 +010094 /** List of Stream IDs assigned to device - optional */
95 uint32_t stream_ids[SP_MAX_STREAMS_PER_DEVICE];
96 /** Exclusive access to an endpoint - optional */
97 bool exclusive_access;
98 /** Name of Device region - optional */
99 struct string name;
100};
101
Manish Pandey6542f5c2020-04-27 14:37:46 +0100102/**
Manish Pandeyfa1f2912020-05-05 12:57:01 +0100103 * RX/TX buffer, reference to memory-region entries that describe RX/TX
104 * buffers in partition manifest.
105 */
106struct rx_tx {
107 bool available;
108 uint32_t rx_phandle;
109 uint32_t tx_phandle;
110 struct memory_region *rx_buffer;
111 struct memory_region *tx_buffer;
112};
113
114/**
Olivier Deprez62d99e32020-01-09 15:58:07 +0100115 * Partition manifest as described in PSA FF-A v1.0 spec section 3.1
116 */
117struct sp_manifest {
118 /** PSA-FF-A expected version - mandatory */
119 uint32_t ffa_version;
120 /** UUID - mandatory */
Fuad Tabbae4efcc32020-07-16 15:37:27 +0100121 struct ffa_uuid uuid;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100122 /** Partition id - optional */
123 ffa_vm_id_t id;
124 /** Aux ids for mem transactions - optional */
125 ffa_vm_id_t aux_id;
126
127 /* NOTE: optional name field maps to VM debug_name field */
128
129 /** mandatory */
130 ffa_vcpu_count_t execution_ctx_count;
131 /** EL1 or secure EL1, secure EL0 - mandatory */
132 enum run_time_el run_time_el;
133 /** AArch32 / AArch64 - mandatory */
134 enum execution_state execution_state;
135 /** optional */
136 uintpaddr_t load_addr;
137 /** optional */
138 size_t ep_offset;
J-Alves4369bd92020-08-07 16:35:36 +0100139 /** 4/16/64KB - optional */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100140 enum xlat_granule xlat_granule;
141 /** optional */
142 uint16_t boot_order;
143
144 /** Optional RX/TX buffers */
Manish Pandeyfa1f2912020-05-05 12:57:01 +0100145 struct rx_tx rxtx;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100146
147 /** mandatory - direct/indirect msg or both */
148 enum messaging_method messaging_method;
149 /** optional */
150 bool has_primary_scheduler;
151 /** optional - preemptible / run to completion */
152 uint8_t runtime_model;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100153 /** optional - tuples SEPID/SMMUID/streamId */
154 uint32_t stream_ep_ids[1];
Manish Pandey6542f5c2020-04-27 14:37:46 +0100155
156 /** Memory regions */
Manish Pandey2145c212020-05-01 16:04:22 +0100157 uint8_t mem_region_count;
Manish Pandey6542f5c2020-04-27 14:37:46 +0100158 struct memory_region mem_regions[SP_MAX_MEMORY_REGIONS];
Manish Pandeye68e7932020-04-23 15:29:28 +0100159 /** Device regions */
Manish Pandey2145c212020-05-01 16:04:22 +0100160 uint8_t dev_region_count;
Manish Pandeye68e7932020-04-23 15:29:28 +0100161 struct device_region dev_regions[SP_MAX_DEVICE_REGIONS];
Olivier Deprez62d99e32020-01-09 15:58:07 +0100162};
163
164/**
165 * Header for a PSA FF-A partition package.
166 */
167struct sp_pkg_header {
168 /** Magic used to identify a SP package. Value is "SPKG" */
169 uint32_t magic;
170 /** Version number of the header */
171 uint32_t version;
172 /** Offset in bytes to the partition manifest */
173 uint32_t pm_offset;
174 /** Size in bytes of the partition manifest */
175 uint32_t pm_size;
176 /** Offset in bytes to the base address of the partition binary */
177 uint32_t img_offset;
178 /** Size in bytes of the partition binary */
179 uint32_t img_size;
180};
181
David Brazdil0dbb41f2019-09-09 18:03:35 +0100182/**
David Brazdil7a462ec2019-08-15 12:27:47 +0100183 * Holds information about one of the VMs described in the manifest.
184 */
185struct manifest_vm {
186 /* Properties defined for both primary and secondary VMs. */
David Brazdil136f2942019-09-23 14:11:03 +0100187 struct string debug_name;
188 struct string kernel_filename;
Andrew Scullae9962e2019-10-03 16:51:16 +0100189 struct smc_whitelist smc_whitelist;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100190 bool is_ffa_partition;
191 struct sp_manifest sp;
David Brazdil7a462ec2019-08-15 12:27:47 +0100192
David Brazdile6f83222019-09-23 14:47:37 +0100193 union {
194 /* Properties specific to the primary VM. */
195 struct {
David Brazdil080ee312020-02-25 15:30:30 -0800196 uint64_t boot_address;
David Brazdile6f83222019-09-23 14:47:37 +0100197 struct string ramdisk_filename;
198 } primary;
199 /* Properties specific to secondary VMs. */
200 struct {
201 uint64_t mem_size;
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100202 ffa_vcpu_count_t vcpu_count;
Fuad Tabba50469e02020-06-30 15:14:28 +0100203 struct string fdt_filename;
David Brazdile6f83222019-09-23 14:47:37 +0100204 } secondary;
205 };
David Brazdil7a462ec2019-08-15 12:27:47 +0100206};
207
208/**
209 * Hafnium manifest parsed from FDT.
210 */
211struct manifest {
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100212 bool ffa_tee_enabled;
213 ffa_vm_count_t vm_count;
David Brazdil7a462ec2019-08-15 12:27:47 +0100214 struct manifest_vm vm[MAX_VMS];
215};
216
217enum manifest_return_code {
218 MANIFEST_SUCCESS = 0,
David Brazdila2358d42020-01-27 18:51:38 +0000219 MANIFEST_ERROR_FILE_SIZE,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100220 MANIFEST_ERROR_MALFORMED_DTB,
David Brazdila2358d42020-01-27 18:51:38 +0000221 MANIFEST_ERROR_NO_ROOT_NODE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100222 MANIFEST_ERROR_NO_HYPERVISOR_FDT_NODE,
David Brazdil74e9c3b2019-08-28 11:09:08 +0100223 MANIFEST_ERROR_NOT_COMPATIBLE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100224 MANIFEST_ERROR_RESERVED_VM_ID,
225 MANIFEST_ERROR_NO_PRIMARY_VM,
226 MANIFEST_ERROR_TOO_MANY_VMS,
227 MANIFEST_ERROR_PROPERTY_NOT_FOUND,
228 MANIFEST_ERROR_MALFORMED_STRING,
David Brazdil0dbb41f2019-09-09 18:03:35 +0100229 MANIFEST_ERROR_STRING_TOO_LONG,
David Brazdil7a462ec2019-08-15 12:27:47 +0100230 MANIFEST_ERROR_MALFORMED_INTEGER,
231 MANIFEST_ERROR_INTEGER_OVERFLOW,
Andrew Scullae9962e2019-10-03 16:51:16 +0100232 MANIFEST_ERROR_MALFORMED_INTEGER_LIST,
Andrew Scullb2c3a242019-11-04 13:52:36 +0000233 MANIFEST_ERROR_MALFORMED_BOOLEAN,
Manish Pandey6542f5c2020-04-27 14:37:46 +0100234 MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
Manish Pandeye68e7932020-04-23 15:29:28 +0100235 MANIFEST_ERROR_DEVICE_REGION_NODE_EMPTY,
Manish Pandeyf06c9072020-09-29 15:41:58 +0100236 MANIFEST_ERROR_RXTX_SIZE_MISMATCH,
David Brazdil7a462ec2019-08-15 12:27:47 +0100237};
238
Olivier Deprez62d99e32020-01-09 15:58:07 +0100239enum manifest_return_code manifest_init(struct mm_stage1_locked stage1_locked,
240 struct manifest *manifest,
241 struct memiter *manifest_fdt,
242 struct mpool *ppool);
243
244void manifest_dump(struct manifest_vm *vm);
David Brazdil7a462ec2019-08-15 12:27:47 +0100245
246const char *manifest_strerror(enum manifest_return_code ret_code);