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