xref: /optee_os/core/arch/arm/include/ffa.h (revision 003383344c26be3589383acc87c1ebb2860e9317)
1e0e3828aSJens Wiklander /* SPDX-License-Identifier: BSD-3-Clause */
2e0e3828aSJens Wiklander /*
3e0e3828aSJens Wiklander  * Copyright (c) 2020, Linaro Limited
44a88c465SImre Kis  * Copyright (c) 2018-2024, Arm Limited. All rights reserved.
5e0e3828aSJens Wiklander  */
6e0e3828aSJens Wiklander 
7e0e3828aSJens Wiklander #ifndef __FFA_H
8e0e3828aSJens Wiklander #define __FFA_H
9e0e3828aSJens Wiklander 
10e0e3828aSJens Wiklander /* This is based on the FF-A 1.0 EAC specification */
11e0e3828aSJens Wiklander 
12e0e3828aSJens Wiklander #include <smccc.h>
13e0e3828aSJens Wiklander #include <stdint.h>
14438f0055SJelle Sels #include <util.h>
15e0e3828aSJens Wiklander 
16e0e3828aSJens Wiklander /* Error codes */
17ae6b3380SJelle Sels #define FFA_OK			0
18e0e3828aSJens Wiklander #define FFA_NOT_SUPPORTED	-1
19e0e3828aSJens Wiklander #define FFA_INVALID_PARAMETERS	-2
20e0e3828aSJens Wiklander #define FFA_NO_MEMORY		-3
21e0e3828aSJens Wiklander #define FFA_BUSY		-4
22e0e3828aSJens Wiklander #define FFA_INTERRUPTED		-5
23e0e3828aSJens Wiklander #define FFA_DENIED		-6
24e0e3828aSJens Wiklander #define FFA_RETRY		-7
25e0e3828aSJens Wiklander #define FFA_ABORTED		-8
26f6dcf234SJens Wiklander #define FFA_NO_DATA		-9
27e0e3828aSJens Wiklander 
28e0e3828aSJens Wiklander /* FFA_VERSION helpers */
294a6784caSJens Wiklander #define FFA_VERSION_MAJOR_SHIFT		U(16)
30e0e3828aSJens Wiklander #define FFA_VERSION_MAJOR_MASK		U(0x7FFF)
314a6784caSJens Wiklander #define FFA_VERSION_MINOR_SHIFT		U(0)
32e0e3828aSJens Wiklander #define FFA_VERSION_MINOR_MASK		U(0xFFFF)
33e0e3828aSJens Wiklander #define MAKE_FFA_VERSION(major, minor)	\
34e0e3828aSJens Wiklander 	((((major) & FFA_VERSION_MAJOR_MASK) << FFA_VERSION_MAJOR_SHIFT) | \
35e0e3828aSJens Wiklander 	 ((minor) & FFA_VERSION_MINOR_MASK))
36bef959c8SJens Wiklander #define FFA_GET_MAJOR_VERSION(vers)	\
37bef959c8SJens Wiklander 	(((uint32_t)(vers) >> FFA_VERSION_MAJOR_SHIFT) & FFA_VERSION_MAJOR_MASK)
38bef959c8SJens Wiklander #define FFA_GET_MINOR_VERSION(vers)	((uint32_t)(vers) & \
39bef959c8SJens Wiklander 					 FFA_VERSION_MINOR_MASK)
40e0e3828aSJens Wiklander 
41a1c53023SJens Wiklander #define FFA_VERSION_1_0			MAKE_FFA_VERSION(1, 0)
42a1c53023SJens Wiklander #define FFA_VERSION_1_1			MAKE_FFA_VERSION(1, 1)
43750a54aaSJens Wiklander #define FFA_VERSION_1_2			MAKE_FFA_VERSION(1, 2)
44a1c53023SJens Wiklander 
45e0e3828aSJens Wiklander /* Function IDs */
46e0e3828aSJens Wiklander #define FFA_ERROR			U(0x84000060)
47e0e3828aSJens Wiklander #define FFA_SUCCESS_32			U(0x84000061)
48e0e3828aSJens Wiklander #define FFA_SUCCESS_64			U(0xC4000061)
49e0e3828aSJens Wiklander #define FFA_INTERRUPT			U(0x84000062)
50e0e3828aSJens Wiklander #define FFA_VERSION			U(0x84000063)
51e0e3828aSJens Wiklander #define FFA_FEATURES			U(0x84000064)
52e0e3828aSJens Wiklander #define FFA_RX_RELEASE			U(0x84000065)
53750a54aaSJens Wiklander #define FFA_RX_ACQUIRE			U(0x84000084)
54e0e3828aSJens Wiklander #define FFA_RXTX_MAP_32			U(0x84000066)
55e0e3828aSJens Wiklander #define FFA_RXTX_MAP_64			U(0xC4000066)
56e0e3828aSJens Wiklander #define FFA_RXTX_UNMAP			U(0x84000067)
57e0e3828aSJens Wiklander #define FFA_PARTITION_INFO_GET		U(0x84000068)
58e0e3828aSJens Wiklander #define FFA_ID_GET			U(0x84000069)
59a1c53023SJens Wiklander #define FFA_SPM_ID_GET			U(0x84000085)
60e0e3828aSJens Wiklander #define FFA_MSG_WAIT			U(0x8400006B)
61e0e3828aSJens Wiklander #define FFA_MSG_YIELD			U(0x8400006C)
624d028847SImre Kis #define FFA_RUN				U(0x8400006D)
63a1c53023SJens Wiklander #define FFA_MSG_SEND2			U(0x84000086)
64e0e3828aSJens Wiklander #define FFA_MSG_SEND			U(0x8400006E)
65e0e3828aSJens Wiklander #define FFA_MSG_SEND_DIRECT_REQ_32	U(0x8400006F)
66e0e3828aSJens Wiklander #define FFA_MSG_SEND_DIRECT_REQ_64	U(0xC400006F)
67e0e3828aSJens Wiklander #define FFA_MSG_SEND_DIRECT_RESP_32	U(0x84000070)
68e0e3828aSJens Wiklander #define FFA_MSG_SEND_DIRECT_RESP_64	U(0xC4000070)
69750a54aaSJens Wiklander #define FFA_MSG_SEND_DIRECT_REQ2	U(0xC400008D)
70750a54aaSJens Wiklander #define FFA_MSG_SEND_DIRECT_RESP2	U(0xC400008E)
71e0e3828aSJens Wiklander #define FFA_MSG_POLL			U(0x8400006A)
72e0e3828aSJens Wiklander #define FFA_MEM_DONATE_32		U(0x84000071)
73e0e3828aSJens Wiklander #define FFA_MEM_DONATE_64		U(0xC4000071)
74e0e3828aSJens Wiklander #define FFA_MEM_LEND_32			U(0x84000072)
75e0e3828aSJens Wiklander #define FFA_MEM_LEND_64			U(0xC4000072)
76e0e3828aSJens Wiklander #define FFA_MEM_SHARE_32		U(0x84000073)
77e0e3828aSJens Wiklander #define FFA_MEM_SHARE_64		U(0xC4000073)
78e0e3828aSJens Wiklander #define FFA_MEM_RETRIEVE_REQ_32		U(0x84000074)
79e0e3828aSJens Wiklander #define FFA_MEM_RETRIEVE_REQ_64		U(0xC4000074)
80e0e3828aSJens Wiklander #define FFA_MEM_RETRIEVE_RESP		U(0x84000075)
81e0e3828aSJens Wiklander #define FFA_MEM_RELINQUISH		U(0x84000076)
82e0e3828aSJens Wiklander #define FFA_MEM_RECLAIM			U(0x84000077)
83e0e3828aSJens Wiklander #define FFA_MEM_FRAG_RX			U(0x8400007A)
84e0e3828aSJens Wiklander #define FFA_MEM_FRAG_TX			U(0x8400007B)
85af06edb5SJens Wiklander #define FFA_NORMAL_WORLD_RESUME		U(0x8400007C)
86a1c53023SJens Wiklander #define FFA_NOTIFICATION_BITMAP_CREATE	U(0x8400007D)
87a1c53023SJens Wiklander #define FFA_NOTIFICATION_BITMAP_DESTROY	U(0x8400007E)
88a1c53023SJens Wiklander #define FFA_NOTIFICATION_BIND		U(0x8400007F)
89a1c53023SJens Wiklander #define FFA_NOTIFICATION_UNBIND		U(0x84000080)
90a1c53023SJens Wiklander #define FFA_NOTIFICATION_SET		U(0x84000081)
91a1c53023SJens Wiklander #define FFA_NOTIFICATION_GET		U(0x84000082)
92a1c53023SJens Wiklander #define FFA_NOTIFICATION_INFO_GET_32	U(0x84000083)
93a1c53023SJens Wiklander #define FFA_NOTIFICATION_INFO_GET_64	U(0xC4000083)
94635bab26SSudeep Holla #define FFA_SECONDARY_EP_REGISTER_64	U(0xC4000087)
95438f0055SJelle Sels #define FFA_MEM_PERM_GET_32		U(0x84000088)
96438f0055SJelle Sels #define FFA_MEM_PERM_GET_64		U(0xC4000088)
97438f0055SJelle Sels #define FFA_MEM_PERM_SET_32		U(0x84000089)
98438f0055SJelle Sels #define FFA_MEM_PERM_SET_64		U(0xC4000089)
99280b6a32SImre Kis #define FFA_CONSOLE_LOG_32		U(0x8400008A)
100280b6a32SImre Kis #define FFA_CONSOLE_LOG_64		U(0xC400008A)
101750a54aaSJens Wiklander #define FFA_EL3_INTR_HANDLE		U(0x8400008C)
102750a54aaSJens Wiklander #define FFA_PARTITION_INFO_GET_REGS	U(0xC400008B)
103e0e3828aSJens Wiklander 
1042e02a737SJens Wiklander #define FFA_FEATURES_FUNC_ID_MASK	BIT32(31)
1052e02a737SJens Wiklander #define FFA_FEATURES_FEATURE_ID_MASK	GENMASK_32(7, 0)
1062e02a737SJens Wiklander 
107f6dcf234SJens Wiklander /* Flags used in calls to FFA_NOTIFICATION_GET interface  */
108f6dcf234SJens Wiklander #define FFA_NOTIF_FLAG_BITMAP_SP	BIT(0)
109f6dcf234SJens Wiklander #define FFA_NOTIF_FLAG_BITMAP_VM	BIT(1)
110f6dcf234SJens Wiklander #define FFA_NOTIF_FLAG_BITMAP_SPM	BIT(2)
111f6dcf234SJens Wiklander #define FFA_NOTIF_FLAG_BITMAP_HYP	BIT(3)
112f6dcf234SJens Wiklander 
113f6dcf234SJens Wiklander /* Flags used in calls to FFA_NOTIFICATION_INFO_GET interface */
114f6dcf234SJens Wiklander #define FFA_NOTIF_INFO_GET_MORE_FLAG		BIT(0)
115f6dcf234SJens Wiklander #define FFA_NOTIF_INFO_GET_ID_LIST_SHIFT	12
116f6dcf234SJens Wiklander #define FFA_NOTIF_INFO_GET_ID_COUNT_SHIFT	7
117f6dcf234SJens Wiklander #define FFA_NOTIF_INFO_GET_ID_COUNT_MASK	0x1F
118f6dcf234SJens Wiklander 
119f6dcf234SJens Wiklander /* Feature IDs used with FFA_FEATURES */
120a1c53023SJens Wiklander #define FFA_FEATURE_NOTIF_PEND_INTR	U(0x1)
121a1c53023SJens Wiklander #define FFA_FEATURE_SCHEDULE_RECV_INTR	U(0x2)
122a1c53023SJens Wiklander #define FFA_FEATURE_MANAGED_EXIT_INTR	U(0x3)
123a1c53023SJens Wiklander 
124e0e3828aSJens Wiklander /* Special value for traffic targeted to the Hypervisor or SPM */
125e0e3828aSJens Wiklander #define FFA_TARGET_INFO_MBZ		U(0x0)
126e0e3828aSJens Wiklander 
127a1c53023SJens Wiklander #define FFA_MSG_FLAG_FRAMEWORK		BIT(31)
128a1c53023SJens Wiklander #define FFA_MSG_TYPE_MASK		GENMASK_32(7, 0)
129a1c53023SJens Wiklander #define FFA_MSG_PSCI			U(0x0)
130a1c53023SJens Wiklander #define FFA_MSG_SEND_VM_CREATED		U(0x4)
131a1c53023SJens Wiklander #define FFA_MSG_RESP_VM_CREATED		U(0x5)
132a1c53023SJens Wiklander #define FFA_MSG_SEND_VM_DESTROYED	U(0x6)
133a1c53023SJens Wiklander #define FFA_MSG_RESP_VM_DESTROYED	U(0x7)
134a1c53023SJens Wiklander #define FFA_MSG_VERSION_REQ		U(0x8)
135a1c53023SJens Wiklander #define FFA_MSG_VERSION_RESP		U(0x9)
136a1c53023SJens Wiklander 
137a1c53023SJens Wiklander /*
138a1c53023SJens Wiklander  * Flag used as parameter to FFA_PARTITION_INFO_GET to return partition
139a1c53023SJens Wiklander  * count only.
140a1c53023SJens Wiklander  */
141a1c53023SJens Wiklander #define FFA_PARTITION_INFO_GET_COUNT_FLAG	BIT(0)
142a1c53023SJens Wiklander 
143c1bdf4fcSJens Wiklander /* Memory attributes: Normal memory, Write-Back cacheable, Inner shareable */
144c1bdf4fcSJens Wiklander #define FFA_NORMAL_MEM_REG_ATTR		U(0x2f)
145c1bdf4fcSJens Wiklander 
146c1bdf4fcSJens Wiklander /* Memory access permissions: Read-write */
1475c1143a8SJelle Sels #define FFA_MEM_ACC_RW			BIT(1)
1485c1143a8SJelle Sels 
1495c1143a8SJelle Sels /* Memory access permissions: executable */
1505c1143a8SJelle Sels #define FFA_MEM_ACC_EXE			BIT(3)
151c1bdf4fcSJens Wiklander 
152cdd7a3f4SJelle Sels /* Memory access permissions mask */
153cdd7a3f4SJelle Sels #define FFA_MEM_ACC_MASK		0xf
154cdd7a3f4SJelle Sels 
155c1bdf4fcSJens Wiklander /* Clear memory before mapping in receiver */
156c1bdf4fcSJens Wiklander #define FFA_MEMORY_REGION_FLAG_CLEAR		BIT(0)
157c1bdf4fcSJens Wiklander /* Relayer may time slice this operation */
158c1bdf4fcSJens Wiklander #define FFA_MEMORY_REGION_FLAG_TIME_SLICE	BIT(1)
159c1bdf4fcSJens Wiklander /* Clear memory after receiver relinquishes it */
160c1bdf4fcSJens Wiklander #define FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH	BIT(2)
161c1bdf4fcSJens Wiklander 
162c1bdf4fcSJens Wiklander /* Share memory transaction */
163c1bdf4fcSJens Wiklander #define FFA_MEMORY_REGION_TRANSACTION_TYPE_SHARE SHIFT_U32(1, 3)
164*00338334SJens Wiklander /* Lend memory transaction */
165*00338334SJens Wiklander #define FFA_MEMORY_REGION_TRANSACTION_TYPE_LEND SHIFT_U32(2, 3)
166c1bdf4fcSJens Wiklander /* Relayer must choose the alignment boundary */
167c1bdf4fcSJens Wiklander #define FFA_MEMORY_REGION_FLAG_ANY_ALIGNMENT	0
168c1bdf4fcSJens Wiklander 
169438f0055SJelle Sels #define FFA_MEM_PERM_DATA_PERM		GENMASK_32(1, 0)
170438f0055SJelle Sels #define FFA_MEM_PERM_RW			U(0x1)
171438f0055SJelle Sels #define FFA_MEM_PERM_RO			U(0x3)
172438f0055SJelle Sels 
173438f0055SJelle Sels #define FFA_MEM_PERM_INSTRUCTION_PERM	BIT(2)
174438f0055SJelle Sels #define FFA_MEM_PERM_NX			BIT(2)
175438f0055SJelle Sels #define FFA_MEM_PERM_X			U(0)
176438f0055SJelle Sels 
177438f0055SJelle Sels #define FFA_MEM_PERM_RESERVED		GENMASK_32(31, 3)
178438f0055SJelle Sels 
179e0e3828aSJens Wiklander /* Special value for MBZ parameters */
180e0e3828aSJens Wiklander #define FFA_PARAM_MBZ			U(0x0)
181e0e3828aSJens Wiklander 
1823a7bfc34SJelle Sels /*
1834d028847SImre Kis  * The W1 register in FFA_INTERRUPT and FFA_RUN interfaces contains the target
1844d028847SImre Kis  * information. This value has two parts, the SP ID and vCPU ID. The SP ID
1854d028847SImre Kis  * identifies the SP to resume and the vCPU ID identifies the vCPU or execution
1864d028847SImre Kis  * context to resume (FF-A v1.1 section 4.8).
1874d028847SImre Kis  */
1884d028847SImre Kis #define FFA_TARGET_INFO_SET(sp_id, vcpu_id)	(((sp_id) << 16) | (vcpu_id))
1894d028847SImre Kis #define FFA_TARGET_INFO_GET_SP_ID(info)		(((info) >> 16) & 0xffff)
1904d028847SImre Kis #define FFA_TARGET_INFO_GET_VCPU_ID(info)	((info) & 0xffff)
1914d028847SImre Kis 
1924d028847SImre Kis /*
1933a7bfc34SJelle Sels  * Flags used for the FFA_PARTITION_INFO_GET return message:
1943a7bfc34SJelle Sels  * BIT(0): Supports receipt of direct requests
1953a7bfc34SJelle Sels  * BIT(1): Can send direct requests
196a1c53023SJens Wiklander  * BIT(2): Can send and receive indirect messages
197a1c53023SJens Wiklander  * BIT(3): Supports receipt of notifications
1983a7bfc34SJelle Sels  * BIT(4-5): Partition ID is a PE endpoint ID
1993a7bfc34SJelle Sels  */
200a1c53023SJens Wiklander #define FFA_PART_PROP_DIRECT_REQ_RECV	BIT(0)
201a1c53023SJens Wiklander #define FFA_PART_PROP_DIRECT_REQ_SEND	BIT(1)
202a1c53023SJens Wiklander #define FFA_PART_PROP_INDIRECT_MSGS	BIT(2)
203a1c53023SJens Wiklander #define FFA_PART_PROP_RECV_NOTIF	BIT(3)
204a1c53023SJens Wiklander #define FFA_PART_PROP_IS_PE_ID		SHIFT_U32(0, 4)
205a1c53023SJens Wiklander #define FFA_PART_PROP_IS_SEPID_INDEP	SHIFT_U32(1, 4)
206a1c53023SJens Wiklander #define FFA_PART_PROP_IS_SEPID_DEP	SHIFT_U32(2, 4)
207a1c53023SJens Wiklander #define FFA_PART_PROP_IS_AUX_ID		SHIFT_U32(3, 4)
208a1c53023SJens Wiklander #define FFA_PART_PROP_NOTIF_CREATED	BIT(6)
209a1c53023SJens Wiklander #define FFA_PART_PROP_NOTIF_DESTROYED	BIT(7)
210a1c53023SJens Wiklander #define FFA_PART_PROP_AARCH64_STATE	BIT(8)
211a1c53023SJens Wiklander 
212a65dd3a6SJens Wiklander #define FFA_MEMORY_HANDLE_HYPERVISOR_BIT	BIT64(63)
2135c1143a8SJelle Sels #define FFA_MEMORY_HANDLE_SECURE_BIT		BIT64(45)
214a65dd3a6SJens Wiklander #define FFA_MEMORY_HANDLE_NON_SECURE_BIT	BIT64(44)
215a65dd3a6SJens Wiklander /*
216a65dd3a6SJens Wiklander  * Codes the OP-TEE partition/guest ID into a cookie in order to know which
217a65dd3a6SJens Wiklander  * partition to activate when reclaiming the shared memory. This field is 0
218a65dd3a6SJens Wiklander  * unless CFG_NS_VIRTUALIZATION is enabled.
219a65dd3a6SJens Wiklander  */
220a65dd3a6SJens Wiklander #define FFA_MEMORY_HANDLE_PRTN_SHIFT		16
221a65dd3a6SJens Wiklander #define FFA_MEMORY_HANDLE_PRTN_MASK		GENMASK_32(16, 0)
222a65dd3a6SJens Wiklander 
2235c1143a8SJelle Sels 
2245489e94fSJens Wiklander #define FFA_BOOT_INFO_NAME_LEN		U(16)
2255489e94fSJens Wiklander 
2265489e94fSJens Wiklander /* Boot Info descriptors type */
2275489e94fSJens Wiklander #define FFA_BOOT_INFO_TYPE_IMDEF	BIT(7)
2285489e94fSJens Wiklander #define FFA_BOOT_INFO_TYPE_ID_MASK	GENMASK_32(6, 0)
2295489e94fSJens Wiklander #define FFA_BOOT_INFO_TYPE_ID_FDT	U(0)
2305489e94fSJens Wiklander #define FFA_BOOT_INFO_TYPE_ID_HOB	U(1)
2315489e94fSJens Wiklander 
2325489e94fSJens Wiklander /* Boot Info descriptors flags */
2335489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_MASK	GENMASK_32(1, 0)
2345489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_STRING	U(0)
2355489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_NAME_FORMAT_UUID	U(1)
2365489e94fSJens Wiklander 
2375489e94fSJens Wiklander /** Bits [3:2] encode the format of the content field in ffa_boot_info_desc. */
2385489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_SHIFT U(2)
2395489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_MASK	GENMASK_32(3, 2)
2405489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_VALUE	U(1)
2415489e94fSJens Wiklander #define FFA_BOOT_INFO_FLAG_CONTENT_FORMAT_ADDR	U(0)
2425489e94fSJens Wiklander 
2435489e94fSJens Wiklander #define FFA_BOOT_INFO_SIGNATURE		U(0xFFA)
244bef959c8SJens Wiklander #define FFA_BOOT_INFO_VERSION_1_1	U(0x10001)
245bef959c8SJens Wiklander #define FFA_BOOT_INFO_VERSION_1_2	U(0x10002)
2465489e94fSJens Wiklander 
247280b6a32SImre Kis #define FFA_CONSOLE_LOG_CHAR_COUNT_MASK		GENMASK_32(7, 0)
248280b6a32SImre Kis #define FFA_CONSOLE_LOG_32_MAX_MSG_LEN		U(24)
249ddec5d6bSJens Wiklander #define FFA_CONSOLE_LOG_64_V1_1_MAX_MSG_LEN	U(48)
250750a54aaSJens Wiklander #define FFA_CONSOLE_LOG_64_MAX_MSG_LEN		U(128)
251280b6a32SImre Kis 
2524a88c465SImre Kis /* Memory transaction type in FFA_MEM_RETRIEVE_RESP flags */
2534a88c465SImre Kis #define FFA_MEMORY_TRANSACTION_TYPE_MASK	GENMASK_32(4, 3)
2544a88c465SImre Kis #define FFA_MEMORY_TRANSACTION_TYPE_SHARE	SHIFT_U32(1, 3)
2554a88c465SImre Kis #define FFA_MEMORY_TRANSACTION_TYPE_LEND	SHIFT_U32(2, 3)
2564a88c465SImre Kis #define FFA_MEMORY_TRANSACTION_TYPE_DONATE	SHIFT_U32(3, 3)
2574a88c465SImre Kis 
258c1bdf4fcSJens Wiklander #ifndef __ASSEMBLER__
259c1bdf4fcSJens Wiklander /* Constituent memory region descriptor */
260c1bdf4fcSJens Wiklander struct ffa_address_range {
261c1bdf4fcSJens Wiklander 	uint64_t address;
262c1bdf4fcSJens Wiklander 	uint32_t page_count;
263c1bdf4fcSJens Wiklander 	uint32_t reserved;
264c1bdf4fcSJens Wiklander };
265c1bdf4fcSJens Wiklander 
266c1bdf4fcSJens Wiklander /* Composite memory region descriptor */
267c1bdf4fcSJens Wiklander struct ffa_mem_region {
268c1bdf4fcSJens Wiklander 	uint32_t total_page_count;
269c1bdf4fcSJens Wiklander 	uint32_t address_range_count;
270c1bdf4fcSJens Wiklander 	uint64_t reserved;
271c1bdf4fcSJens Wiklander 	struct ffa_address_range address_range_array[];
272c1bdf4fcSJens Wiklander };
273c1bdf4fcSJens Wiklander 
274c1bdf4fcSJens Wiklander /* Memory access permissions descriptor */
275c1bdf4fcSJens Wiklander struct ffa_mem_access_perm {
276c1bdf4fcSJens Wiklander 	uint16_t endpoint_id;
277c1bdf4fcSJens Wiklander 	uint8_t perm;
278c1bdf4fcSJens Wiklander 	uint8_t flags;
279c1bdf4fcSJens Wiklander };
280c1bdf4fcSJens Wiklander 
281c1bdf4fcSJens Wiklander /* Endpoint memory access descriptor */
282c1bdf4fcSJens Wiklander struct ffa_mem_access {
283c1bdf4fcSJens Wiklander 	struct ffa_mem_access_perm access_perm;
284c1bdf4fcSJens Wiklander 	uint32_t region_offs;
285c1bdf4fcSJens Wiklander 	uint64_t reserved;
286c1bdf4fcSJens Wiklander };
287c1bdf4fcSJens Wiklander 
288c1bdf4fcSJens Wiklander /* Lend, donate or share memory transaction descriptor */
289a1c53023SJens Wiklander struct ffa_mem_transaction_1_0 {
290c1bdf4fcSJens Wiklander 	uint16_t sender_id;
291c1bdf4fcSJens Wiklander 	uint8_t mem_reg_attr;
292c1bdf4fcSJens Wiklander 	uint8_t reserved0;
293c1bdf4fcSJens Wiklander 	uint32_t flags;
294c1bdf4fcSJens Wiklander 	uint64_t global_handle;
295c1bdf4fcSJens Wiklander 	uint64_t tag;
296c1bdf4fcSJens Wiklander 	uint32_t reserved1;
297c1bdf4fcSJens Wiklander 	uint32_t mem_access_count;
298c1bdf4fcSJens Wiklander 	struct ffa_mem_access mem_access_array[];
299c1bdf4fcSJens Wiklander };
300c1bdf4fcSJens Wiklander 
301a1c53023SJens Wiklander struct ffa_mem_transaction_1_1 {
302a1c53023SJens Wiklander 	uint16_t sender_id;
303a1c53023SJens Wiklander 	uint16_t mem_reg_attr;
304a1c53023SJens Wiklander 	uint32_t flags;
305a1c53023SJens Wiklander 	uint64_t global_handle;
306a1c53023SJens Wiklander 	uint64_t tag;
307a1c53023SJens Wiklander 	uint32_t mem_access_size;
308a1c53023SJens Wiklander 	uint32_t mem_access_count;
309a1c53023SJens Wiklander 	uint32_t mem_access_offs;
310a1c53023SJens Wiklander 	uint8_t reserved[12];
311a1c53023SJens Wiklander };
312a1c53023SJens Wiklander 
313a1c53023SJens Wiklander /*
314a1c53023SJens Wiklander  * The parts needed from struct ffa_mem_transaction_1_0 or struct
315a1c53023SJens Wiklander  * ffa_mem_transaction_1_1, used to provide an abstraction of difference in
316a1c53023SJens Wiklander  * data structures between version 1.0 and 1.1. This is just an internal
317a1c53023SJens Wiklander  * interface and can be changed without changing any ABI.
318a1c53023SJens Wiklander  */
319a1c53023SJens Wiklander struct ffa_mem_transaction_x {
320a1c53023SJens Wiklander 	uint16_t sender_id;
321a1c53023SJens Wiklander 	uint8_t mem_reg_attr;
322a1c53023SJens Wiklander 	uint8_t flags;
323a1c53023SJens Wiklander 	uint8_t mem_access_size;
324a1c53023SJens Wiklander 	uint8_t mem_access_count;
325a1c53023SJens Wiklander 	uint16_t mem_access_offs;
326a1c53023SJens Wiklander 	uint64_t global_handle;
327a1c53023SJens Wiklander 	uint64_t tag;
328a1c53023SJens Wiklander };
329a1c53023SJens Wiklander 
330a1c53023SJens Wiklander #define FFA_UUID_SIZE		16
331a1c53023SJens Wiklander 
332c1bdf4fcSJens Wiklander /* Partition information descriptor */
333a1c53023SJens Wiklander struct ffa_partition_info_x {
334c1bdf4fcSJens Wiklander 	uint16_t id;
335c1bdf4fcSJens Wiklander 	uint16_t execution_context;
336c1bdf4fcSJens Wiklander 	uint32_t partition_properties;
337a1c53023SJens Wiklander 	/*
338a1c53023SJens Wiklander 	 * The uuid field is absent in FF-A 1.0, and an array of 16
339a1c53023SJens Wiklander 	 * (FFA_UUID_SIZE) from FF-A 1.1
340a1c53023SJens Wiklander 	 */
341a1c53023SJens Wiklander 	uint8_t uuid[];
342c1bdf4fcSJens Wiklander };
343c1bdf4fcSJens Wiklander 
344c1bdf4fcSJens Wiklander /* Descriptor to relinquish a memory region (FFA_MEM_RELINQUISH) */
345c1bdf4fcSJens Wiklander struct ffa_mem_relinquish {
346c1bdf4fcSJens Wiklander 	uint64_t handle;
347c1bdf4fcSJens Wiklander 	uint32_t flags;
348c1bdf4fcSJens Wiklander 	uint32_t endpoint_count;
349c1bdf4fcSJens Wiklander 	uint16_t endpoint_id_array[];
350c1bdf4fcSJens Wiklander };
3515489e94fSJens Wiklander 
3527bb22ad3SBalint Dobszay /* FF-A v1.0 boot information name-value pairs */
3537bb22ad3SBalint Dobszay struct ffa_boot_info_nvp_1_0 {
3547bb22ad3SBalint Dobszay 	uint32_t name[4];
3557bb22ad3SBalint Dobszay 	uint64_t value;
3567bb22ad3SBalint Dobszay 	uint64_t size;
3577bb22ad3SBalint Dobszay };
3587bb22ad3SBalint Dobszay 
3597bb22ad3SBalint Dobszay /* FF-A v1.0 boot information descriptor */
3607bb22ad3SBalint Dobszay struct ffa_boot_info_1_0 {
3617bb22ad3SBalint Dobszay 	uint32_t magic;
3627bb22ad3SBalint Dobszay 	uint32_t count;
3637bb22ad3SBalint Dobszay 	struct ffa_boot_info_nvp_1_0 nvp[];
3647bb22ad3SBalint Dobszay };
3657bb22ad3SBalint Dobszay 
3665489e94fSJens Wiklander /* FF-A v1.1 boot information descriptor */
3677bb22ad3SBalint Dobszay struct ffa_boot_info_1_1 {
3685489e94fSJens Wiklander 	char name[FFA_BOOT_INFO_NAME_LEN];
3695489e94fSJens Wiklander 	uint8_t type;
3705489e94fSJens Wiklander 	uint8_t reserved;
3715489e94fSJens Wiklander 	uint16_t flags;
3725489e94fSJens Wiklander 	uint32_t size;
3735489e94fSJens Wiklander 	uint64_t contents;
3745489e94fSJens Wiklander };
3755489e94fSJens Wiklander 
3765489e94fSJens Wiklander /* FF-A v1.1 boot information header */
3777bb22ad3SBalint Dobszay struct ffa_boot_info_header_1_1 {
3785489e94fSJens Wiklander 	uint32_t signature;
3795489e94fSJens Wiklander 	uint32_t version;
3805489e94fSJens Wiklander 	uint32_t blob_size;
3815489e94fSJens Wiklander 	uint32_t desc_size;
3825489e94fSJens Wiklander 	uint32_t desc_count;
3835489e94fSJens Wiklander 	uint32_t desc_offset;
3845489e94fSJens Wiklander 	uint64_t reserved;
3855489e94fSJens Wiklander };
3865489e94fSJens Wiklander 
387c1bdf4fcSJens Wiklander #endif /*__ASSEMBLER__*/
388e0e3828aSJens Wiklander #endif /* __FFA_H */
389