xref: /optee_os/core/include/mm/sp_mem.h (revision c0bb2059d58601afcd87a6e6bcc0957d7e901b96)
15c1143a8SJelle Sels /* SPDX-License-Identifier: BSD-2-Clause */
25c1143a8SJelle Sels /*
36f3a5646SJelle Sels  * Copyright (c) 2021-2022, Arm Limited.
45c1143a8SJelle Sels  */
55c1143a8SJelle Sels 
65c1143a8SJelle Sels #ifndef __MM_SP_MEM_H
75c1143a8SJelle Sels #define __MM_SP_MEM_H
85c1143a8SJelle Sels 
95c1143a8SJelle Sels #include <ffa.h>
105c1143a8SJelle Sels #include <mm/fobj.h>
115c1143a8SJelle Sels #include <sys/queue.h>
125c1143a8SJelle Sels 
135c1143a8SJelle Sels struct sp_mem;
145c1143a8SJelle Sels 
155c1143a8SJelle Sels /*
165c1143a8SJelle Sels  * struct sp_mem_receiver - Memory object instance for a FF-A receiver endpoint
175c1143a8SJelle Sels  *
185c1143a8SJelle Sels  * @perm: Receiver permission on the shared memory
195c1143a8SJelle Sels  * @ref_count: Count retrieve requests from endpoint
205c1143a8SJelle Sels  * @smem: Shared memory reference
215c1143a8SJelle Sels  * @link: Link in related list
225c1143a8SJelle Sels  */
235c1143a8SJelle Sels struct sp_mem_receiver {
245c1143a8SJelle Sels 	struct ffa_mem_access_perm perm;
255c1143a8SJelle Sels 	uint8_t ref_count;
265c1143a8SJelle Sels 	struct sp_mem *smem;
275c1143a8SJelle Sels 
285c1143a8SJelle Sels 	SLIST_ENTRY(sp_mem_receiver) link;
295c1143a8SJelle Sels };
305c1143a8SJelle Sels 
315c1143a8SJelle Sels /*
325c1143a8SJelle Sels  * sp_mem_map_region represents the memory address when using FF-A shares.
335c1143a8SJelle Sels  * Instead of storing the physical addresses and the size of the region, we use
345c1143a8SJelle Sels  * the mobj's which were already used by the SPs. The offset is used to point
355c1143a8SJelle Sels  * to the specific location inside the mobj memory range.
365c1143a8SJelle Sels  */
375c1143a8SJelle Sels struct sp_mem_map_region {
385c1143a8SJelle Sels 	struct mobj *mobj;
395c1143a8SJelle Sels 	/*
405c1143a8SJelle Sels 	 * Offset (in pages) inside the mobj which is used to retrieve the
415c1143a8SJelle Sels 	 * location.
425c1143a8SJelle Sels 	 */
435c1143a8SJelle Sels 	uint32_t page_offset;
445c1143a8SJelle Sels 	uint32_t page_count;
455c1143a8SJelle Sels 
465c1143a8SJelle Sels 	SLIST_ENTRY(sp_mem_map_region) link;
475c1143a8SJelle Sels };
485c1143a8SJelle Sels 
495c1143a8SJelle Sels SLIST_HEAD(sp_mem_receiver_head, sp_mem_receiver);
505c1143a8SJelle Sels SLIST_HEAD(sp_mem_regions_head, sp_mem_map_region);
515c1143a8SJelle Sels 
525c1143a8SJelle Sels /*
535c1143a8SJelle Sels  * sp_mem is used as the main place to store the FF-A shares information.
545c1143a8SJelle Sels  * For each FFA_SHARE message a new sp_mem object is created.
555c1143a8SJelle Sels  * The receivers field is used to store all receiver specific information.
565c1143a8SJelle Sels  * The regions field is used to store all data needed for retrieving the
575c1143a8SJelle Sels  * shared addresses.
585c1143a8SJelle Sels  */
595c1143a8SJelle Sels struct sp_mem {
605c1143a8SJelle Sels 	struct sp_mem_regions_head regions;
615c1143a8SJelle Sels 	struct sp_mem_receiver_head receivers;
625c1143a8SJelle Sels 	/* Data which was passed inside struct ffa_mem_transaction */
635c1143a8SJelle Sels 	uint16_t sender_id;
645c1143a8SJelle Sels 	uint8_t mem_reg_attr;
655c1143a8SJelle Sels 	uint32_t flags;
665c1143a8SJelle Sels 	uint64_t global_handle;
675c1143a8SJelle Sels 	uint64_t tag;
685c1143a8SJelle Sels 
695c1143a8SJelle Sels 	SLIST_ENTRY(sp_mem) link;
705c1143a8SJelle Sels };
715c1143a8SJelle Sels 
725c1143a8SJelle Sels struct sp_mem *sp_mem_new(void);
735c1143a8SJelle Sels struct sp_mem_receiver *sp_mem_get_receiver(uint32_t s_id, struct sp_mem *smem);
745c1143a8SJelle Sels struct sp_mem *sp_mem_get(uint64_t handle);
755c1143a8SJelle Sels 
7672ede99eSJelle Sels bool sp_mem_is_shared(struct sp_mem_map_region *new_reg);
775c1143a8SJelle Sels void *sp_mem_get_va(const struct user_mode_ctx *uctx, size_t offset,
785c1143a8SJelle Sels 		    struct mobj *mobj);
795c1143a8SJelle Sels void sp_mem_remove(struct sp_mem *s_mem);
805c1143a8SJelle Sels void sp_mem_add(struct sp_mem *smem);
81*c0bb2059SBalint Dobszay struct mobj *sp_mem_new_mobj(uint64_t pages, uint32_t mem_type, bool is_secure);
826a1b230cSJelle Sels int sp_mem_add_pages(struct mobj *mobj, unsigned int *idx,
836a1b230cSJelle Sels 		     paddr_t pa, unsigned int num_pages);
845c1143a8SJelle Sels #endif /*__MM_SP_MEM_H*/
85