xref: /optee_os/core/include/mm/mobj.h (revision 003383344c26be3589383acc87c1ebb2860e9317)
1185b4595SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
2185b4595SMarouene Boubakri /*
3*00338334SJens Wiklander  * Copyright (c) 2016-2024 Linaro Limited
4185b4595SMarouene Boubakri  */
5185b4595SMarouene Boubakri 
6185b4595SMarouene Boubakri #ifndef __MM_MOBJ_H
7185b4595SMarouene Boubakri #define __MM_MOBJ_H
8185b4595SMarouene Boubakri 
9185b4595SMarouene Boubakri #include <compiler.h>
10185b4595SMarouene Boubakri #include <mm/core_memprot.h>
11185b4595SMarouene Boubakri #include <mm/file.h>
12185b4595SMarouene Boubakri #include <mm/fobj.h>
13185b4595SMarouene Boubakri #include <string_ext.h>
14185b4595SMarouene Boubakri #include <sys/queue.h>
15185b4595SMarouene Boubakri #include <tee_api_types.h>
16185b4595SMarouene Boubakri #include <types_ext.h>
17185b4595SMarouene Boubakri 
18c1bdf4fcSJens Wiklander #include <optee_msg.h>
19c1bdf4fcSJens Wiklander 
20*00338334SJens Wiklander enum mobj_use_case {
21*00338334SJens Wiklander 	MOBJ_USE_CASE_NS_SHM,
22*00338334SJens Wiklander 	MOBJ_USE_CASE_SEC_VIDEO_PLAY,
23*00338334SJens Wiklander 	MOBJ_USE_CASE_TRUSED_UI,
24*00338334SJens Wiklander };
25*00338334SJens Wiklander 
26185b4595SMarouene Boubakri struct mobj {
27185b4595SMarouene Boubakri 	const struct mobj_ops *ops;
28185b4595SMarouene Boubakri 	size_t size;
29185b4595SMarouene Boubakri 	size_t phys_granule;
30185b4595SMarouene Boubakri 	struct refcount refc;
31185b4595SMarouene Boubakri };
32185b4595SMarouene Boubakri 
33185b4595SMarouene Boubakri struct mobj_ops {
349c4aaf67SJens Wiklander 	void *(*get_va)(struct mobj *mobj, size_t offs, size_t len);
35185b4595SMarouene Boubakri 	TEE_Result (*get_pa)(struct mobj *mobj, size_t offs, size_t granule,
36185b4595SMarouene Boubakri 			     paddr_t *pa);
37185b4595SMarouene Boubakri 	size_t (*get_phys_offs)(struct mobj *mobj, size_t granule);
388afe7a7cSJens Wiklander 	TEE_Result (*get_mem_type)(struct mobj *mobj, uint32_t *mt);
39185b4595SMarouene Boubakri 	bool (*matches)(struct mobj *mobj, enum buf_is_attr attr);
40185b4595SMarouene Boubakri 	void (*free)(struct mobj *mobj);
41185b4595SMarouene Boubakri 	uint64_t (*get_cookie)(struct mobj *mobj);
42185b4595SMarouene Boubakri 	struct fobj *(*get_fobj)(struct mobj *mobj);
43185b4595SMarouene Boubakri 	TEE_Result (*inc_map)(struct mobj *mobj);
44185b4595SMarouene Boubakri 	TEE_Result (*dec_map)(struct mobj *mobj);
45185b4595SMarouene Boubakri };
46185b4595SMarouene Boubakri 
47185b4595SMarouene Boubakri extern struct mobj mobj_virt;
48ff01e245SAnton Rybakov extern struct mobj *mobj_tee_ram_rx;
49ff01e245SAnton Rybakov extern struct mobj *mobj_tee_ram_rw;
50185b4595SMarouene Boubakri 
519c4aaf67SJens Wiklander /*
529c4aaf67SJens Wiklander  * mobj_get_va() - get virtual address of a mapped mobj
539c4aaf67SJens Wiklander  * @mobj:	memory object
549c4aaf67SJens Wiklander  * @offset:	find the va of this offset into @mobj
559c4aaf67SJens Wiklander  * @len:	how many bytes after @offset that must be valid, can be 1 if
569c4aaf67SJens Wiklander  *		the caller knows by other means that the expected buffer is
579c4aaf67SJens Wiklander  *		available.
589c4aaf67SJens Wiklander  *
599c4aaf67SJens Wiklander  * return a virtual address on success or NULL on error
609c4aaf67SJens Wiklander  */
mobj_get_va(struct mobj * mobj,size_t offset,size_t len)619c4aaf67SJens Wiklander static inline void *mobj_get_va(struct mobj *mobj, size_t offset, size_t len)
62185b4595SMarouene Boubakri {
63185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->get_va)
649c4aaf67SJens Wiklander 		return mobj->ops->get_va(mobj, offset, len);
65185b4595SMarouene Boubakri 	return NULL;
66185b4595SMarouene Boubakri }
67185b4595SMarouene Boubakri 
mobj_get_pa(struct mobj * mobj,size_t offs,size_t granule,paddr_t * pa)68185b4595SMarouene Boubakri static inline TEE_Result mobj_get_pa(struct mobj *mobj, size_t offs,
69185b4595SMarouene Boubakri 				     size_t granule, paddr_t *pa)
70185b4595SMarouene Boubakri {
71185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->get_pa)
72185b4595SMarouene Boubakri 		return mobj->ops->get_pa(mobj, offs, granule, pa);
73185b4595SMarouene Boubakri 	return TEE_ERROR_GENERIC;
74185b4595SMarouene Boubakri }
75185b4595SMarouene Boubakri 
mobj_get_phys_offs(struct mobj * mobj,size_t granule)76185b4595SMarouene Boubakri static inline size_t mobj_get_phys_offs(struct mobj *mobj, size_t granule)
77185b4595SMarouene Boubakri {
78185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->get_phys_offs)
79185b4595SMarouene Boubakri 		return mobj->ops->get_phys_offs(mobj, granule);
80185b4595SMarouene Boubakri 	return 0;
81185b4595SMarouene Boubakri }
82185b4595SMarouene Boubakri 
mobj_get_mem_type(struct mobj * mobj,uint32_t * mt)838afe7a7cSJens Wiklander static inline TEE_Result mobj_get_mem_type(struct mobj *mobj, uint32_t *mt)
84185b4595SMarouene Boubakri {
858afe7a7cSJens Wiklander 	if (mobj && mobj->ops && mobj->ops->get_mem_type)
868afe7a7cSJens Wiklander 		return mobj->ops->get_mem_type(mobj, mt);
87185b4595SMarouene Boubakri 	return TEE_ERROR_GENERIC;
88185b4595SMarouene Boubakri }
89185b4595SMarouene Boubakri 
mobj_matches(struct mobj * mobj,enum buf_is_attr attr)90185b4595SMarouene Boubakri static inline bool mobj_matches(struct mobj *mobj, enum buf_is_attr attr)
91185b4595SMarouene Boubakri {
92185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->matches)
93185b4595SMarouene Boubakri 		return mobj->ops->matches(mobj, attr);
94185b4595SMarouene Boubakri 	return false;
95185b4595SMarouene Boubakri }
96185b4595SMarouene Boubakri 
97185b4595SMarouene Boubakri /**
98185b4595SMarouene Boubakri  * mobj_inc_map() - increase map count
99185b4595SMarouene Boubakri  * @mobj:	pointer to a MOBJ
100185b4595SMarouene Boubakri  *
101185b4595SMarouene Boubakri  * Maps the MOBJ if it isn't mapped already and increases the map count
102185b4595SMarouene Boubakri  * Each call to mobj_inc_map() is supposed to be matches by a call to
103185b4595SMarouene Boubakri  * mobj_dec_map().
104185b4595SMarouene Boubakri  *
105185b4595SMarouene Boubakri  * Returns TEE_SUCCESS on success or an error code on failure
106185b4595SMarouene Boubakri  */
mobj_inc_map(struct mobj * mobj)107185b4595SMarouene Boubakri static inline TEE_Result mobj_inc_map(struct mobj *mobj)
108185b4595SMarouene Boubakri {
109185b4595SMarouene Boubakri 	if (mobj && mobj->ops) {
110185b4595SMarouene Boubakri 		if (mobj->ops->inc_map)
111185b4595SMarouene Boubakri 			return mobj->ops->inc_map(mobj);
112185b4595SMarouene Boubakri 		return TEE_SUCCESS;
113185b4595SMarouene Boubakri 	}
114185b4595SMarouene Boubakri 	return TEE_ERROR_GENERIC;
115185b4595SMarouene Boubakri }
116185b4595SMarouene Boubakri 
117185b4595SMarouene Boubakri /**
118185b4595SMarouene Boubakri  * mobj_dec_map() - decrease map count
119185b4595SMarouene Boubakri  * @mobj:	pointer to a MOBJ
120185b4595SMarouene Boubakri  *
121185b4595SMarouene Boubakri  * Decreases the map count and also unmaps the MOBJ if the map count
122185b4595SMarouene Boubakri  * reaches 0.  Each call to mobj_inc_map() is supposed to be matched by a
123185b4595SMarouene Boubakri  * call to mobj_dec_map().
124185b4595SMarouene Boubakri  *
125185b4595SMarouene Boubakri  * Returns TEE_SUCCESS on success or an error code on failure
126185b4595SMarouene Boubakri  */
mobj_dec_map(struct mobj * mobj)127185b4595SMarouene Boubakri static inline TEE_Result mobj_dec_map(struct mobj *mobj)
128185b4595SMarouene Boubakri {
129185b4595SMarouene Boubakri 	if (mobj && mobj->ops) {
130185b4595SMarouene Boubakri 		if (mobj->ops->dec_map)
131185b4595SMarouene Boubakri 			return mobj->ops->dec_map(mobj);
132185b4595SMarouene Boubakri 		return TEE_SUCCESS;
133185b4595SMarouene Boubakri 	}
134185b4595SMarouene Boubakri 	return TEE_ERROR_GENERIC;
135185b4595SMarouene Boubakri }
136185b4595SMarouene Boubakri 
137185b4595SMarouene Boubakri /**
138185b4595SMarouene Boubakri  * mobj_get() - get a MOBJ
139185b4595SMarouene Boubakri  * @mobj:	Pointer to a MOBJ or NULL
140185b4595SMarouene Boubakri  *
141185b4595SMarouene Boubakri  * Increases reference counter of the @mobj
142185b4595SMarouene Boubakri  *
143185b4595SMarouene Boubakri  * Returns @mobj with reference counter increased or NULL if @mobj was NULL
144185b4595SMarouene Boubakri  */
mobj_get(struct mobj * mobj)145185b4595SMarouene Boubakri static inline struct mobj *mobj_get(struct mobj *mobj)
146185b4595SMarouene Boubakri {
147185b4595SMarouene Boubakri 	if (mobj && !refcount_inc(&mobj->refc))
148185b4595SMarouene Boubakri 		panic();
149185b4595SMarouene Boubakri 
150185b4595SMarouene Boubakri 	return mobj;
151185b4595SMarouene Boubakri }
152185b4595SMarouene Boubakri 
153185b4595SMarouene Boubakri /**
154185b4595SMarouene Boubakri  * mobj_put() - put a MOBJ
155185b4595SMarouene Boubakri  * @mobj:	Pointer to a MOBJ or NULL
156185b4595SMarouene Boubakri  *
157185b4595SMarouene Boubakri  * Decreases reference counter of the @mobj and frees it if the counter
158185b4595SMarouene Boubakri  * reaches 0.
159185b4595SMarouene Boubakri  */
mobj_put(struct mobj * mobj)160185b4595SMarouene Boubakri static inline void mobj_put(struct mobj *mobj)
161185b4595SMarouene Boubakri {
162185b4595SMarouene Boubakri 	if (mobj && refcount_dec(&mobj->refc))
163185b4595SMarouene Boubakri 		mobj->ops->free(mobj);
164185b4595SMarouene Boubakri }
165185b4595SMarouene Boubakri 
166185b4595SMarouene Boubakri /**
167185b4595SMarouene Boubakri  * mobj_put_wipe() - wipe and put a MOBJ
168185b4595SMarouene Boubakri  * @mobj:	Pointer to a MOBJ or NULL
169185b4595SMarouene Boubakri  *
170185b4595SMarouene Boubakri  * Clears the memory represented by the mobj and then puts it.
171185b4595SMarouene Boubakri  */
mobj_put_wipe(struct mobj * mobj)172185b4595SMarouene Boubakri static inline void mobj_put_wipe(struct mobj *mobj)
173185b4595SMarouene Boubakri {
1749c4aaf67SJens Wiklander 	if (mobj) {
1759c4aaf67SJens Wiklander 		void *buf = mobj_get_va(mobj, 0, mobj->size);
176185b4595SMarouene Boubakri 
177185b4595SMarouene Boubakri 		if (buf)
178185b4595SMarouene Boubakri 			memzero_explicit(buf, mobj->size);
179185b4595SMarouene Boubakri 		mobj_put(mobj);
180185b4595SMarouene Boubakri 	}
1819c4aaf67SJens Wiklander }
182185b4595SMarouene Boubakri 
mobj_get_cookie(struct mobj * mobj)183185b4595SMarouene Boubakri static inline uint64_t mobj_get_cookie(struct mobj *mobj)
184185b4595SMarouene Boubakri {
185185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->get_cookie)
186185b4595SMarouene Boubakri 		return mobj->ops->get_cookie(mobj);
187185b4595SMarouene Boubakri 
188e26b8354SJens Wiklander #if defined(CFG_CORE_FFA)
189c1bdf4fcSJens Wiklander 	return OPTEE_MSG_FMEM_INVALID_GLOBAL_ID;
190c1bdf4fcSJens Wiklander #else
191185b4595SMarouene Boubakri 	return 0;
192c1bdf4fcSJens Wiklander #endif
193185b4595SMarouene Boubakri }
194185b4595SMarouene Boubakri 
mobj_get_fobj(struct mobj * mobj)195185b4595SMarouene Boubakri static inline struct fobj *mobj_get_fobj(struct mobj *mobj)
196185b4595SMarouene Boubakri {
197185b4595SMarouene Boubakri 	if (mobj && mobj->ops && mobj->ops->get_fobj)
198185b4595SMarouene Boubakri 		return mobj->ops->get_fobj(mobj);
199185b4595SMarouene Boubakri 
200185b4595SMarouene Boubakri 	return NULL;
201185b4595SMarouene Boubakri }
202185b4595SMarouene Boubakri 
mobj_is_nonsec(struct mobj * mobj)203185b4595SMarouene Boubakri static inline bool mobj_is_nonsec(struct mobj *mobj)
204185b4595SMarouene Boubakri {
205185b4595SMarouene Boubakri 	return mobj_matches(mobj, CORE_MEM_NON_SEC);
206185b4595SMarouene Boubakri }
207185b4595SMarouene Boubakri 
mobj_is_secure(struct mobj * mobj)208185b4595SMarouene Boubakri static inline bool mobj_is_secure(struct mobj *mobj)
209185b4595SMarouene Boubakri {
210185b4595SMarouene Boubakri 	return mobj_matches(mobj, CORE_MEM_SEC);
211185b4595SMarouene Boubakri }
212185b4595SMarouene Boubakri 
mobj_is_sdp_mem(struct mobj * mobj)213185b4595SMarouene Boubakri static inline bool mobj_is_sdp_mem(struct mobj *mobj)
214185b4595SMarouene Boubakri {
215185b4595SMarouene Boubakri 	return mobj_matches(mobj, CORE_MEM_SDP_MEM);
216185b4595SMarouene Boubakri }
217185b4595SMarouene Boubakri 
mobj_get_phys_granule(struct mobj * mobj)218185b4595SMarouene Boubakri static inline size_t mobj_get_phys_granule(struct mobj *mobj)
219185b4595SMarouene Boubakri {
220185b4595SMarouene Boubakri 	if (mobj->phys_granule)
221185b4595SMarouene Boubakri 		return mobj->phys_granule;
222185b4595SMarouene Boubakri 	return mobj->size;
223185b4595SMarouene Boubakri }
224185b4595SMarouene Boubakri 
mobj_check_offset_and_len(struct mobj * mobj,size_t offset,size_t len)2259c4aaf67SJens Wiklander static inline bool mobj_check_offset_and_len(struct mobj *mobj, size_t offset,
2269c4aaf67SJens Wiklander 					     size_t len)
2279c4aaf67SJens Wiklander {
2289c4aaf67SJens Wiklander 	size_t end_offs = 0;
2299c4aaf67SJens Wiklander 
2309c4aaf67SJens Wiklander 	return len && !ADD_OVERFLOW(offset, len - 1, &end_offs) &&
2319c4aaf67SJens Wiklander 	       end_offs < mobj->size;
2329c4aaf67SJens Wiklander }
2339c4aaf67SJens Wiklander 
234185b4595SMarouene Boubakri struct mobj *mobj_phys_alloc(paddr_t pa, size_t size, uint32_t cattr,
235185b4595SMarouene Boubakri 			     enum buf_is_attr battr);
236185b4595SMarouene Boubakri 
237185b4595SMarouene Boubakri #if defined(CFG_CORE_FFA)
238185b4595SMarouene Boubakri struct mobj *mobj_ffa_get_by_cookie(uint64_t cookie,
239185b4595SMarouene Boubakri 				    unsigned int internal_offs);
240185b4595SMarouene Boubakri 
241185b4595SMarouene Boubakri TEE_Result mobj_ffa_unregister_by_cookie(uint64_t cookie);
242185b4595SMarouene Boubakri 
243185b4595SMarouene Boubakri /* Functions for SPMC */
244185b4595SMarouene Boubakri #ifdef CFG_CORE_SEL1_SPMC
245a65dd3a6SJens Wiklander struct mobj_ffa *mobj_ffa_sel1_spmc_new(uint64_t cookie,
246*00338334SJens Wiklander 					unsigned int num_pages,
247*00338334SJens Wiklander 					enum mobj_use_case use_case);
248185b4595SMarouene Boubakri void mobj_ffa_sel1_spmc_delete(struct mobj_ffa *mobj);
249185b4595SMarouene Boubakri TEE_Result mobj_ffa_sel1_spmc_reclaim(uint64_t cookie);
250e26b8354SJens Wiklander #else
251*00338334SJens Wiklander struct mobj_ffa *mobj_ffa_spmc_new(uint64_t cookie, unsigned int num_pages,
252*00338334SJens Wiklander 				   enum mobj_use_case use_case);
253e26b8354SJens Wiklander void mobj_ffa_spmc_delete(struct mobj_ffa *mobj);
254fb19e98eSJens Wiklander #endif
255fb19e98eSJens Wiklander 
256185b4595SMarouene Boubakri uint64_t mobj_ffa_get_cookie(struct mobj_ffa *mobj);
257185b4595SMarouene Boubakri TEE_Result mobj_ffa_add_pages_at(struct mobj_ffa *mobj, unsigned int *idx,
258185b4595SMarouene Boubakri 				 paddr_t pa, unsigned int num_pages);
259*00338334SJens Wiklander TEE_Result mobj_ffa_push_to_inactive(struct mobj_ffa *mobj);
260*00338334SJens Wiklander 
261*00338334SJens Wiklander #ifdef CFG_CORE_DYN_PROTMEM
262*00338334SJens Wiklander TEE_Result mobj_ffa_assign_protmem(uint64_t cookie,
263*00338334SJens Wiklander 				   enum mobj_use_case use_case);
264*00338334SJens Wiklander struct mobj *mobj_ffa_protmem_get_by_pa(paddr_t pa, paddr_size_t size);
265*00338334SJens Wiklander #endif
266185b4595SMarouene Boubakri 
267185b4595SMarouene Boubakri #elif defined(CFG_CORE_DYN_SHM)
268185b4595SMarouene Boubakri /* reg_shm represents TEE shared memory */
269185b4595SMarouene Boubakri struct mobj *mobj_reg_shm_alloc(paddr_t *pages, size_t num_pages,
270185b4595SMarouene Boubakri 				paddr_t page_offset, uint64_t cookie);
271185b4595SMarouene Boubakri 
272185b4595SMarouene Boubakri /**
273185b4595SMarouene Boubakri  * mobj_reg_shm_get_by_cookie() - get a MOBJ based on cookie
274185b4595SMarouene Boubakri  * @cookie:	Cookie used by normal world when suppling the shared memory
275185b4595SMarouene Boubakri  *
276185b4595SMarouene Boubakri  * Searches for a registered shared memory MOBJ and if one with a matching
277185b4595SMarouene Boubakri  * @cookie is found its reference counter is increased before returning
278185b4595SMarouene Boubakri  * the MOBJ.
279185b4595SMarouene Boubakri  *
280185b4595SMarouene Boubakri  * Returns a valid pointer on success or NULL on failure.
281185b4595SMarouene Boubakri  */
282185b4595SMarouene Boubakri struct mobj *mobj_reg_shm_get_by_cookie(uint64_t cookie);
283185b4595SMarouene Boubakri 
284185b4595SMarouene Boubakri TEE_Result mobj_reg_shm_release_by_cookie(uint64_t cookie);
285185b4595SMarouene Boubakri 
286185b4595SMarouene Boubakri /**
287185b4595SMarouene Boubakri  * mobj_reg_shm_unguard() - unguards a reg_shm
288185b4595SMarouene Boubakri  * @mobj:	pointer to a registered shared memory mobj
289185b4595SMarouene Boubakri  *
290185b4595SMarouene Boubakri  * A registered shared memory mobj is normally guarded against being
291185b4595SMarouene Boubakri  * released with mobj_reg_shm_try_release_by_cookie(). After this function
292185b4595SMarouene Boubakri  * has returned the mobj can be released by a call to
293185b4595SMarouene Boubakri  * mobj_reg_shm_try_release_by_cookie() if the reference counter allows it.
294185b4595SMarouene Boubakri  */
295185b4595SMarouene Boubakri void mobj_reg_shm_unguard(struct mobj *mobj);
296185b4595SMarouene Boubakri 
297185b4595SMarouene Boubakri /*
298185b4595SMarouene Boubakri  * mapped_shm represents registered shared buffer
299185b4595SMarouene Boubakri  * which is mapped into OPTEE va space
300185b4595SMarouene Boubakri  */
301185b4595SMarouene Boubakri struct mobj *mobj_mapped_shm_alloc(paddr_t *pages, size_t num_pages,
302185b4595SMarouene Boubakri 				   paddr_t page_offset, uint64_t cookie);
303*00338334SJens Wiklander 
304*00338334SJens Wiklander #if defined(CFG_CORE_DYN_PROTMEM)
305*00338334SJens Wiklander struct mobj *mobj_protmem_alloc(paddr_t pa, paddr_size_t size, uint64_t cookie,
306*00338334SJens Wiklander 				enum mobj_use_case use_case);
307*00338334SJens Wiklander TEE_Result mobj_protmem_release_by_cookie(uint64_t cookie);
308*00338334SJens Wiklander struct mobj *mobj_protmem_get_by_pa(paddr_t pa, paddr_size_t size);
309*00338334SJens Wiklander #endif /*CFG_CORE_DYN_PROTMEM*/
310*00338334SJens Wiklander 
311185b4595SMarouene Boubakri #endif /*CFG_CORE_DYN_SHM*/
312185b4595SMarouene Boubakri 
313185b4595SMarouene Boubakri #if !defined(CFG_CORE_DYN_SHM)
mobj_mapped_shm_alloc(paddr_t * pages __unused,size_t num_pages __unused,paddr_t page_offset __unused,uint64_t cookie __unused)314185b4595SMarouene Boubakri static inline struct mobj *mobj_mapped_shm_alloc(paddr_t *pages __unused,
315185b4595SMarouene Boubakri 						 size_t num_pages __unused,
316185b4595SMarouene Boubakri 						 paddr_t page_offset __unused,
317185b4595SMarouene Boubakri 						 uint64_t cookie __unused)
318185b4595SMarouene Boubakri {
319185b4595SMarouene Boubakri 	return NULL;
320185b4595SMarouene Boubakri }
32164b74defSJens Wiklander 
mobj_reg_shm_get_by_cookie(uint64_t cookie __unused)32264b74defSJens Wiklander static inline struct mobj *mobj_reg_shm_get_by_cookie(uint64_t cookie __unused)
32364b74defSJens Wiklander {
32464b74defSJens Wiklander 	return NULL;
32564b74defSJens Wiklander }
326185b4595SMarouene Boubakri #endif
327185b4595SMarouene Boubakri 
328*00338334SJens Wiklander #if !defined(CFG_CORE_DYN_PROTMEM) || defined(CFG_CORE_FFA)
329*00338334SJens Wiklander static inline struct mobj *
mobj_protmem_alloc(paddr_t pa __unused,paddr_size_t size __unused,uint64_t cookie __unused,enum mobj_use_case use_case __unused)330*00338334SJens Wiklander mobj_protmem_alloc(paddr_t pa __unused, paddr_size_t size __unused,
331*00338334SJens Wiklander 		   uint64_t cookie __unused,
332*00338334SJens Wiklander 		   enum mobj_use_case use_case __unused)
333*00338334SJens Wiklander {
334*00338334SJens Wiklander 	return NULL;
335*00338334SJens Wiklander }
336*00338334SJens Wiklander 
337*00338334SJens Wiklander static inline TEE_Result
mobj_protmem_release_by_cookie(uint64_t cookie __unused)338*00338334SJens Wiklander mobj_protmem_release_by_cookie(uint64_t cookie __unused)
339*00338334SJens Wiklander {
340*00338334SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
341*00338334SJens Wiklander }
342*00338334SJens Wiklander 
mobj_protmem_get_by_pa(paddr_t pa __unused,paddr_size_t size __unused)343*00338334SJens Wiklander static inline struct mobj *mobj_protmem_get_by_pa(paddr_t pa __unused,
344*00338334SJens Wiklander 						  paddr_size_t size __unused)
345*00338334SJens Wiklander {
346*00338334SJens Wiklander 	return NULL;
347*00338334SJens Wiklander }
348*00338334SJens Wiklander #endif
349*00338334SJens Wiklander 
350*00338334SJens Wiklander #if !defined(CFG_CORE_DYN_PROTMEM) || !defined(CFG_CORE_FFA)
351*00338334SJens Wiklander static inline struct mobj *
mobj_ffa_protmem_get_by_pa(paddr_t pa __unused,paddr_size_t size __unused)352*00338334SJens Wiklander mobj_ffa_protmem_get_by_pa(paddr_t pa __unused, paddr_size_t size __unused)
353*00338334SJens Wiklander {
354*00338334SJens Wiklander 	return NULL;
355*00338334SJens Wiklander }
356*00338334SJens Wiklander 
357*00338334SJens Wiklander static inline TEE_Result
mobj_ffa_assign_protmem(uint64_t cookie __unused,enum mobj_use_case use_case __unused)358*00338334SJens Wiklander mobj_ffa_assign_protmem(uint64_t cookie __unused,
359*00338334SJens Wiklander 			enum mobj_use_case use_case __unused)
360*00338334SJens Wiklander {
361*00338334SJens Wiklander 	return TEE_ERROR_NOT_IMPLEMENTED;
362*00338334SJens Wiklander }
363*00338334SJens Wiklander #endif
364*00338334SJens Wiklander 
365*00338334SJens Wiklander #if !defined(CFG_CORE_FFA)
366*00338334SJens Wiklander static inline struct mobj *
mobj_ffa_get_by_cookie(uint64_t cookie __unused,unsigned int internal_offs __unused)367*00338334SJens Wiklander mobj_ffa_get_by_cookie(uint64_t cookie __unused,
368*00338334SJens Wiklander 		       unsigned int internal_offs __unused)
369*00338334SJens Wiklander {
370*00338334SJens Wiklander 	return NULL;
371*00338334SJens Wiklander }
372*00338334SJens Wiklander #endif
373*00338334SJens Wiklander 
374185b4595SMarouene Boubakri struct mobj *mobj_shm_alloc(paddr_t pa, size_t size, uint64_t cookie);
375185b4595SMarouene Boubakri 
376185b4595SMarouene Boubakri #ifdef CFG_PAGED_USER_TA
377185b4595SMarouene Boubakri bool mobj_is_paged(struct mobj *mobj);
378185b4595SMarouene Boubakri #else
mobj_is_paged(struct mobj * mobj __unused)379185b4595SMarouene Boubakri static inline bool mobj_is_paged(struct mobj *mobj __unused)
380185b4595SMarouene Boubakri {
381185b4595SMarouene Boubakri 	return false;
382185b4595SMarouene Boubakri }
383185b4595SMarouene Boubakri #endif
384185b4595SMarouene Boubakri 
3856105aa86SJens Wiklander struct mobj *mobj_with_fobj_alloc(struct fobj *fobj, struct file *file,
3866105aa86SJens Wiklander 				  uint32_t mem_type);
387185b4595SMarouene Boubakri 
388*00338334SJens Wiklander #ifdef CFG_CORE_DYN_PROTMEM
389*00338334SJens Wiklander /*
390*00338334SJens Wiklander  * plat_get_protmem_config() - Platform specific config for a protected memory
391*00338334SJens Wiklander  *                             use-case
392*00338334SJens Wiklander  * @use_case:      Identifies the protected memory use-case
393*00338334SJens Wiklander  * @min_mem_sz:    out value for minumim memory size
394*00338334SJens Wiklander  * @min_mem_align: out value for minimum alignment
395*00338334SJens Wiklander  *
396*00338334SJens Wiklander  * The function is not supposed to be called with MOBJ_USE_CASE_NS_SHM as
397*00338334SJens Wiklander  * @use_case, but any other defined enum value is up to the platform.
398*00338334SJens Wiklander  *
399*00338334SJens Wiklander  * returns TEE_Result value
400*00338334SJens Wiklander  */
401*00338334SJens Wiklander TEE_Result plat_get_protmem_config(enum mobj_use_case use_case,
402*00338334SJens Wiklander 				   size_t *min_mem_sz, size_t *min_mem_align);
403*00338334SJens Wiklander 
404*00338334SJens Wiklander /*
405*00338334SJens Wiklander  * plat_set_protmem_range() - Platform specific change of memory protection
406*00338334SJens Wiklander  * @use_case: Identifies the protected memory use-case
407*00338334SJens Wiklander  * @pa:       Start physical address
408*00338334SJens Wiklander  * @sz:       Size of the memory range
409*00338334SJens Wiklander  *
410*00338334SJens Wiklander  * The @use_case defines how the supplied memory range should be protected.
411*00338334SJens Wiklander  * The function can be called with MOBJ_USE_CASE_NS_SHM as @use_case to
412*00338334SJens Wiklander  * restore the non-protected state.
413*00338334SJens Wiklander  *
414*00338334SJens Wiklander  * returns TEE_Result value
415*00338334SJens Wiklander  */
416*00338334SJens Wiklander 
417*00338334SJens Wiklander TEE_Result plat_set_protmem_range(enum mobj_use_case use_case, paddr_t pa,
418*00338334SJens Wiklander 				  paddr_size_t sz);
419*00338334SJens Wiklander #else
420*00338334SJens Wiklander static inline TEE_Result
plat_get_protmem_config(enum mobj_use_case use_case __unused,size_t * min_mem_sz __unused,size_t * min_mem_align __unused)421*00338334SJens Wiklander plat_get_protmem_config(enum mobj_use_case use_case __unused,
422*00338334SJens Wiklander 			size_t *min_mem_sz __unused,
423*00338334SJens Wiklander 			size_t *min_mem_align __unused)
424*00338334SJens Wiklander {
425*00338334SJens Wiklander 	return TEE_ERROR_BAD_PARAMETERS;
426*00338334SJens Wiklander }
427*00338334SJens Wiklander 
428*00338334SJens Wiklander static inline TEE_Result
plat_set_protmem_range(enum mobj_use_case use_case __unused,paddr_t pa __unused,paddr_size_t sz __unused)429*00338334SJens Wiklander plat_set_protmem_range(enum mobj_use_case use_case __unused,
430*00338334SJens Wiklander 		       paddr_t pa __unused, paddr_size_t sz __unused)
431*00338334SJens Wiklander {
432*00338334SJens Wiklander 	return TEE_ERROR_BAD_PARAMETERS;
433*00338334SJens Wiklander }
434*00338334SJens Wiklander #endif
435*00338334SJens Wiklander 
436185b4595SMarouene Boubakri #endif /*__MM_MOBJ_H*/
437