blob: bcdd628bca27bc25e43628ac429b4da8289575a6 [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
Manish Pandey6542f5c2020-04-27 14:37:46 +010023#define SP_MAX_MEMORY_REGIONS 8
Manish Pandeye68e7932020-04-23 15:29:28 +010024#define SP_MAX_DEVICE_REGIONS 8
25#define SP_MAX_INTERRUPTS_PER_DEVICE 4
26#define SP_MAX_STREAMS_PER_DEVICE 4
Manish Pandey6542f5c2020-04-27 14:37:46 +010027
28/** Mask for getting read/write/execute permission */
29#define MM_PERM_MASK 0x7
30
J-Alvesbeeb6dc2021-12-08 18:21:32 +000031/* Highest possible value for the boot-order field. */
32#define DEFAULT_BOOT_ORDER 0xFFFF
J-Alves35315782022-01-25 17:58:32 +000033#define DEFAULT_BOOT_GP_REGISTER UINT32_C(-1)
J-Alvesb37fd082020-10-22 12:29:21 +010034
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
Olivier Deprez62d99e32020-01-09 15:58:07 +010048/**
Olivier Deprezc13a8692022-04-08 17:47:14 +020049 * Partition Memory region as described in FFA v1.0 spec, Table 10
Manish Pandey6542f5c2020-04-27 14:37:46 +010050 */
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
Manish Pandeye68e7932020-04-23 15:29:28 +010065struct interrupt {
66 uint32_t id;
67 uint32_t attributes;
68};
69
70/**
Olivier Deprezc13a8692022-04-08 17:47:14 +020071 * Partition Device region as described in FFA v1.0 spec, Table 11
Manish Pandeye68e7932020-04-23 15:29:28 +010072 */
73struct device_region {
74 /** Device base PA - mandatory */
75 uintptr_t base_address;
76 /** Page count - mandatory */
77 uint32_t page_count;
78 /** Memory attributes - mandatory */
79 uint32_t attributes;
80 /** List of physical interrupt ID's and their attributes - optional */
81 struct interrupt interrupts[SP_MAX_INTERRUPTS_PER_DEVICE];
Madhukar Pappireddy5fc8be12021-08-03 11:42:53 -050082 /** Count of physical interrupts - optional */
83 uint8_t interrupt_count;
Manish Pandeye68e7932020-04-23 15:29:28 +010084 /** SMMU ID - optional */
85 uint32_t smmu_id;
Madhukar Pappireddy54680c72020-10-23 15:02:38 -050086 /** Count of Stream IDs assigned to device - optional */
87 uint8_t stream_count;
Manish Pandeye68e7932020-04-23 15:29:28 +010088 /** List of Stream IDs assigned to device - optional */
89 uint32_t stream_ids[SP_MAX_STREAMS_PER_DEVICE];
90 /** Exclusive access to an endpoint - optional */
91 bool exclusive_access;
92 /** Name of Device region - optional */
93 struct string name;
94};
95
Manish Pandey6542f5c2020-04-27 14:37:46 +010096/**
Manish Pandeyfa1f2912020-05-05 12:57:01 +010097 * RX/TX buffer, reference to memory-region entries that describe RX/TX
98 * buffers in partition manifest.
99 */
100struct rx_tx {
101 bool available;
102 uint32_t rx_phandle;
103 uint32_t tx_phandle;
104 struct memory_region *rx_buffer;
105 struct memory_region *tx_buffer;
106};
107
108/**
Olivier Deprezc13a8692022-04-08 17:47:14 +0200109 * Partition manifest as described in FF-A v1.0 spec section 3.1
Olivier Deprez62d99e32020-01-09 15:58:07 +0100110 */
Raghu Krishnamurthy8c250a92021-07-02 12:16:42 -0700111struct partition_manifest {
Olivier Deprezc13a8692022-04-08 17:47:14 +0200112 /** FF-A expected version - mandatory */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100113 uint32_t ffa_version;
114 /** UUID - mandatory */
Fuad Tabbae4efcc32020-07-16 15:37:27 +0100115 struct ffa_uuid uuid;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100116 /** Partition id - optional */
117 ffa_vm_id_t id;
118 /** Aux ids for mem transactions - optional */
119 ffa_vm_id_t aux_id;
120
121 /* NOTE: optional name field maps to VM debug_name field */
122
123 /** mandatory */
124 ffa_vcpu_count_t execution_ctx_count;
125 /** EL1 or secure EL1, secure EL0 - mandatory */
126 enum run_time_el run_time_el;
127 /** AArch32 / AArch64 - mandatory */
128 enum execution_state execution_state;
129 /** optional */
130 uintpaddr_t load_addr;
131 /** optional */
132 size_t ep_offset;
J-Alves4369bd92020-08-07 16:35:36 +0100133 /** 4/16/64KB - optional */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100134 enum xlat_granule xlat_granule;
J-Alves35315782022-01-25 17:58:32 +0000135 /** Register id from w0/x0-w3/x3 - optional. */
136 uint32_t gp_register_num;
137 /**
138 * Flags the presence of the optional IMPDEF node to define Partition's
139 * Boot Info.
140 */
141 bool boot_info;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100142 /** optional */
143 uint16_t boot_order;
144
145 /** Optional RX/TX buffers */
Manish Pandeyfa1f2912020-05-05 12:57:01 +0100146 struct rx_tx rxtx;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100147
148 /** mandatory - direct/indirect msg or both */
Maksims Svecovsb596eab2021-04-27 00:52:27 +0100149 uint8_t messaging_method;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100150 /** optional */
Maksims Svecovs9ddf86a2021-05-06 17:17:21 +0100151 bool managed_exit;
J-Alvesa4730db2021-11-02 10:31:01 +0000152 /** optional - receipt of notifications. */
153 bool notification_support;
Maksims Svecovs9ddf86a2021-05-06 17:17:21 +0100154 /** optional */
Olivier Deprez62d99e32020-01-09 15:58:07 +0100155 bool has_primary_scheduler;
156 /** optional - preemptible / run to completion */
157 uint8_t runtime_model;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100158 /** optional - tuples SEPID/SMMUID/streamId */
159 uint32_t stream_ep_ids[1];
Manish Pandey6542f5c2020-04-27 14:37:46 +0100160
161 /** Memory regions */
Manish Pandey2145c212020-05-01 16:04:22 +0100162 uint8_t mem_region_count;
Manish Pandey6542f5c2020-04-27 14:37:46 +0100163 struct memory_region mem_regions[SP_MAX_MEMORY_REGIONS];
Manish Pandeye68e7932020-04-23 15:29:28 +0100164 /** Device regions */
Manish Pandey2145c212020-05-01 16:04:22 +0100165 uint8_t dev_region_count;
Manish Pandeye68e7932020-04-23 15:29:28 +0100166 struct device_region dev_regions[SP_MAX_DEVICE_REGIONS];
Olivier Deprez62d99e32020-01-09 15:58:07 +0100167};
168
169/**
David Brazdil7a462ec2019-08-15 12:27:47 +0100170 * Holds information about one of the VMs described in the manifest.
171 */
172struct manifest_vm {
173 /* Properties defined for both primary and secondary VMs. */
David Brazdil136f2942019-09-23 14:11:03 +0100174 struct string debug_name;
175 struct string kernel_filename;
Andrew Scullae9962e2019-10-03 16:51:16 +0100176 struct smc_whitelist smc_whitelist;
Olivier Deprez62d99e32020-01-09 15:58:07 +0100177 bool is_ffa_partition;
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -0700178 bool is_hyp_loaded;
Raghu Krishnamurthy8c250a92021-07-02 12:16:42 -0700179 struct partition_manifest partition;
David Brazdil7a462ec2019-08-15 12:27:47 +0100180
David Brazdile6f83222019-09-23 14:47:37 +0100181 union {
182 /* Properties specific to the primary VM. */
183 struct {
David Brazdil080ee312020-02-25 15:30:30 -0800184 uint64_t boot_address;
David Brazdile6f83222019-09-23 14:47:37 +0100185 struct string ramdisk_filename;
186 } primary;
187 /* Properties specific to secondary VMs. */
188 struct {
189 uint64_t mem_size;
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100190 ffa_vcpu_count_t vcpu_count;
Fuad Tabba50469e02020-06-30 15:14:28 +0100191 struct string fdt_filename;
David Brazdile6f83222019-09-23 14:47:37 +0100192 } secondary;
193 };
David Brazdil7a462ec2019-08-15 12:27:47 +0100194};
195
196/**
197 * Hafnium manifest parsed from FDT.
198 */
199struct manifest {
Andrew Walbranb5ab43c2020-04-30 11:32:54 +0100200 bool ffa_tee_enabled;
201 ffa_vm_count_t vm_count;
David Brazdil7a462ec2019-08-15 12:27:47 +0100202 struct manifest_vm vm[MAX_VMS];
203};
204
205enum manifest_return_code {
206 MANIFEST_SUCCESS = 0,
David Brazdila2358d42020-01-27 18:51:38 +0000207 MANIFEST_ERROR_FILE_SIZE,
Olivier Deprez62d99e32020-01-09 15:58:07 +0100208 MANIFEST_ERROR_MALFORMED_DTB,
David Brazdila2358d42020-01-27 18:51:38 +0000209 MANIFEST_ERROR_NO_ROOT_NODE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100210 MANIFEST_ERROR_NO_HYPERVISOR_FDT_NODE,
David Brazdil74e9c3b2019-08-28 11:09:08 +0100211 MANIFEST_ERROR_NOT_COMPATIBLE,
David Brazdil7a462ec2019-08-15 12:27:47 +0100212 MANIFEST_ERROR_RESERVED_VM_ID,
213 MANIFEST_ERROR_NO_PRIMARY_VM,
214 MANIFEST_ERROR_TOO_MANY_VMS,
215 MANIFEST_ERROR_PROPERTY_NOT_FOUND,
216 MANIFEST_ERROR_MALFORMED_STRING,
David Brazdil0dbb41f2019-09-09 18:03:35 +0100217 MANIFEST_ERROR_STRING_TOO_LONG,
David Brazdil7a462ec2019-08-15 12:27:47 +0100218 MANIFEST_ERROR_MALFORMED_INTEGER,
219 MANIFEST_ERROR_INTEGER_OVERFLOW,
Andrew Scullae9962e2019-10-03 16:51:16 +0100220 MANIFEST_ERROR_MALFORMED_INTEGER_LIST,
Andrew Scullb2c3a242019-11-04 13:52:36 +0000221 MANIFEST_ERROR_MALFORMED_BOOLEAN,
J-Alves35315782022-01-25 17:58:32 +0000222 MANIFEST_ERROR_ARGUMENTS_LIST_EMPTY,
Manish Pandey6542f5c2020-04-27 14:37:46 +0100223 MANIFEST_ERROR_MEMORY_REGION_NODE_EMPTY,
Manish Pandeye68e7932020-04-23 15:29:28 +0100224 MANIFEST_ERROR_DEVICE_REGION_NODE_EMPTY,
Manish Pandeyf06c9072020-09-29 15:41:58 +0100225 MANIFEST_ERROR_RXTX_SIZE_MISMATCH,
Raghu Krishnamurthy384693c2021-10-11 13:56:24 -0700226 MANIFEST_ERROR_INVALID_MEM_PERM,
David Brazdil7a462ec2019-08-15 12:27:47 +0100227};
228
Olivier Deprez62d99e32020-01-09 15:58:07 +0100229enum manifest_return_code manifest_init(struct mm_stage1_locked stage1_locked,
230 struct manifest *manifest,
231 struct memiter *manifest_fdt,
232 struct mpool *ppool);
233
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -0700234enum manifest_return_code parse_ffa_manifest(struct fdt *fdt,
J-Alves35315782022-01-25 17:58:32 +0000235 struct manifest_vm *vm,
236 struct fdt_node *boot_info);
237
Raghu Krishnamurthyb49549e2021-07-02 08:27:38 -0700238enum manifest_return_code sanity_check_ffa_manifest(struct manifest_vm *vm);
Olivier Deprez62d99e32020-01-09 15:58:07 +0100239void manifest_dump(struct manifest_vm *vm);
David Brazdil7a462ec2019-08-15 12:27:47 +0100240
241const char *manifest_strerror(enum manifest_return_code ret_code);