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