xref: /arm-trusted-firmware/services/std_svc/spm/el3_spmc/spmc_shared_mem.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef SPMC_SHARED_MEM_H
8*91f16700Schasinglulu #define SPMC_SHARED_MEM_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <services/el3_spmc_ffa_memory.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu /**
13*91f16700Schasinglulu  * struct ffa_mem_relinquish_descriptor - Relinquish request descriptor.
14*91f16700Schasinglulu  * @handle:
15*91f16700Schasinglulu  *         Id of shared memory object to relinquish.
16*91f16700Schasinglulu  * @flags:
17*91f16700Schasinglulu  *         If bit 0 is set clear memory after unmapping from borrower. Must be 0
18*91f16700Schasinglulu  *         for share. Bit[1]: Time slicing. Not supported, must be 0. All other
19*91f16700Schasinglulu  *         bits are reserved 0.
20*91f16700Schasinglulu  * @endpoint_count:
21*91f16700Schasinglulu  *         Number of entries in @endpoint_array.
22*91f16700Schasinglulu  * @endpoint_array:
23*91f16700Schasinglulu  *         Array of endpoint ids.
24*91f16700Schasinglulu  */
25*91f16700Schasinglulu struct ffa_mem_relinquish_descriptor {
26*91f16700Schasinglulu 	uint64_t handle;
27*91f16700Schasinglulu 	uint32_t flags;
28*91f16700Schasinglulu 	uint32_t endpoint_count;
29*91f16700Schasinglulu 	ffa_endpoint_id16_t endpoint_array[];
30*91f16700Schasinglulu };
31*91f16700Schasinglulu CASSERT(sizeof(struct ffa_mem_relinquish_descriptor) == 16,
32*91f16700Schasinglulu 	assert_ffa_mem_relinquish_descriptor_size_mismatch);
33*91f16700Schasinglulu 
34*91f16700Schasinglulu /**
35*91f16700Schasinglulu  * struct spmc_shmem_obj_state - Global state.
36*91f16700Schasinglulu  * @data:           Backing store for spmc_shmem_obj objects.
37*91f16700Schasinglulu  * @data_size:      The size allocated for the backing store.
38*91f16700Schasinglulu  * @allocated:      Number of bytes allocated in @data.
39*91f16700Schasinglulu  * @next_handle:    Handle used for next allocated object.
40*91f16700Schasinglulu  * @lock:           Lock protecting all state in this file.
41*91f16700Schasinglulu  */
42*91f16700Schasinglulu struct spmc_shmem_obj_state {
43*91f16700Schasinglulu 	uint8_t *data;
44*91f16700Schasinglulu 	size_t data_size;
45*91f16700Schasinglulu 	size_t allocated;
46*91f16700Schasinglulu 	uint64_t next_handle;
47*91f16700Schasinglulu 	spinlock_t lock;
48*91f16700Schasinglulu };
49*91f16700Schasinglulu 
50*91f16700Schasinglulu extern struct spmc_shmem_obj_state spmc_shmem_obj_state;
51*91f16700Schasinglulu extern int plat_spmc_shmem_begin(struct ffa_mtd *desc);
52*91f16700Schasinglulu extern int plat_spmc_shmem_reclaim(struct ffa_mtd *desc);
53*91f16700Schasinglulu 
54*91f16700Schasinglulu long spmc_ffa_mem_send(uint32_t smc_fid,
55*91f16700Schasinglulu 		       bool secure_origin,
56*91f16700Schasinglulu 		       uint64_t total_length,
57*91f16700Schasinglulu 		       uint32_t fragment_length,
58*91f16700Schasinglulu 		       uint64_t address,
59*91f16700Schasinglulu 		       uint32_t page_count,
60*91f16700Schasinglulu 		       void *cookie,
61*91f16700Schasinglulu 		       void *handle,
62*91f16700Schasinglulu 		       uint64_t flags);
63*91f16700Schasinglulu 
64*91f16700Schasinglulu long spmc_ffa_mem_frag_tx(uint32_t smc_fid,
65*91f16700Schasinglulu 			  bool secure_origin,
66*91f16700Schasinglulu 			  uint64_t handle_low,
67*91f16700Schasinglulu 			  uint64_t handle_high,
68*91f16700Schasinglulu 			  uint32_t fragment_length,
69*91f16700Schasinglulu 			  uint32_t sender_id,
70*91f16700Schasinglulu 			  void *cookie,
71*91f16700Schasinglulu 			  void *handle,
72*91f16700Schasinglulu 			  uint64_t flags);
73*91f16700Schasinglulu 
74*91f16700Schasinglulu long spmc_ffa_mem_retrieve_req(uint32_t smc_fid,
75*91f16700Schasinglulu 			       bool secure_origin,
76*91f16700Schasinglulu 			       uint32_t total_length,
77*91f16700Schasinglulu 			       uint32_t fragment_length,
78*91f16700Schasinglulu 			       uint64_t address,
79*91f16700Schasinglulu 			       uint32_t page_count,
80*91f16700Schasinglulu 			       void *cookie,
81*91f16700Schasinglulu 			       void *handle,
82*91f16700Schasinglulu 			       uint64_t flags);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu long spmc_ffa_mem_frag_rx(uint32_t smc_fid,
85*91f16700Schasinglulu 			  bool secure_origin,
86*91f16700Schasinglulu 			  uint32_t handle_low,
87*91f16700Schasinglulu 			  uint32_t handle_high,
88*91f16700Schasinglulu 			  uint32_t fragment_offset,
89*91f16700Schasinglulu 			  uint32_t sender_id,
90*91f16700Schasinglulu 			  void *cookie,
91*91f16700Schasinglulu 			  void *handle,
92*91f16700Schasinglulu 			  uint64_t flags);
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 
95*91f16700Schasinglulu int spmc_ffa_mem_relinquish(uint32_t smc_fid,
96*91f16700Schasinglulu 			    bool secure_origin,
97*91f16700Schasinglulu 			    uint32_t handle_low,
98*91f16700Schasinglulu 			    uint32_t handle_high,
99*91f16700Schasinglulu 			    uint32_t fragment_offset,
100*91f16700Schasinglulu 			    uint32_t sender_id,
101*91f16700Schasinglulu 			    void *cookie,
102*91f16700Schasinglulu 			    void *handle,
103*91f16700Schasinglulu 			    uint64_t flags);
104*91f16700Schasinglulu 
105*91f16700Schasinglulu int spmc_ffa_mem_reclaim(uint32_t smc_fid,
106*91f16700Schasinglulu 			 bool secure_origin,
107*91f16700Schasinglulu 			 uint32_t handle_low,
108*91f16700Schasinglulu 			 uint32_t handle_high,
109*91f16700Schasinglulu 			 uint32_t mem_flags,
110*91f16700Schasinglulu 			 uint64_t x4,
111*91f16700Schasinglulu 			 void *cookie,
112*91f16700Schasinglulu 			 void *handle,
113*91f16700Schasinglulu 			 uint64_t flags);
114*91f16700Schasinglulu 
115*91f16700Schasinglulu #endif /* SPMC_SHARED_MEM_H */
116