xref: /optee_os/core/arch/arm/include/ffa.h (revision c6726b47f89531cb73e00ccd25a34051a11b2fff)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Copyright (c) 2020, Linaro Limited
4  * Copyright (c) 2018-2021, 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 
15 /* Error codes */
16 #define FFA_OK			0
17 #define FFA_NOT_SUPPORTED	-1
18 #define FFA_INVALID_PARAMETERS	-2
19 #define FFA_NO_MEMORY		-3
20 #define FFA_BUSY		-4
21 #define FFA_INTERRUPTED		-5
22 #define FFA_DENIED		-6
23 #define FFA_RETRY		-7
24 #define FFA_ABORTED		-8
25 
26 /* FFA_VERSION helpers */
27 #define FFA_VERSION_MAJOR		U(1)
28 #define FFA_VERSION_MAJOR_SHIFT		U(16)
29 #define FFA_VERSION_MAJOR_MASK		U(0x7FFF)
30 #define FFA_VERSION_MINOR		U(0)
31 #define FFA_VERSION_MINOR_SHIFT		U(0)
32 #define FFA_VERSION_MINOR_MASK		U(0xFFFF)
33 #define MAKE_FFA_VERSION(major, minor)	\
34 	((((major) & FFA_VERSION_MAJOR_MASK) << FFA_VERSION_MAJOR_SHIFT) | \
35 	 ((minor) & FFA_VERSION_MINOR_MASK))
36 
37 /* Function IDs */
38 #define FFA_ERROR			U(0x84000060)
39 #define FFA_SUCCESS_32			U(0x84000061)
40 #define FFA_SUCCESS_64			U(0xC4000061)
41 #define FFA_INTERRUPT			U(0x84000062)
42 #define FFA_VERSION			U(0x84000063)
43 #define FFA_FEATURES			U(0x84000064)
44 #define FFA_RX_RELEASE			U(0x84000065)
45 #define FFA_RXTX_MAP_32			U(0x84000066)
46 #define FFA_RXTX_MAP_64			U(0xC4000066)
47 #define FFA_RXTX_UNMAP			U(0x84000067)
48 #define FFA_PARTITION_INFO_GET		U(0x84000068)
49 #define FFA_ID_GET			U(0x84000069)
50 #define FFA_MSG_WAIT			U(0x8400006B)
51 #define FFA_MSG_YIELD			U(0x8400006C)
52 #define FFA_MSG_RUN			U(0x8400006D)
53 #define FFA_MSG_SEND			U(0x8400006E)
54 #define FFA_MSG_SEND_DIRECT_REQ_32	U(0x8400006F)
55 #define FFA_MSG_SEND_DIRECT_REQ_64	U(0xC400006F)
56 #define FFA_MSG_SEND_DIRECT_RESP_32	U(0x84000070)
57 #define FFA_MSG_SEND_DIRECT_RESP_64	U(0xC4000070)
58 #define FFA_MSG_POLL			U(0x8400006A)
59 #define FFA_MEM_DONATE_32		U(0x84000071)
60 #define FFA_MEM_DONATE_64		U(0xC4000071)
61 #define FFA_MEM_LEND_32			U(0x84000072)
62 #define FFA_MEM_LEND_64			U(0xC4000072)
63 #define FFA_MEM_SHARE_32		U(0x84000073)
64 #define FFA_MEM_SHARE_64		U(0xC4000073)
65 #define FFA_MEM_RETRIEVE_REQ_32		U(0x84000074)
66 #define FFA_MEM_RETRIEVE_REQ_64		U(0xC4000074)
67 #define FFA_MEM_RETRIEVE_RESP		U(0x84000075)
68 #define FFA_MEM_RELINQUISH		U(0x84000076)
69 #define FFA_MEM_RECLAIM			U(0x84000077)
70 #define FFA_MEM_FRAG_RX			U(0x8400007A)
71 #define FFA_MEM_FRAG_TX			U(0x8400007B)
72 #define FFA_SECONDARY_EP_REGISTER_64	U(0xC4000084)
73 
74 /* Special value for traffic targeted to the Hypervisor or SPM */
75 #define FFA_TARGET_INFO_MBZ		U(0x0)
76 
77 /* Memory attributes: Normal memory, Write-Back cacheable, Inner shareable */
78 #define FFA_NORMAL_MEM_REG_ATTR		U(0x2f)
79 
80 /* Memory access permissions: Read-write */
81 #define FFA_MEM_ACC_RW			U(0x2)
82 
83 /* Clear memory before mapping in receiver */
84 #define FFA_MEMORY_REGION_FLAG_CLEAR		BIT(0)
85 /* Relayer may time slice this operation */
86 #define FFA_MEMORY_REGION_FLAG_TIME_SLICE	BIT(1)
87 /* Clear memory after receiver relinquishes it */
88 #define FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH	BIT(2)
89 
90 /* Share memory transaction */
91 #define FFA_MEMORY_REGION_TRANSACTION_TYPE_SHARE SHIFT_U32(1, 3)
92 /* Relayer must choose the alignment boundary */
93 #define FFA_MEMORY_REGION_FLAG_ANY_ALIGNMENT	0
94 
95 /* Special value for MBZ parameters */
96 #define FFA_PARAM_MBZ			U(0x0)
97 
98 /*
99  * Flags used for the FFA_PARTITION_INFO_GET return message:
100  * BIT(0): Supports receipt of direct requests
101  * BIT(1): Can send direct requests
102  * BIT(2): Cannot send and receive indirect messages
103  * BIT(3): Does not support receipt of notifications
104  * BIT(4-5): Partition ID is a PE endpoint ID
105  */
106 #define FFA_PARTITION_DIRECT_REQ_RECV_SUPPORT BIT(0)
107 #define FFA_PARTITION_DIRECT_REQ_SEND_SUPPORT BIT(1)
108 
109 #define FFA_MEMORY_HANDLE_NONE_SECURE_BIT	BIT64(44)
110 #ifndef __ASSEMBLER__
111 /* Constituent memory region descriptor */
112 struct ffa_address_range {
113 	uint64_t address;
114 	uint32_t page_count;
115 	uint32_t reserved;
116 };
117 
118 /* Composite memory region descriptor */
119 struct ffa_mem_region {
120 	uint32_t total_page_count;
121 	uint32_t address_range_count;
122 	uint64_t reserved;
123 	struct ffa_address_range address_range_array[];
124 };
125 
126 /* Memory access permissions descriptor */
127 struct ffa_mem_access_perm {
128 	uint16_t endpoint_id;
129 	uint8_t perm;
130 	uint8_t flags;
131 };
132 
133 /* Endpoint memory access descriptor */
134 struct ffa_mem_access {
135 	struct ffa_mem_access_perm access_perm;
136 	uint32_t region_offs;
137 	uint64_t reserved;
138 };
139 
140 /* Lend, donate or share memory transaction descriptor */
141 struct ffa_mem_transaction {
142 	uint16_t sender_id;
143 	uint8_t mem_reg_attr;
144 	uint8_t reserved0;
145 	uint32_t flags;
146 	uint64_t global_handle;
147 	uint64_t tag;
148 	uint32_t reserved1;
149 	uint32_t mem_access_count;
150 	struct ffa_mem_access mem_access_array[];
151 };
152 
153 /* Partition information descriptor */
154 struct ffa_partition_info {
155 	uint16_t id;
156 	uint16_t execution_context;
157 	uint32_t partition_properties;
158 };
159 
160 /* Descriptor to relinquish a memory region (FFA_MEM_RELINQUISH) */
161 struct ffa_mem_relinquish {
162 	uint64_t handle;
163 	uint32_t flags;
164 	uint32_t endpoint_count;
165 	uint16_t endpoint_id_array[];
166 };
167 #endif /*__ASSEMBLER__*/
168 #endif /* __FFA_H */
169