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