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 EL3_SPMC_FFA_MEM_H 8e0b1a6d5SMarc Bonnici #define EL3_SPMC_FFA_MEM_H 9e0b1a6d5SMarc Bonnici 10e0b1a6d5SMarc Bonnici #include <assert.h> 11e0b1a6d5SMarc Bonnici 12e0b1a6d5SMarc Bonnici /* 13e0b1a6d5SMarc Bonnici * Subset of Arm Firmware Framework for Armv8-A 14e0b1a6d5SMarc Bonnici * (https://developer.arm.com/docs/den0077/a) needed for shared memory. 15e0b1a6d5SMarc Bonnici */ 16e0b1a6d5SMarc Bonnici 17e0b1a6d5SMarc Bonnici /** 18e0b1a6d5SMarc Bonnici * typedef ffa_endpoint_id16_t - Endpoint ID 19e0b1a6d5SMarc Bonnici * 20e0b1a6d5SMarc Bonnici * Current implementation only supports VM IDs. FF-A spec also support stream 21e0b1a6d5SMarc Bonnici * endpoint ids. 22e0b1a6d5SMarc Bonnici */ 23e0b1a6d5SMarc Bonnici typedef uint16_t ffa_endpoint_id16_t; 24e0b1a6d5SMarc Bonnici 25e0b1a6d5SMarc Bonnici /** 26e0b1a6d5SMarc Bonnici * struct ffa_cons_mrd - Constituent memory region descriptor 27e0b1a6d5SMarc Bonnici * @address: 28e0b1a6d5SMarc Bonnici * Start address of contiguous memory region. Must be 4K page aligned. 29e0b1a6d5SMarc Bonnici * @page_count: 30e0b1a6d5SMarc Bonnici * Number of 4K pages in region. 31e0b1a6d5SMarc Bonnici * @reserved_12_15: 32e0b1a6d5SMarc Bonnici * Reserve bytes 12-15 to pad struct size to 16 bytes. 33e0b1a6d5SMarc Bonnici */ 34e0b1a6d5SMarc Bonnici struct ffa_cons_mrd { 35e0b1a6d5SMarc Bonnici uint64_t address; 36e0b1a6d5SMarc Bonnici uint32_t page_count; 37e0b1a6d5SMarc Bonnici uint32_t reserved_12_15; 38e0b1a6d5SMarc Bonnici }; 39e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_cons_mrd) == 16, assert_ffa_cons_mrd_size_mismatch); 40e0b1a6d5SMarc Bonnici 41e0b1a6d5SMarc Bonnici /** 42e0b1a6d5SMarc Bonnici * struct ffa_comp_mrd - Composite memory region descriptor 43e0b1a6d5SMarc Bonnici * @total_page_count: 44e0b1a6d5SMarc Bonnici * Number of 4k pages in memory region. Must match sum of 45e0b1a6d5SMarc Bonnici * @address_range_array[].page_count. 46e0b1a6d5SMarc Bonnici * @address_range_count: 47e0b1a6d5SMarc Bonnici * Number of entries in @address_range_array. 48e0b1a6d5SMarc Bonnici * @reserved_8_15: 49e0b1a6d5SMarc Bonnici * Reserve bytes 8-15 to pad struct size to 16 byte alignment and 50e0b1a6d5SMarc Bonnici * make @address_range_array 16 byte aligned. 51e0b1a6d5SMarc Bonnici * @address_range_array: 52e0b1a6d5SMarc Bonnici * Array of &struct ffa_cons_mrd entries. 53e0b1a6d5SMarc Bonnici */ 54e0b1a6d5SMarc Bonnici struct ffa_comp_mrd { 55e0b1a6d5SMarc Bonnici uint32_t total_page_count; 56e0b1a6d5SMarc Bonnici uint32_t address_range_count; 57e0b1a6d5SMarc Bonnici uint64_t reserved_8_15; 58e0b1a6d5SMarc Bonnici struct ffa_cons_mrd address_range_array[]; 59e0b1a6d5SMarc Bonnici }; 60e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_comp_mrd) == 16, assert_ffa_comp_mrd_size_mismatch); 61e0b1a6d5SMarc Bonnici 62e0b1a6d5SMarc Bonnici /** 63e0b1a6d5SMarc Bonnici * typedef ffa_mem_attr8_t - Memory region attributes 64e0b1a6d5SMarc Bonnici * 65e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGNRNE: 66e0b1a6d5SMarc Bonnici * Device-nGnRnE. 67e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGNRE: 68e0b1a6d5SMarc Bonnici * Device-nGnRE. 69e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGRE: 70e0b1a6d5SMarc Bonnici * Device-nGRE. 71e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_GRE: 72e0b1a6d5SMarc Bonnici * Device-GRE. 73e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED 74e0b1a6d5SMarc Bonnici * Normal memory. Non-cacheable. 75e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB 76e0b1a6d5SMarc Bonnici * Normal memory. Write-back cached. 77e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NON_SHAREABLE 78e0b1a6d5SMarc Bonnici * Non-shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 79e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_OUTER_SHAREABLE 80e0b1a6d5SMarc Bonnici * Outer Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 81e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_INNER_SHAREABLE 82e0b1a6d5SMarc Bonnici * Inner Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 83e0b1a6d5SMarc Bonnici */ 84e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_attr8_t; 85e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGNRNE ((1U << 4) | (0x0U << 2)) 86e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGNRE ((1U << 4) | (0x1U << 2)) 87e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGRE ((1U << 4) | (0x2U << 2)) 88e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_GRE ((1U << 4) | (0x3U << 2)) 89e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED ((2U << 4) | (0x1U << 2)) 90e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB ((2U << 4) | (0x3U << 2)) 91e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NON_SHAREABLE (0x0U << 0) 92e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_OUTER_SHAREABLE (0x2U << 0) 93e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_INNER_SHAREABLE (0x3U << 0) 94e0b1a6d5SMarc Bonnici 95e0b1a6d5SMarc Bonnici /** 96e0b1a6d5SMarc Bonnici * typedef ffa_mem_perm8_t - Memory access permissions 97e0b1a6d5SMarc Bonnici * 98e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_RO 99e0b1a6d5SMarc Bonnici * Request or specify read-only mapping. 100e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_RW 101e0b1a6d5SMarc Bonnici * Request or allow read-write mapping. 102e0b1a6d5SMarc Bonnici * * @FFA_MEM_PERM_NX 103e0b1a6d5SMarc Bonnici * Deny executable mapping. 104e0b1a6d5SMarc Bonnici * * @FFA_MEM_PERM_X 105e0b1a6d5SMarc Bonnici * Request executable mapping. 106e0b1a6d5SMarc Bonnici */ 107e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_perm8_t; 108e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_RO (1U << 0) 109e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_RW (1U << 1) 110e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_NX (1U << 2) 111e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_X (1U << 3) 112e0b1a6d5SMarc Bonnici 113e0b1a6d5SMarc Bonnici /** 114e0b1a6d5SMarc Bonnici * typedef ffa_mem_flag8_t - Endpoint memory flags 115e0b1a6d5SMarc Bonnici * 116e0b1a6d5SMarc Bonnici * * @FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER 117e0b1a6d5SMarc Bonnici * Non-retrieval Borrower. Memory region must not be or was not retrieved on 118e0b1a6d5SMarc Bonnici * behalf of this endpoint. 119e0b1a6d5SMarc Bonnici */ 120e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_flag8_t; 121e0b1a6d5SMarc Bonnici #define FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER (1U << 0) 122e0b1a6d5SMarc Bonnici 123e0b1a6d5SMarc Bonnici /** 124e0b1a6d5SMarc Bonnici * typedef ffa_mtd_flag32_t - Memory transaction descriptor flags 125e0b1a6d5SMarc Bonnici * 126e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ZERO_MEMORY 127e0b1a6d5SMarc Bonnici * Zero memory after unmapping from sender (must be 0 for share). 128e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TIME_SLICING 129e0b1a6d5SMarc Bonnici * Not supported by this implementation. 130e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH 131e0b1a6d5SMarc Bonnici * Zero memory after unmapping from borrowers (must be 0 for share). 132e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TYPE_MASK 133e0b1a6d5SMarc Bonnici * Bit-mask to extract memory management transaction type from flags. 134e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TYPE_SHARE_MEMORY 135e0b1a6d5SMarc Bonnici * Share memory transaction flag. 136e0b1a6d5SMarc Bonnici * Used by @SMC_FC_FFA_MEM_RETRIEVE_RESP to indicate that memory came from 137e0b1a6d5SMarc Bonnici * @SMC_FC_FFA_MEM_SHARE and by @SMC_FC_FFA_MEM_RETRIEVE_REQ to specify that 138e0b1a6d5SMarc Bonnici * it must have. 139e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK 140e0b1a6d5SMarc Bonnici * Not supported by this implementation. 141e0b1a6d5SMarc Bonnici */ 142e0b1a6d5SMarc Bonnici typedef uint32_t ffa_mtd_flag32_t; 143e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ZERO_MEMORY (1U << 0) 144e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TIME_SLICING (1U << 1) 145e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH (1U << 2) 146e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_MASK (3U << 3) 147e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_SHARE_MEMORY (1U << 3) 148e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_LEND_MEMORY (1U << 4) 149e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK (0x1FU << 5) 150e0b1a6d5SMarc Bonnici 151e0b1a6d5SMarc Bonnici /** 152e0b1a6d5SMarc Bonnici * struct ffa_mapd - Memory access permissions descriptor 153e0b1a6d5SMarc Bonnici * @endpoint_id: 154e0b1a6d5SMarc Bonnici * Endpoint id that @memory_access_permissions and @flags apply to. 155e0b1a6d5SMarc Bonnici * (&typedef ffa_endpoint_id16_t). 156e0b1a6d5SMarc Bonnici * @memory_access_permissions: 157e0b1a6d5SMarc Bonnici * FFA_MEM_PERM_* values or'ed together (&typedef ffa_mem_perm8_t). 158e0b1a6d5SMarc Bonnici * @flags: 159e0b1a6d5SMarc Bonnici * FFA_MEM_FLAG_* values or'ed together (&typedef ffa_mem_flag8_t). 160e0b1a6d5SMarc Bonnici */ 161e0b1a6d5SMarc Bonnici struct ffa_mapd { 162e0b1a6d5SMarc Bonnici ffa_endpoint_id16_t endpoint_id; 163e0b1a6d5SMarc Bonnici ffa_mem_perm8_t memory_access_permissions; 164e0b1a6d5SMarc Bonnici ffa_mem_flag8_t flags; 165e0b1a6d5SMarc Bonnici }; 166e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_mapd) == 4, assert_ffa_mapd_size_mismatch); 167e0b1a6d5SMarc Bonnici 168e0b1a6d5SMarc Bonnici /** 169e0b1a6d5SMarc Bonnici * struct ffa_emad_v1_0 - Endpoint memory access descriptor. 170e0b1a6d5SMarc Bonnici * @mapd: &struct ffa_mapd. 171e0b1a6d5SMarc Bonnici * @comp_mrd_offset: 172e0b1a6d5SMarc Bonnici * Offset of &struct ffa_comp_mrd from start of &struct ffa_mtd_v1_0. 173e0b1a6d5SMarc Bonnici * @reserved_8_15: 174e0b1a6d5SMarc Bonnici * Reserved bytes 8-15. Must be 0. 175e0b1a6d5SMarc Bonnici */ 176e0b1a6d5SMarc Bonnici struct ffa_emad_v1_0 { 177e0b1a6d5SMarc Bonnici struct ffa_mapd mapd; 178e0b1a6d5SMarc Bonnici uint32_t comp_mrd_offset; 179e0b1a6d5SMarc Bonnici uint64_t reserved_8_15; 180e0b1a6d5SMarc Bonnici }; 181e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_emad_v1_0) == 16, assert_ffa_emad_v1_0_size_mismatch); 182e0b1a6d5SMarc Bonnici 183e0b1a6d5SMarc Bonnici /** 184e0b1a6d5SMarc Bonnici * struct ffa_mtd_v1_0 - Memory transaction descriptor. 185e0b1a6d5SMarc Bonnici * @sender_id: 186e0b1a6d5SMarc Bonnici * Sender endpoint id. 187e0b1a6d5SMarc Bonnici * @memory_region_attributes: 188e0b1a6d5SMarc Bonnici * FFA_MEM_ATTR_* values or'ed together (&typedef ffa_mem_attr8_t). 189e0b1a6d5SMarc Bonnici * @reserved_3: 190e0b1a6d5SMarc Bonnici * Reserved bytes 3. Must be 0. 191e0b1a6d5SMarc Bonnici * @flags: 192e0b1a6d5SMarc Bonnici * FFA_MTD_FLAG_* values or'ed together (&typedef ffa_mtd_flag32_t). 193e0b1a6d5SMarc Bonnici * @handle: 194e0b1a6d5SMarc Bonnici * Id of shared memory object. Must be 0 for MEM_SHARE or MEM_LEND. 195e0b1a6d5SMarc Bonnici * @tag: Client allocated tag. Must match original value. 196e0b1a6d5SMarc Bonnici * @reserved_24_27: 197e0b1a6d5SMarc Bonnici * Reserved bytes 24-27. Must be 0. 198e0b1a6d5SMarc Bonnici * @emad_count: 199*f0244e5dSMarc Bonnici * Number of entries in @emad. 200e0b1a6d5SMarc Bonnici * @emad: 201e0b1a6d5SMarc Bonnici * Endpoint memory access descriptor array (see @struct ffa_emad_v1_0). 202e0b1a6d5SMarc Bonnici */ 203e0b1a6d5SMarc Bonnici struct ffa_mtd_v1_0 { 204e0b1a6d5SMarc Bonnici ffa_endpoint_id16_t sender_id; 205e0b1a6d5SMarc Bonnici ffa_mem_attr8_t memory_region_attributes; 206e0b1a6d5SMarc Bonnici uint8_t reserved_3; 207e0b1a6d5SMarc Bonnici ffa_mtd_flag32_t flags; 208e0b1a6d5SMarc Bonnici uint64_t handle; 209e0b1a6d5SMarc Bonnici uint64_t tag; 210e0b1a6d5SMarc Bonnici uint32_t reserved_24_27; 211e0b1a6d5SMarc Bonnici uint32_t emad_count; 212e0b1a6d5SMarc Bonnici struct ffa_emad_v1_0 emad[]; 213e0b1a6d5SMarc Bonnici }; 214e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_mtd_v1_0) == 32, assert_ffa_mtd_size_v1_0_mismatch); 215e0b1a6d5SMarc Bonnici 216e0b1a6d5SMarc Bonnici #endif /* EL3_SPMC_FFA_MEM_H */ 217