blob: fc3307ba6f92370ffb2d886724f41a0947e029a7 [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
18
Olivier Deprez62d99e32020-01-09 15:58:07 +010019#define SP_PKG_HEADER_MAGIC (0x474b5053)
20#define SP_PKG_HEADER_VERSION (0x1)
21
22#define SP_RTX_BUF_NAME_SIZE 10
23
Manish Pandey6542f5c2020-04-27 14:37:46 +010024#define SP_MAX_MEMORY_REGIONS 8
25
26/** Mask for getting read/write/execute permission */
27#define MM_PERM_MASK 0x7
28
Olivier Deprez62d99e32020-01-09 15:58:07 +010029enum run_time_el {
30 EL1 = 0,
31 S_EL0,
32 S_EL1,
33 SUPERVISOR_MODE,
34 SECURE_USER_MODE,
35 SECURE_SUPERVISOR_MODE
36};
37
38enum execution_state { AARCH64 = 0, AARCH32 };
39
40enum xlat_granule { PAGE_4KB = 0, PAGE_16KB, PAGE_64KB };
41
42enum messaging_method {
43 DIRECT_MESSAGING = 0,
44 INDIRECT_MESSAGING,
45 BOTH_MESSAGING
46};
47
48/**
Manish Pandey6542f5c2020-04-27 14:37:46 +010049 * Partition Memory region as described in PSA FFA v1.0 spec, Table 10
50 */
51struct memory_region {
52 /**
53 * Specify PA, VA for S-EL0 partitions or IPA
54 * for S-EL1 partitions - optional.
55 */
56 uintptr_t base_address;
57 /** Page count - mandatory */
58 uint32_t page_count;
59 /** Memory attributes - mandatory */
60 uint32_t attributes;
61 /** Name of memory region - optional */
62 struct string name;
63};
64
65/**
Olivier Deprez62d99e32020-01-09 15:58:07 +010066 * Partition manifest as described in PSA FF-A v1.0 spec section 3.1
67 */
68struct sp_manifest {
69 /** PSA-FF-A expected version - mandatory */
70 uint32_t ffa_version;
71 /** UUID - mandatory */
Fuad Tabbae4efcc32020-07-16 15:37:27 +010072 struct ffa_uuid uuid;
Olivier Deprez62d99e32020-01-09 15:58:07 +010073 /** Partition id - optional */
74 ffa_vm_id_t id;
75 /** Aux ids for mem transactions - optional */
76 ffa_vm_id_t aux_id;
77
78 /* NOTE: optional name field maps to VM debug_name field */
79
80 /** mandatory */
81 ffa_vcpu_count_t execution_ctx_count;
82 /** EL1 or secure EL1, secure EL0 - mandatory */
83 enum run_time_el run_time_el;
84 /** AArch32 / AArch64 - mandatory */
85 enum execution_state execution_state;
86 /** optional */
87 uintpaddr_t load_addr;
88 /** optional */
89 size_t ep_offset;
90 /** 4/16/64KB - mandatory */
91 enum xlat_granule xlat_granule;
92 /** optional */
93 uint16_t boot_order;
94
95 /** Optional RX/TX buffers */
96 struct {
97 bool rxtx_found;
98 /** optional */
99 uint64_t base_address;
100 /** optional */
101 uint16_t pages_count;
102 /** mandatory */
103 uint16_t attributes;
104 /** Optional */
105 char name[SP_RTX_BUF_NAME_SIZE];
106 } rxtx;
107
108 /** mandatory - direct/indirect msg or both */
109 enum messaging_method messaging_method;
110 /** optional */
111 bool has_primary_scheduler;
112 /** optional - preemptible / run to completion */
113 uint8_t runtime_model;
114 /** optional */
115 bool time_slice_mem;
116 /** optional - tuples SEPID/SMMUID/streamId */
117 uint32_t stream_ep_ids[1];
Manish Pandey6542f5c2020-04-27 14:37:46 +0100118
119 /** Memory regions */
120 struct memory_region mem_regions[SP_MAX_MEMORY_REGIONS];
Olivier Deprez62d99e32020-01-09 15:58:07 +0100121};
122
123/**
124 * Header for a PSA FF-A partition package.
125 */
126struct sp_pkg_header {
127 /** Magic used to identify a SP package. Value is "SPKG" */
128 uint32_t magic;
129 /** Version number of the header */
130 uint32_t version;
131 /** Offset in bytes to the partition manifest */
132 uint32_t pm_offset;
133 /** Size in bytes of the partition manifest */
134 uint32_t pm_size;
135 /** Offset in bytes to the base address of the partition binary */
136 uint32_t img_offset;
137 /** Size in bytes of the partition binary */
138 uint32_t img_size;
139};
140
David Brazdil0dbb41f2019-09-09 18:03:35 +0100141/**
David Brazdil7a462ec2019-08-15 12:27:47 +0100142 * Holds information about one of the VMs described in the manifest.
143 */
144struct manifest_vm {
145 /* Properties defined for both primary and secondary VMs. */
David Brazdil136f2942019-09-23 14:11:03 +0100146 struct string debug_name;
147 struct string kernel_filename;
Andrew Scullae9962e2019-10-03 16:51:16 +0100148 struct smc_whitelist smc_whitelist;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100149 bool is_ffa_partition;
150 struct sp_manifest sp;
David Brazdil7a462ec2019-08-15 12:27:47 +0100151
David Brazdile6f83222019-09-23 14:47:37 +0100152 union {
153 /* Properties specific to the primary VM. */
154 struct {
David Brazdil080ee312020-02-25 15:30:30 -0800155 uint64_t boot_address;
David Brazdile6f83222019-09-23 14:47:37 +0100156 struct string ramdisk_filename;
157 } primary;
158 /* Properties specific to secondary VMs. */
159 struct {
160 uint64_t mem_size;
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100161 ffa_vcpu_count_t vcpu_count;
Fuad Tabba50469e02020-06-30 15:14:28 +0100162 struct string fdt_filename;
David Brazdile6f83222019-09-23 14:47:37 +0100163 } secondary;
164 };
David Brazdil7a462ec2019-08-15 12:27:47 +0100165};
166
167/**
168 * Hafnium manifest parsed from FDT.
169 */
170struct manifest {
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100171 bool ffa_tee_enabled;
172 ffa_vm_count_t vm_count;
David Brazdil7a462ec2019-08-15 12:27:47 +0100173 struct manifest_vm vm[MAX_VMS];
174};
175
176enum manifest_return_code {
177 MANIFEST_SUCCESS = 0,
David Brazdila2358d42020-01-27 18:51:38 +0000178 MANIFEST_ERROR_FILE_SIZE,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100179 MANIFEST_ERROR_MALFORMED_DTB,
David Brazdila2358d42020-01-27 18:51:38 +0000180 MANIFEST_ERROR_NO_ROOT_NODE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100181 MANIFEST_ERROR_NO_HYPERVISOR_FDT_NODE,
David Brazdil74e9c3b2019-08-28 11:09:08 +0100182 MANIFEST_ERROR_NOT_COMPATIBLE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100183 MANIFEST_ERROR_RESERVED_VM_ID,
184 MANIFEST_ERROR_NO_PRIMARY_VM,
185 MANIFEST_ERROR_TOO_MANY_VMS,
186 MANIFEST_ERROR_PROPERTY_NOT_FOUND,
187 MANIFEST_ERROR_MALFORMED_STRING,
David Brazdil0dbb41f2019-09-09 18:03:35 +0100188 MANIFEST_ERROR_STRING_TOO_LONG,
David Brazdil7a462ec2019-08-15 12:27:47 +0100189 MANIFEST_ERROR_MALFORMED_INTEGER,
190 MANIFEST_ERROR_INTEGER_OVERFLOW,
Andrew Scullae9962e2019-10-03 16:51:16 +0100191 MANIFEST_ERROR_MALFORMED_INTEGER_LIST,
Andrew Scullb2c3a242019-11-04 13:52:36 +0000192 MANIFEST_ERROR_MALFORMED_BOOLEAN,
Manish Pandey6542f5c2020-04-27 14:37:46 +0100193 MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
David Brazdil7a462ec2019-08-15 12:27:47 +0100194};
195
Olivier Deprez62d99e32020-01-09 15:58:07 +0100196enum manifest_return_code manifest_init(struct mm_stage1_locked stage1_locked,
197 struct manifest *manifest,
198 struct memiter *manifest_fdt,
199 struct mpool *ppool);
200
201void manifest_dump(struct manifest_vm *vm);
David Brazdil7a462ec2019-08-15 12:27:47 +0100202
203const char *manifest_strerror(enum manifest_return_code ret_code);