1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* 3 * Copyright (c) 2020, Linaro Limited 4 * Copyright (c) 2018-2022, Arm Limited. All rights reserved. 5 */ 6 7 #ifndef __FFA_H 8 #define __FFA_H 9 10 /* This is based on the FF-A 1.0 EAC specification */ 11 12 #include <smccc.h> 13 #include <stdint.h> 14 #include <util.h> 15 16 /* Error codes */ 17 #define FFA_OK 0 18 #define FFA_NOT_SUPPORTED -1 19 #define FFA_INVALID_PARAMETERS -2 20 #define FFA_NO_MEMORY -3 21 #define FFA_BUSY -4 22 #define FFA_INTERRUPTED -5 23 #define FFA_DENIED -6 24 #define FFA_RETRY -7 25 #define FFA_ABORTED -8 26 27 /* FFA_VERSION helpers */ 28 #define FFA_VERSION_MAJOR U(1) 29 #define FFA_VERSION_MAJOR_SHIFT U(16) 30 #define FFA_VERSION_MAJOR_MASK U(0x7FFF) 31 #define FFA_VERSION_MINOR U(1) 32 #define FFA_VERSION_MINOR_SHIFT U(0) 33 #define FFA_VERSION_MINOR_MASK U(0xFFFF) 34 #define MAKE_FFA_VERSION(major, minor) \ 35 ((((major) & FFA_VERSION_MAJOR_MASK) << FFA_VERSION_MAJOR_SHIFT) | \ 36 ((minor) & FFA_VERSION_MINOR_MASK)) 37 38 #define FFA_VERSION_1_0 MAKE_FFA_VERSION(1, 0) 39 #define FFA_VERSION_1_1 MAKE_FFA_VERSION(1, 1) 40 41 /* Function IDs */ 42 #define FFA_ERROR U(0x84000060) 43 #define FFA_SUCCESS_32 U(0x84000061) 44 #define FFA_SUCCESS_64 U(0xC4000061) 45 #define FFA_INTERRUPT U(0x84000062) 46 #define FFA_VERSION U(0x84000063) 47 #define FFA_FEATURES U(0x84000064) 48 #define FFA_RX_RELEASE U(0x84000065) 49 #define FFA_RXTX_MAP_32 U(0x84000066) 50 #define FFA_RXTX_MAP_64 U(0xC4000066) 51 #define FFA_RXTX_UNMAP U(0x84000067) 52 #define FFA_PARTITION_INFO_GET U(0x84000068) 53 #define FFA_ID_GET U(0x84000069) 54 #define FFA_SPM_ID_GET U(0x84000085) 55 #define FFA_MSG_WAIT U(0x8400006B) 56 #define FFA_MSG_YIELD U(0x8400006C) 57 #define FFA_MSG_RUN U(0x8400006D) 58 #define FFA_MSG_SEND2 U(0x84000086) 59 #define FFA_MSG_SEND U(0x8400006E) 60 #define FFA_MSG_SEND_DIRECT_REQ_32 U(0x8400006F) 61 #define FFA_MSG_SEND_DIRECT_REQ_64 U(0xC400006F) 62 #define FFA_MSG_SEND_DIRECT_RESP_32 U(0x84000070) 63 #define FFA_MSG_SEND_DIRECT_RESP_64 U(0xC4000070) 64 #define FFA_MSG_POLL U(0x8400006A) 65 #define FFA_MEM_DONATE_32 U(0x84000071) 66 #define FFA_MEM_DONATE_64 U(0xC4000071) 67 #define FFA_MEM_LEND_32 U(0x84000072) 68 #define FFA_MEM_LEND_64 U(0xC4000072) 69 #define FFA_MEM_SHARE_32 U(0x84000073) 70 #define FFA_MEM_SHARE_64 U(0xC4000073) 71 #define FFA_MEM_RETRIEVE_REQ_32 U(0x84000074) 72 #define FFA_MEM_RETRIEVE_REQ_64 U(0xC4000074) 73 #define FFA_MEM_RETRIEVE_RESP U(0x84000075) 74 #define FFA_MEM_RELINQUISH U(0x84000076) 75 #define FFA_MEM_RECLAIM U(0x84000077) 76 #define FFA_MEM_FRAG_RX U(0x8400007A) 77 #define FFA_MEM_FRAG_TX U(0x8400007B) 78 #define FFA_NOTIFICATION_BITMAP_CREATE U(0x8400007D) 79 #define FFA_NOTIFICATION_BITMAP_DESTROY U(0x8400007E) 80 #define FFA_NOTIFICATION_BIND U(0x8400007F) 81 #define FFA_NOTIFICATION_UNBIND U(0x84000080) 82 #define FFA_NOTIFICATION_SET U(0x84000081) 83 #define FFA_NOTIFICATION_GET U(0x84000082) 84 #define FFA_NOTIFICATION_INFO_GET_32 U(0x84000083) 85 #define FFA_NOTIFICATION_INFO_GET_64 U(0xC4000083) 86 #define FFA_SECONDARY_EP_REGISTER_64 U(0xC4000087) 87 #define FFA_MEM_PERM_GET_32 U(0x84000088) 88 #define FFA_MEM_PERM_GET_64 U(0xC4000088) 89 #define FFA_MEM_PERM_SET_32 U(0x84000089) 90 #define FFA_MEM_PERM_SET_64 U(0xC4000089) 91 92 #define FFA_FEATURE_NOTIF_PEND_INTR U(0x1) 93 #define FFA_FEATURE_SCHEDULE_RECV_INTR U(0x2) 94 #define FFA_FEATURE_MANAGED_EXIT_INTR U(0x3) 95 96 /* Special value for traffic targeted to the Hypervisor or SPM */ 97 #define FFA_TARGET_INFO_MBZ U(0x0) 98 99 #define FFA_MSG_FLAG_FRAMEWORK BIT(31) 100 #define FFA_MSG_TYPE_MASK GENMASK_32(7, 0) 101 #define FFA_MSG_PSCI U(0x0) 102 #define FFA_MSG_SEND_VM_CREATED U(0x4) 103 #define FFA_MSG_RESP_VM_CREATED U(0x5) 104 #define FFA_MSG_SEND_VM_DESTROYED U(0x6) 105 #define FFA_MSG_RESP_VM_DESTROYED U(0x7) 106 #define FFA_MSG_VERSION_REQ U(0x8) 107 #define FFA_MSG_VERSION_RESP U(0x9) 108 109 /* 110 * Flag used as parameter to FFA_PARTITION_INFO_GET to return partition 111 * count only. 112 */ 113 #define FFA_PARTITION_INFO_GET_COUNT_FLAG BIT(0) 114 115 /* Memory attributes: Normal memory, Write-Back cacheable, Inner shareable */ 116 #define FFA_NORMAL_MEM_REG_ATTR U(0x2f) 117 118 /* Memory access permissions: Read-write */ 119 #define FFA_MEM_ACC_RW BIT(1) 120 121 /* Memory access permissions: executable */ 122 #define FFA_MEM_ACC_EXE BIT(3) 123 124 /* Memory access permissions mask */ 125 #define FFA_MEM_ACC_MASK 0xf 126 127 /* Clear memory before mapping in receiver */ 128 #define FFA_MEMORY_REGION_FLAG_CLEAR BIT(0) 129 /* Relayer may time slice this operation */ 130 #define FFA_MEMORY_REGION_FLAG_TIME_SLICE BIT(1) 131 /* Clear memory after receiver relinquishes it */ 132 #define FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH BIT(2) 133 134 /* Share memory transaction */ 135 #define FFA_MEMORY_REGION_TRANSACTION_TYPE_SHARE SHIFT_U32(1, 3) 136 /* Relayer must choose the alignment boundary */ 137 #define FFA_MEMORY_REGION_FLAG_ANY_ALIGNMENT 0 138 139 #define FFA_MEM_PERM_DATA_PERM GENMASK_32(1, 0) 140 #define FFA_MEM_PERM_RW U(0x1) 141 #define FFA_MEM_PERM_RO U(0x3) 142 143 #define FFA_MEM_PERM_INSTRUCTION_PERM BIT(2) 144 #define FFA_MEM_PERM_NX BIT(2) 145 #define FFA_MEM_PERM_X U(0) 146 147 #define FFA_MEM_PERM_RESERVED GENMASK_32(31, 3) 148 149 /* Special value for MBZ parameters */ 150 #define FFA_PARAM_MBZ U(0x0) 151 152 /* 153 * Flags used for the FFA_PARTITION_INFO_GET return message: 154 * BIT(0): Supports receipt of direct requests 155 * BIT(1): Can send direct requests 156 * BIT(2): Can send and receive indirect messages 157 * BIT(3): Supports receipt of notifications 158 * BIT(4-5): Partition ID is a PE endpoint ID 159 */ 160 #define FFA_PART_PROP_DIRECT_REQ_RECV BIT(0) 161 #define FFA_PART_PROP_DIRECT_REQ_SEND BIT(1) 162 #define FFA_PART_PROP_INDIRECT_MSGS BIT(2) 163 #define FFA_PART_PROP_RECV_NOTIF BIT(3) 164 #define FFA_PART_PROP_IS_PE_ID SHIFT_U32(0, 4) 165 #define FFA_PART_PROP_IS_SEPID_INDEP SHIFT_U32(1, 4) 166 #define FFA_PART_PROP_IS_SEPID_DEP SHIFT_U32(2, 4) 167 #define FFA_PART_PROP_IS_AUX_ID SHIFT_U32(3, 4) 168 #define FFA_PART_PROP_NOTIF_CREATED BIT(6) 169 #define FFA_PART_PROP_NOTIF_DESTROYED BIT(7) 170 #define FFA_PART_PROP_AARCH64_STATE BIT(8) 171 172 #define FFA_MEMORY_HANDLE_HYPERVISOR_BIT BIT64(63) 173 #define FFA_MEMORY_HANDLE_SECURE_BIT BIT64(45) 174 #define FFA_MEMORY_HANDLE_NON_SECURE_BIT BIT64(44) 175 /* 176 * Codes the OP-TEE partition/guest ID into a cookie in order to know which 177 * partition to activate when reclaiming the shared memory. This field is 0 178 * unless CFG_NS_VIRTUALIZATION is enabled. 179 */ 180 #define FFA_MEMORY_HANDLE_PRTN_SHIFT 16 181 #define FFA_MEMORY_HANDLE_PRTN_MASK GENMASK_32(16, 0) 182 183 184 #define FFA_BOOT_INFO_NAME_LEN U(16) 185 186 /* Boot Info descriptors type */ 187 #define FFA_BOOT_INFO_TYPE_IMDEF BIT(7) 188 #define FFA_BOOT_INFO_TYPE_ID_MASK GENMASK_32(6, 0) 189 #define FFA_BOOT_INFO_TYPE_ID_FDT U(0) 190 #define FFA_BOOT_INFO_TYPE_ID_HOB U(1) 191 192 /* Boot Info descriptors flags */ 193 #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_MASK GENMASK_32(1, 0) 194 #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_STRING U(0) 195 #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_UUID U(1) 196 197 /** Bits [3:2] encode the format of the content field in ffa_boot_info_desc. */ 198 #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_SHIFT U(2) 199 #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_MASK GENMASK_32(3, 2) 200 #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_VALUE U(1) 201 #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_ADDR U(0) 202 203 #define FFA_BOOT_INFO_SIGNATURE U(0xFFA) 204 #define FFA_BOOT_INFO_VERSION U(0x10001) 205 206 #ifndef __ASSEMBLER__ 207 /* Constituent memory region descriptor */ 208 struct ffa_address_range { 209 uint64_t address; 210 uint32_t page_count; 211 uint32_t reserved; 212 }; 213 214 /* Composite memory region descriptor */ 215 struct ffa_mem_region { 216 uint32_t total_page_count; 217 uint32_t address_range_count; 218 uint64_t reserved; 219 struct ffa_address_range address_range_array[]; 220 }; 221 222 /* Memory access permissions descriptor */ 223 struct ffa_mem_access_perm { 224 uint16_t endpoint_id; 225 uint8_t perm; 226 uint8_t flags; 227 }; 228 229 /* Endpoint memory access descriptor */ 230 struct ffa_mem_access { 231 struct ffa_mem_access_perm access_perm; 232 uint32_t region_offs; 233 uint64_t reserved; 234 }; 235 236 /* Lend, donate or share memory transaction descriptor */ 237 struct ffa_mem_transaction_1_0 { 238 uint16_t sender_id; 239 uint8_t mem_reg_attr; 240 uint8_t reserved0; 241 uint32_t flags; 242 uint64_t global_handle; 243 uint64_t tag; 244 uint32_t reserved1; 245 uint32_t mem_access_count; 246 struct ffa_mem_access mem_access_array[]; 247 }; 248 249 struct ffa_mem_transaction_1_1 { 250 uint16_t sender_id; 251 uint16_t mem_reg_attr; 252 uint32_t flags; 253 uint64_t global_handle; 254 uint64_t tag; 255 uint32_t mem_access_size; 256 uint32_t mem_access_count; 257 uint32_t mem_access_offs; 258 uint8_t reserved[12]; 259 }; 260 261 /* 262 * The parts needed from struct ffa_mem_transaction_1_0 or struct 263 * ffa_mem_transaction_1_1, used to provide an abstraction of difference in 264 * data structures between version 1.0 and 1.1. This is just an internal 265 * interface and can be changed without changing any ABI. 266 */ 267 struct ffa_mem_transaction_x { 268 uint16_t sender_id; 269 uint8_t mem_reg_attr; 270 uint8_t flags; 271 uint8_t mem_access_size; 272 uint8_t mem_access_count; 273 uint16_t mem_access_offs; 274 uint64_t global_handle; 275 uint64_t tag; 276 }; 277 278 #define FFA_UUID_SIZE 16 279 280 /* Partition information descriptor */ 281 struct ffa_partition_info_x { 282 uint16_t id; 283 uint16_t execution_context; 284 uint32_t partition_properties; 285 /* 286 * The uuid field is absent in FF-A 1.0, and an array of 16 287 * (FFA_UUID_SIZE) from FF-A 1.1 288 */ 289 uint8_t uuid[]; 290 }; 291 292 /* Descriptor to relinquish a memory region (FFA_MEM_RELINQUISH) */ 293 struct ffa_mem_relinquish { 294 uint64_t handle; 295 uint32_t flags; 296 uint32_t endpoint_count; 297 uint16_t endpoint_id_array[]; 298 }; 299 300 /* FF-A v1.1 boot information descriptor */ 301 struct ffa_boot_info { 302 char name[FFA_BOOT_INFO_NAME_LEN]; 303 uint8_t type; 304 uint8_t reserved; 305 uint16_t flags; 306 uint32_t size; 307 uint64_t contents; 308 }; 309 310 /* FF-A v1.1 boot information header */ 311 struct ffa_boot_info_header { 312 uint32_t signature; 313 uint32_t version; 314 uint32_t blob_size; 315 uint32_t desc_size; 316 uint32_t desc_count; 317 uint32_t desc_offset; 318 uint64_t reserved; 319 }; 320 321 #endif /*__ASSEMBLER__*/ 322 #endif /* __FFA_H */ 323