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 /** 637e804f96SMarc Bonnici * typedef ffa_mem_attr8_t - Memory region attributes v1.0. 647e804f96SMarc Bonnici * typedef ffa_mem_attr16_t - Memory region attributes v1.1. 65e0b1a6d5SMarc Bonnici * 66*0560b53eSMarc Bonnici * * @FFA_MEM_ATTR_NS_BIT: 67*0560b53eSMarc Bonnici * Memory security state. 68e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGNRNE: 69e0b1a6d5SMarc Bonnici * Device-nGnRnE. 70e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGNRE: 71e0b1a6d5SMarc Bonnici * Device-nGnRE. 72e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_NGRE: 73e0b1a6d5SMarc Bonnici * Device-nGRE. 74e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_DEVICE_GRE: 75e0b1a6d5SMarc Bonnici * Device-GRE. 76e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED 77e0b1a6d5SMarc Bonnici * Normal memory. Non-cacheable. 78e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB 79e0b1a6d5SMarc Bonnici * Normal memory. Write-back cached. 80e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_NON_SHAREABLE 81e0b1a6d5SMarc Bonnici * Non-shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 82e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_OUTER_SHAREABLE 83e0b1a6d5SMarc Bonnici * Outer Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 84e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_INNER_SHAREABLE 85e0b1a6d5SMarc Bonnici * Inner Shareable. Combine with FFA_MEM_ATTR_NORMAL_MEMORY_*. 86e0b1a6d5SMarc Bonnici */ 87e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_attr8_t; 887e804f96SMarc Bonnici typedef uint16_t ffa_mem_attr16_t; 89*0560b53eSMarc Bonnici #define FFA_MEM_ATTR_NS_BIT (0x1U << 6) 90e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGNRNE ((1U << 4) | (0x0U << 2)) 91e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGNRE ((1U << 4) | (0x1U << 2)) 92e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_NGRE ((1U << 4) | (0x2U << 2)) 93e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_DEVICE_GRE ((1U << 4) | (0x3U << 2)) 94e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NORMAL_MEMORY_UNCACHED ((2U << 4) | (0x1U << 2)) 95e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NORMAL_MEMORY_CACHED_WB ((2U << 4) | (0x3U << 2)) 96e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_NON_SHAREABLE (0x0U << 0) 97e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_OUTER_SHAREABLE (0x2U << 0) 98e0b1a6d5SMarc Bonnici #define FFA_MEM_ATTR_INNER_SHAREABLE (0x3U << 0) 99e0b1a6d5SMarc Bonnici 100e0b1a6d5SMarc Bonnici /** 101e0b1a6d5SMarc Bonnici * typedef ffa_mem_perm8_t - Memory access permissions 102e0b1a6d5SMarc Bonnici * 103e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_RO 104e0b1a6d5SMarc Bonnici * Request or specify read-only mapping. 105e0b1a6d5SMarc Bonnici * * @FFA_MEM_ATTR_RW 106e0b1a6d5SMarc Bonnici * Request or allow read-write mapping. 107e0b1a6d5SMarc Bonnici * * @FFA_MEM_PERM_NX 108e0b1a6d5SMarc Bonnici * Deny executable mapping. 109e0b1a6d5SMarc Bonnici * * @FFA_MEM_PERM_X 110e0b1a6d5SMarc Bonnici * Request executable mapping. 111e0b1a6d5SMarc Bonnici */ 112e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_perm8_t; 113e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_RO (1U << 0) 114e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_RW (1U << 1) 115e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_NX (1U << 2) 116e0b1a6d5SMarc Bonnici #define FFA_MEM_PERM_X (1U << 3) 117e0b1a6d5SMarc Bonnici 118e0b1a6d5SMarc Bonnici /** 119e0b1a6d5SMarc Bonnici * typedef ffa_mem_flag8_t - Endpoint memory flags 120e0b1a6d5SMarc Bonnici * 121e0b1a6d5SMarc Bonnici * * @FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER 122e0b1a6d5SMarc Bonnici * Non-retrieval Borrower. Memory region must not be or was not retrieved on 123e0b1a6d5SMarc Bonnici * behalf of this endpoint. 124e0b1a6d5SMarc Bonnici */ 125e0b1a6d5SMarc Bonnici typedef uint8_t ffa_mem_flag8_t; 126e0b1a6d5SMarc Bonnici #define FFA_MEM_FLAG_NON_RETRIEVAL_BORROWER (1U << 0) 127e0b1a6d5SMarc Bonnici 128e0b1a6d5SMarc Bonnici /** 129e0b1a6d5SMarc Bonnici * typedef ffa_mtd_flag32_t - Memory transaction descriptor flags 130e0b1a6d5SMarc Bonnici * 131e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ZERO_MEMORY 132e0b1a6d5SMarc Bonnici * Zero memory after unmapping from sender (must be 0 for share). 133e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TIME_SLICING 134e0b1a6d5SMarc Bonnici * Not supported by this implementation. 135e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH 136e0b1a6d5SMarc Bonnici * Zero memory after unmapping from borrowers (must be 0 for share). 137e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TYPE_MASK 138e0b1a6d5SMarc Bonnici * Bit-mask to extract memory management transaction type from flags. 139e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_TYPE_SHARE_MEMORY 140e0b1a6d5SMarc Bonnici * Share memory transaction flag. 141e0b1a6d5SMarc Bonnici * Used by @SMC_FC_FFA_MEM_RETRIEVE_RESP to indicate that memory came from 142e0b1a6d5SMarc Bonnici * @SMC_FC_FFA_MEM_SHARE and by @SMC_FC_FFA_MEM_RETRIEVE_REQ to specify that 143e0b1a6d5SMarc Bonnici * it must have. 144e0b1a6d5SMarc Bonnici * * @FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK 145e0b1a6d5SMarc Bonnici * Not supported by this implementation. 146e0b1a6d5SMarc Bonnici */ 147e0b1a6d5SMarc Bonnici typedef uint32_t ffa_mtd_flag32_t; 148e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ZERO_MEMORY (1U << 0) 149e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TIME_SLICING (1U << 1) 150e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ZERO_MEMORY_AFTER_RELINQUISH (1U << 2) 151e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_MASK (3U << 3) 152e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_SHARE_MEMORY (1U << 3) 153e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_TYPE_LEND_MEMORY (1U << 4) 154e0b1a6d5SMarc Bonnici #define FFA_MTD_FLAG_ADDRESS_RANGE_ALIGNMENT_HINT_MASK (0x1FU << 5) 155e0b1a6d5SMarc Bonnici 156e0b1a6d5SMarc Bonnici /** 157e0b1a6d5SMarc Bonnici * struct ffa_mapd - Memory access permissions descriptor 158e0b1a6d5SMarc Bonnici * @endpoint_id: 159e0b1a6d5SMarc Bonnici * Endpoint id that @memory_access_permissions and @flags apply to. 160e0b1a6d5SMarc Bonnici * (&typedef ffa_endpoint_id16_t). 161e0b1a6d5SMarc Bonnici * @memory_access_permissions: 162e0b1a6d5SMarc Bonnici * FFA_MEM_PERM_* values or'ed together (&typedef ffa_mem_perm8_t). 163e0b1a6d5SMarc Bonnici * @flags: 164e0b1a6d5SMarc Bonnici * FFA_MEM_FLAG_* values or'ed together (&typedef ffa_mem_flag8_t). 165e0b1a6d5SMarc Bonnici */ 166e0b1a6d5SMarc Bonnici struct ffa_mapd { 167e0b1a6d5SMarc Bonnici ffa_endpoint_id16_t endpoint_id; 168e0b1a6d5SMarc Bonnici ffa_mem_perm8_t memory_access_permissions; 169e0b1a6d5SMarc Bonnici ffa_mem_flag8_t flags; 170e0b1a6d5SMarc Bonnici }; 171e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_mapd) == 4, assert_ffa_mapd_size_mismatch); 172e0b1a6d5SMarc Bonnici 173e0b1a6d5SMarc Bonnici /** 174e0b1a6d5SMarc Bonnici * struct ffa_emad_v1_0 - Endpoint memory access descriptor. 175e0b1a6d5SMarc Bonnici * @mapd: &struct ffa_mapd. 176e0b1a6d5SMarc Bonnici * @comp_mrd_offset: 177e0b1a6d5SMarc Bonnici * Offset of &struct ffa_comp_mrd from start of &struct ffa_mtd_v1_0. 178e0b1a6d5SMarc Bonnici * @reserved_8_15: 179e0b1a6d5SMarc Bonnici * Reserved bytes 8-15. Must be 0. 180e0b1a6d5SMarc Bonnici */ 181e0b1a6d5SMarc Bonnici struct ffa_emad_v1_0 { 182e0b1a6d5SMarc Bonnici struct ffa_mapd mapd; 183e0b1a6d5SMarc Bonnici uint32_t comp_mrd_offset; 184e0b1a6d5SMarc Bonnici uint64_t reserved_8_15; 185e0b1a6d5SMarc Bonnici }; 186e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_emad_v1_0) == 16, assert_ffa_emad_v1_0_size_mismatch); 187e0b1a6d5SMarc Bonnici 188e0b1a6d5SMarc Bonnici /** 189e0b1a6d5SMarc Bonnici * struct ffa_mtd_v1_0 - Memory transaction descriptor. 190e0b1a6d5SMarc Bonnici * @sender_id: 191e0b1a6d5SMarc Bonnici * Sender endpoint id. 192e0b1a6d5SMarc Bonnici * @memory_region_attributes: 193e0b1a6d5SMarc Bonnici * FFA_MEM_ATTR_* values or'ed together (&typedef ffa_mem_attr8_t). 194e0b1a6d5SMarc Bonnici * @reserved_3: 195e0b1a6d5SMarc Bonnici * Reserved bytes 3. Must be 0. 196e0b1a6d5SMarc Bonnici * @flags: 197e0b1a6d5SMarc Bonnici * FFA_MTD_FLAG_* values or'ed together (&typedef ffa_mtd_flag32_t). 198e0b1a6d5SMarc Bonnici * @handle: 199e0b1a6d5SMarc Bonnici * Id of shared memory object. Must be 0 for MEM_SHARE or MEM_LEND. 200e0b1a6d5SMarc Bonnici * @tag: Client allocated tag. Must match original value. 201e0b1a6d5SMarc Bonnici * @reserved_24_27: 202e0b1a6d5SMarc Bonnici * Reserved bytes 24-27. Must be 0. 203e0b1a6d5SMarc Bonnici * @emad_count: 204f0244e5dSMarc Bonnici * Number of entries in @emad. 205e0b1a6d5SMarc Bonnici * @emad: 206e0b1a6d5SMarc Bonnici * Endpoint memory access descriptor array (see @struct ffa_emad_v1_0). 207e0b1a6d5SMarc Bonnici */ 208e0b1a6d5SMarc Bonnici struct ffa_mtd_v1_0 { 209e0b1a6d5SMarc Bonnici ffa_endpoint_id16_t sender_id; 210e0b1a6d5SMarc Bonnici ffa_mem_attr8_t memory_region_attributes; 211e0b1a6d5SMarc Bonnici uint8_t reserved_3; 212e0b1a6d5SMarc Bonnici ffa_mtd_flag32_t flags; 213e0b1a6d5SMarc Bonnici uint64_t handle; 214e0b1a6d5SMarc Bonnici uint64_t tag; 215e0b1a6d5SMarc Bonnici uint32_t reserved_24_27; 216e0b1a6d5SMarc Bonnici uint32_t emad_count; 217e0b1a6d5SMarc Bonnici struct ffa_emad_v1_0 emad[]; 218e0b1a6d5SMarc Bonnici }; 219e0b1a6d5SMarc Bonnici CASSERT(sizeof(struct ffa_mtd_v1_0) == 32, assert_ffa_mtd_size_v1_0_mismatch); 220e0b1a6d5SMarc Bonnici 2217e804f96SMarc Bonnici /** 2227e804f96SMarc Bonnici * struct ffa_mtd - Memory transaction descriptor for FF-A v1.1. 2237e804f96SMarc Bonnici * @sender_id: 2247e804f96SMarc Bonnici * Sender endpoint id. 2257e804f96SMarc Bonnici * @memory_region_attributes: 2267e804f96SMarc Bonnici * FFA_MEM_ATTR_* values or'ed together (&typedef ffa_mem_attr16_t). 2277e804f96SMarc Bonnici * @flags: 2287e804f96SMarc Bonnici * FFA_MTD_FLAG_* values or'ed together (&typedef ffa_mtd_flag32_t). 2297e804f96SMarc Bonnici * @handle: 2307e804f96SMarc Bonnici * Id of shared memory object. Must be 0 for MEM_SHARE or MEM_LEND. 2317e804f96SMarc Bonnici * @tag: Client allocated tag. Must match original value. 2327e804f96SMarc Bonnici * @emad_size: 2337e804f96SMarc Bonnici * Size of the emad descriptor. 2347e804f96SMarc Bonnici * @emad_count: 2357e804f96SMarc Bonnici * Number of entries in the emad array. 2367e804f96SMarc Bonnici * @emad_offset: 2377e804f96SMarc Bonnici * Offset from the beginning of the descriptor to the location of the 2387e804f96SMarc Bonnici * memory access descriptor array (see @struct ffa_emad_v1_0). 2397e804f96SMarc Bonnici * @reserved_36_39: 2407e804f96SMarc Bonnici * Reserved bytes 36-39. Must be 0. 2417e804f96SMarc Bonnici * @reserved_40_47: 2427e804f96SMarc Bonnici * Reserved bytes 44-47. Must be 0. 2437e804f96SMarc Bonnici */ 2447e804f96SMarc Bonnici struct ffa_mtd { 2457e804f96SMarc Bonnici ffa_endpoint_id16_t sender_id; 2467e804f96SMarc Bonnici ffa_mem_attr16_t memory_region_attributes; 2477e804f96SMarc Bonnici ffa_mtd_flag32_t flags; 2487e804f96SMarc Bonnici uint64_t handle; 2497e804f96SMarc Bonnici uint64_t tag; 2507e804f96SMarc Bonnici uint32_t emad_size; 2517e804f96SMarc Bonnici uint32_t emad_count; 2527e804f96SMarc Bonnici uint32_t emad_offset; 2537e804f96SMarc Bonnici uint32_t reserved_36_39; 2547e804f96SMarc Bonnici uint64_t reserved_40_47; 2557e804f96SMarc Bonnici }; 2567e804f96SMarc Bonnici CASSERT(sizeof(struct ffa_mtd) == 48, assert_ffa_mtd_size_mismatch); 2577e804f96SMarc Bonnici 258e0b1a6d5SMarc Bonnici #endif /* EL3_SPMC_FFA_MEM_H */ 259