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