xref: /arm-trusted-firmware/include/services/el3_spmc_ffa_memory.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef EL3_SPMC_FFA_MEM_H
8*91f16700Schasinglulu #define EL3_SPMC_FFA_MEM_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <assert.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu /*
13*91f16700Schasinglulu  * Subset of Arm Firmware Framework for Armv8-A
14*91f16700Schasinglulu  * (https://developer.arm.com/docs/den0077/a) needed for shared memory.
15*91f16700Schasinglulu  */
16*91f16700Schasinglulu 
17*91f16700Schasinglulu /**
18*91f16700Schasinglulu  * typedef ffa_endpoint_id16_t - Endpoint ID
19*91f16700Schasinglulu  *
20*91f16700Schasinglulu  * Current implementation only supports VM IDs. FF-A spec also support stream
21*91f16700Schasinglulu  * endpoint ids.
22*91f16700Schasinglulu  */
23*91f16700Schasinglulu typedef uint16_t ffa_endpoint_id16_t;
24*91f16700Schasinglulu 
25*91f16700Schasinglulu /**
26*91f16700Schasinglulu  * struct ffa_cons_mrd - Constituent memory region descriptor
27*91f16700Schasinglulu  * @address:
28*91f16700Schasinglulu  *         Start address of contiguous memory region. Must be 4K page aligned.
29*91f16700Schasinglulu  * @page_count:
30*91f16700Schasinglulu  *         Number of 4K pages in region.
31*91f16700Schasinglulu  * @reserved_12_15:
32*91f16700Schasinglulu  *         Reserve bytes 12-15 to pad struct size to 16 bytes.
33*91f16700Schasinglulu  */
34*91f16700Schasinglulu struct ffa_cons_mrd {
35*91f16700Schasinglulu 	uint64_t address;
36*91f16700Schasinglulu 	uint32_t page_count;
37*91f16700Schasinglulu 	uint32_t reserved_12_15;
38*91f16700Schasinglulu };
39*91f16700Schasinglulu CASSERT(sizeof(struct ffa_cons_mrd) == 16, assert_ffa_cons_mrd_size_mismatch);
40*91f16700Schasinglulu 
41*91f16700Schasinglulu /**
42*91f16700Schasinglulu  * struct ffa_comp_mrd - Composite memory region descriptor
43*91f16700Schasinglulu  * @total_page_count:
44*91f16700Schasinglulu  *         Number of 4k pages in memory region. Must match sum of
45*91f16700Schasinglulu  *         @address_range_array[].page_count.
46*91f16700Schasinglulu  * @address_range_count:
47*91f16700Schasinglulu  *         Number of entries in @address_range_array.
48*91f16700Schasinglulu  * @reserved_8_15:
49*91f16700Schasinglulu  *         Reserve bytes 8-15 to pad struct size to 16 byte alignment and
50*91f16700Schasinglulu  *         make @address_range_array 16 byte aligned.
51*91f16700Schasinglulu  * @address_range_array:
52*91f16700Schasinglulu  *         Array of &struct ffa_cons_mrd entries.
53*91f16700Schasinglulu  */
54*91f16700Schasinglulu struct ffa_comp_mrd {
55*91f16700Schasinglulu 	uint32_t total_page_count;
56*91f16700Schasinglulu 	uint32_t address_range_count;
57*91f16700Schasinglulu 	uint64_t reserved_8_15;
58*91f16700Schasinglulu 	struct ffa_cons_mrd address_range_array[];
59*91f16700Schasinglulu };
60*91f16700Schasinglulu CASSERT(sizeof(struct ffa_comp_mrd) == 16, assert_ffa_comp_mrd_size_mismatch);
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /**
63*91f16700Schasinglulu  * typedef ffa_mem_attr8_t - Memory region attributes v1.0.
64*91f16700Schasinglulu  * typedef ffa_mem_attr16_t - Memory region attributes v1.1.
65*91f16700Schasinglulu  *
66*91f16700Schasinglulu  * * @FFA_MEM_ATTR_NS_BIT:
67*91f16700Schasinglulu  *     Memory security state.
68*91f16700Schasinglulu  * * @FFA_MEM_ATTR_DEVICE_NGNRNE:
69*91f16700Schasinglulu  *     Device-nGnRnE.
70*91f16700Schasinglulu  * * @FFA_MEM_ATTR_DEVICE_NGNRE:
71*91f16700Schasinglulu  *     Device-nGnRE.
72*91f16700Schasinglulu  * * @FFA_MEM_ATTR_DEVICE_NGRE:
73*91f16700Schasinglulu  *     Device-nGRE.
74*91f16700Schasinglulu  * * @FFA_MEM_ATTR_DEVICE_GRE:
75*91f16700Schasinglulu  *     Device-GRE.
76*91f16700Schasinglulu  * * @FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED
77*91f16700Schasinglulu  *     Normal memory. Non-cacheable.
78*91f16700Schasinglulu  * * @FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB
79*91f16700Schasinglulu  *     Normal memory. Write-back cached.
80*91f16700Schasinglulu  * * @FFA_MEM_ATTR_NON_SHAREABLE
81*91f16700Schasinglulu  *     Non-shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*.
82*91f16700Schasinglulu  * * @FFA_MEM_ATTR_OUTER_SHAREABLE
83*91f16700Schasinglulu  *     Outer Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*.
84*91f16700Schasinglulu  * * @FFA_MEM_ATTR_INNER_SHAREABLE
85*91f16700Schasinglulu  *     Inner Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*.
86*91f16700Schasinglulu  */
87*91f16700Schasinglulu typedef uint8_t ffa_mem_attr8_t;
88*91f16700Schasinglulu typedef uint16_t ffa_mem_attr16_t;
89*91f16700Schasinglulu #define FFA_MEM_ATTR_NS_BIT			(0x1U << 6)
90*91f16700Schasinglulu #define FFA_MEM_ATTR_DEVICE_NGNRNE		((1U << 4) | (0x0U << 2))
91*91f16700Schasinglulu #define FFA_MEM_ATTR_DEVICE_NGNRE		((1U << 4) | (0x1U << 2))
92*91f16700Schasinglulu #define FFA_MEM_ATTR_DEVICE_NGRE		((1U << 4) | (0x2U << 2))
93*91f16700Schasinglulu #define FFA_MEM_ATTR_DEVICE_GRE			((1U << 4) | (0x3U << 2))
94*91f16700Schasinglulu #define FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED	((2U << 4) | (0x1U << 2))
95*91f16700Schasinglulu #define FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB	((2U << 4) | (0x3U << 2))
96*91f16700Schasinglulu #define FFA_MEM_ATTR_NON_SHAREABLE		(0x0U << 0)
97*91f16700Schasinglulu #define FFA_MEM_ATTR_OUTER_SHAREABLE		(0x2U << 0)
98*91f16700Schasinglulu #define FFA_MEM_ATTR_INNER_SHAREABLE		(0x3U << 0)
99*91f16700Schasinglulu 
100*91f16700Schasinglulu /**
101*91f16700Schasinglulu  * typedef ffa_mem_perm8_t - Memory access permissions
102*91f16700Schasinglulu  *
103*91f16700Schasinglulu  * * @FFA_MEM_ATTR_RO
104*91f16700Schasinglulu  *     Request or specify read-only mapping.
105*91f16700Schasinglulu  * * @FFA_MEM_ATTR_RW
106*91f16700Schasinglulu  *     Request or allow read-write mapping.
107*91f16700Schasinglulu  * * @FFA_MEM_PERM_NX
108*91f16700Schasinglulu  *     Deny executable mapping.
109*91f16700Schasinglulu  * * @FFA_MEM_PERM_X
110*91f16700Schasinglulu  *     Request executable mapping.
111*91f16700Schasinglulu  */
112*91f16700Schasinglulu typedef uint8_t ffa_mem_perm8_t;
113*91f16700Schasinglulu #define FFA_MEM_PERM_RO		(1U << 0)
114*91f16700Schasinglulu #define FFA_MEM_PERM_RW		(1U << 1)
115*91f16700Schasinglulu #define FFA_MEM_PERM_NX		(1U << 2)
116*91f16700Schasinglulu #define FFA_MEM_PERM_X		(1U << 3)
117*91f16700Schasinglulu 
118*91f16700Schasinglulu /**
119*91f16700Schasinglulu  * typedef ffa_mem_flag8_t - Endpoint memory flags
120*91f16700Schasinglulu  *
121*91f16700Schasinglulu  * * @FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER
122*91f16700Schasinglulu  *     Non-retrieval Borrower. Memory region must not be or was not retrieved on
123*91f16700Schasinglulu  *     behalf of this endpoint.
124*91f16700Schasinglulu  */
125*91f16700Schasinglulu typedef uint8_t ffa_mem_flag8_t;
126*91f16700Schasinglulu #define FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER	(1U << 0)
127*91f16700Schasinglulu 
128*91f16700Schasinglulu /**
129*91f16700Schasinglulu  * typedef ffa_mtd_flag32_t - Memory transaction descriptor flags
130*91f16700Schasinglulu  *
131*91f16700Schasinglulu  * * @FFA_MTD_FLAG_ZERO_MEMORY
132*91f16700Schasinglulu  *     Zero memory after unmapping from sender (must be 0 for share).
133*91f16700Schasinglulu  * * @FFA_MTD_FLAG_TIME_SLICING
134*91f16700Schasinglulu  *     Not supported by this implementation.
135*91f16700Schasinglulu  * * @FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH
136*91f16700Schasinglulu  *     Zero memory after unmapping from borrowers (must be 0 for share).
137*91f16700Schasinglulu  * * @FFA_MTD_FLAG_TYPE_MASK
138*91f16700Schasinglulu  *     Bit-mask to extract memory management transaction type from flags.
139*91f16700Schasinglulu  * * @FFA_MTD_FLAG_TYPE_SHARE_MEMORY
140*91f16700Schasinglulu  *     Share memory transaction flag.
141*91f16700Schasinglulu  *     Used by @SMC_FC_FFA_MEM_RETRIEVE_RESP to indicate that memory came from
142*91f16700Schasinglulu  *     @SMC_FC_FFA_MEM_SHARE and by @SMC_FC_FFA_MEM_RETRIEVE_REQ to specify that
143*91f16700Schasinglulu  *     it must have.
144*91f16700Schasinglulu  * * @FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK
145*91f16700Schasinglulu  *     Not supported by this implementation.
146*91f16700Schasinglulu  */
147*91f16700Schasinglulu typedef uint32_t ffa_mtd_flag32_t;
148*91f16700Schasinglulu #define FFA_MTD_FLAG_ZERO_MEMORY			(1U << 0)
149*91f16700Schasinglulu #define FFA_MTD_FLAG_TIME_SLICING			(1U << 1)
150*91f16700Schasinglulu #define FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH	(1U << 2)
151*91f16700Schasinglulu #define FFA_MTD_FLAG_TYPE_MASK				(3U << 3)
152*91f16700Schasinglulu #define FFA_MTD_FLAG_TYPE_SHARE_MEMORY			(1U << 3)
153*91f16700Schasinglulu #define FFA_MTD_FLAG_TYPE_LEND_MEMORY			(1U << 4)
154*91f16700Schasinglulu #define FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK	(0x1FU << 5)
155*91f16700Schasinglulu 
156*91f16700Schasinglulu /**
157*91f16700Schasinglulu  * struct ffa_mapd - Memory access permissions descriptor
158*91f16700Schasinglulu  * @endpoint_id:
159*91f16700Schasinglulu  *         Endpoint id that @memory_access_permissions and @flags apply to.
160*91f16700Schasinglulu  *         (&typedef ffa_endpoint_id16_t).
161*91f16700Schasinglulu  * @memory_access_permissions:
162*91f16700Schasinglulu  *         FFA_MEM_PERM_* values or'ed together (&typedef ffa_mem_perm8_t).
163*91f16700Schasinglulu  * @flags:
164*91f16700Schasinglulu  *         FFA_MEM_FLAG_* values or'ed together (&typedef ffa_mem_flag8_t).
165*91f16700Schasinglulu  */
166*91f16700Schasinglulu struct ffa_mapd {
167*91f16700Schasinglulu 	ffa_endpoint_id16_t endpoint_id;
168*91f16700Schasinglulu 	ffa_mem_perm8_t memory_access_permissions;
169*91f16700Schasinglulu 	ffa_mem_flag8_t flags;
170*91f16700Schasinglulu };
171*91f16700Schasinglulu CASSERT(sizeof(struct ffa_mapd) == 4, assert_ffa_mapd_size_mismatch);
172*91f16700Schasinglulu 
173*91f16700Schasinglulu /**
174*91f16700Schasinglulu  * struct ffa_emad_v1_0 - Endpoint memory access descriptor.
175*91f16700Schasinglulu  * @mapd:  &struct ffa_mapd.
176*91f16700Schasinglulu  * @comp_mrd_offset:
177*91f16700Schasinglulu  *         Offset of &struct ffa_comp_mrd from start of &struct ffa_mtd_v1_0.
178*91f16700Schasinglulu  * @reserved_8_15:
179*91f16700Schasinglulu  *         Reserved bytes 8-15. Must be 0.
180*91f16700Schasinglulu  */
181*91f16700Schasinglulu struct ffa_emad_v1_0 {
182*91f16700Schasinglulu 	struct ffa_mapd mapd;
183*91f16700Schasinglulu 	uint32_t comp_mrd_offset;
184*91f16700Schasinglulu 	uint64_t reserved_8_15;
185*91f16700Schasinglulu };
186*91f16700Schasinglulu CASSERT(sizeof(struct ffa_emad_v1_0) == 16, assert_ffa_emad_v1_0_size_mismatch);
187*91f16700Schasinglulu 
188*91f16700Schasinglulu /**
189*91f16700Schasinglulu  * struct ffa_mtd_v1_0 - Memory transaction descriptor.
190*91f16700Schasinglulu  * @sender_id:
191*91f16700Schasinglulu  *         Sender endpoint id.
192*91f16700Schasinglulu  * @memory_region_attributes:
193*91f16700Schasinglulu  *         FFA_MEM_ATTR_* values or'ed together (&typedef ffa_mem_attr8_t).
194*91f16700Schasinglulu  * @reserved_3:
195*91f16700Schasinglulu  *         Reserved bytes 3. Must be 0.
196*91f16700Schasinglulu  * @flags:
197*91f16700Schasinglulu  *         FFA_MTD_FLAG_* values or'ed together (&typedef ffa_mtd_flag32_t).
198*91f16700Schasinglulu  * @handle:
199*91f16700Schasinglulu  *         Id of shared memory object. Must be 0 for MEM_SHARE or MEM_LEND.
200*91f16700Schasinglulu  * @tag:   Client allocated tag. Must match original value.
201*91f16700Schasinglulu  * @reserved_24_27:
202*91f16700Schasinglulu  *         Reserved bytes 24-27. Must be 0.
203*91f16700Schasinglulu  * @emad_count:
204*91f16700Schasinglulu  *         Number of entries in @emad.
205*91f16700Schasinglulu  * @emad:
206*91f16700Schasinglulu  *         Endpoint memory access descriptor array (see @struct ffa_emad_v1_0).
207*91f16700Schasinglulu  */
208*91f16700Schasinglulu struct ffa_mtd_v1_0 {
209*91f16700Schasinglulu 	ffa_endpoint_id16_t sender_id;
210*91f16700Schasinglulu 	ffa_mem_attr8_t memory_region_attributes;
211*91f16700Schasinglulu 	uint8_t reserved_3;
212*91f16700Schasinglulu 	ffa_mtd_flag32_t flags;
213*91f16700Schasinglulu 	uint64_t handle;
214*91f16700Schasinglulu 	uint64_t tag;
215*91f16700Schasinglulu 	uint32_t reserved_24_27;
216*91f16700Schasinglulu 	uint32_t emad_count;
217*91f16700Schasinglulu 	struct ffa_emad_v1_0 emad[];
218*91f16700Schasinglulu };
219*91f16700Schasinglulu CASSERT(sizeof(struct ffa_mtd_v1_0) == 32, assert_ffa_mtd_size_v1_0_mismatch);
220*91f16700Schasinglulu CASSERT(offsetof(struct ffa_mtd_v1_0, emad) == 32,
221*91f16700Schasinglulu 	assert_ffa_mtd_size_v1_0_mismatch_2);
222*91f16700Schasinglulu 
223*91f16700Schasinglulu /**
224*91f16700Schasinglulu  * struct ffa_mtd - Memory transaction descriptor for FF-A v1.1.
225*91f16700Schasinglulu  * @sender_id:
226*91f16700Schasinglulu  *         Sender endpoint id.
227*91f16700Schasinglulu  * @memory_region_attributes:
228*91f16700Schasinglulu  *         FFA_MEM_ATTR_* values or'ed together (&typedef ffa_mem_attr16_t).
229*91f16700Schasinglulu  * @flags:
230*91f16700Schasinglulu  *         FFA_MTD_FLAG_* values or'ed together (&typedef ffa_mtd_flag32_t).
231*91f16700Schasinglulu  * @handle:
232*91f16700Schasinglulu  *         Id of shared memory object. Must be 0 for MEM_SHARE or MEM_LEND.
233*91f16700Schasinglulu  * @tag:   Client allocated tag. Must match original value.
234*91f16700Schasinglulu  * @emad_size:
235*91f16700Schasinglulu  *         Size of the emad descriptor.
236*91f16700Schasinglulu  * @emad_count:
237*91f16700Schasinglulu  *         Number of entries in the emad array.
238*91f16700Schasinglulu  * @emad_offset:
239*91f16700Schasinglulu  *         Offset from the beginning of the descriptor to the location of the
240*91f16700Schasinglulu  *         memory access descriptor array (see @struct ffa_emad_v1_0).
241*91f16700Schasinglulu  * @reserved_36_39:
242*91f16700Schasinglulu  *         Reserved bytes 36-39. Must be 0.
243*91f16700Schasinglulu  * @reserved_40_47:
244*91f16700Schasinglulu  *         Reserved bytes 44-47. Must be 0.
245*91f16700Schasinglulu  */
246*91f16700Schasinglulu struct ffa_mtd {
247*91f16700Schasinglulu 	ffa_endpoint_id16_t sender_id;
248*91f16700Schasinglulu 	ffa_mem_attr16_t memory_region_attributes;
249*91f16700Schasinglulu 	ffa_mtd_flag32_t flags;
250*91f16700Schasinglulu 	uint64_t handle;
251*91f16700Schasinglulu 	uint64_t tag;
252*91f16700Schasinglulu 	uint32_t emad_size;
253*91f16700Schasinglulu 	uint32_t emad_count;
254*91f16700Schasinglulu 	uint32_t emad_offset;
255*91f16700Schasinglulu 	uint32_t reserved_36_39;
256*91f16700Schasinglulu 	uint64_t reserved_40_47;
257*91f16700Schasinglulu };
258*91f16700Schasinglulu CASSERT(sizeof(struct ffa_mtd) == 48, assert_ffa_mtd_size_mismatch);
259*91f16700Schasinglulu CASSERT(offsetof(struct ffa_mtd, emad_count) ==
260*91f16700Schasinglulu 	offsetof(struct ffa_mtd_v1_0, emad_count),
261*91f16700Schasinglulu 	assert_ffa_mtd_emad_count_offset_mismatch);
262*91f16700Schasinglulu 
263*91f16700Schasinglulu #endif /* EL3_SPMC_FFA_MEM_H */
264