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