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