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