1 2 /* 3 * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #include <string.h> 9 10 #include <platform_def.h> 11 12 #include <arch_helpers.h> 13 #include <common/bl_common.h> 14 #include <lib/xlat_tables/xlat_tables_v2.h> 15 #include <services/el3_spmc_ffa_memory.h> 16 #if ENABLE_RME 17 #include <services/rmm_core_manifest.h> 18 #endif 19 20 #include <plat/common/platform.h> 21 #include "qemu_private.h" 22 23 #define MAP_DEVICE0 MAP_REGION_FLAT(DEVICE0_BASE, \ 24 DEVICE0_SIZE, \ 25 MT_DEVICE | MT_RW | EL3_PAS) 26 27 #ifdef DEVICE1_BASE 28 #define MAP_DEVICE1 MAP_REGION_FLAT(DEVICE1_BASE, \ 29 DEVICE1_SIZE, \ 30 MT_DEVICE | MT_RW | EL3_PAS) 31 #endif 32 33 #ifdef DEVICE2_BASE 34 #define MAP_DEVICE2 MAP_REGION_FLAT(DEVICE2_BASE, \ 35 DEVICE2_SIZE, \ 36 MT_DEVICE | MT_RW | EL3_PAS) 37 #endif 38 39 #define MAP_SHARED_RAM MAP_REGION_FLAT(SHARED_RAM_BASE, \ 40 SHARED_RAM_SIZE, \ 41 MT_DEVICE | MT_RW | EL3_PAS) 42 43 #define MAP_BL32_MEM MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE, \ 44 MT_MEMORY | MT_RW | EL3_PAS) 45 46 #define MAP_NS_DRAM0 MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE, \ 47 MT_MEMORY | MT_RW | MT_NS) 48 49 #define MAP_FLASH0 MAP_REGION_FLAT(QEMU_FLASH0_BASE, QEMU_FLASH0_SIZE, \ 50 MT_MEMORY | MT_RO | EL3_PAS) 51 52 #define MAP_FLASH1 MAP_REGION_FLAT(QEMU_FLASH1_BASE, QEMU_FLASH1_SIZE, \ 53 MT_MEMORY | MT_RO | EL3_PAS) 54 55 #ifdef FW_HANDOFF_BASE 56 #define MAP_FW_HANDOFF MAP_REGION_FLAT(FW_HANDOFF_BASE, FW_HANDOFF_SIZE, \ 57 MT_MEMORY | MT_RW | EL3_PAS) 58 #endif 59 #ifdef FW_NS_HANDOFF_BASE 60 #define MAP_FW_NS_HANDOFF MAP_REGION_FLAT(FW_NS_HANDOFF_BASE, FW_HANDOFF_SIZE, \ 61 MT_MEMORY | MT_RW | MT_NS) 62 #endif 63 /* 64 * Table of regions for various BL stages to map using the MMU. 65 * This doesn't include TZRAM as the 'mem_layout' argument passed to 66 * arm_configure_mmu_elx() will give the available subset of that, 67 */ 68 #ifdef IMAGE_BL1 69 static const mmap_region_t plat_qemu_mmap[] = { 70 MAP_FLASH0, 71 MAP_FLASH1, 72 MAP_SHARED_RAM, 73 MAP_DEVICE0, 74 #ifdef MAP_DEVICE1 75 MAP_DEVICE1, 76 #endif 77 #ifdef MAP_DEVICE2 78 MAP_DEVICE2, 79 #endif 80 {0} 81 }; 82 #endif 83 #ifdef IMAGE_BL2 84 static const mmap_region_t plat_qemu_mmap[] = { 85 MAP_FLASH0, 86 MAP_FLASH1, 87 MAP_SHARED_RAM, 88 MAP_DEVICE0, 89 #ifdef MAP_DEVICE1 90 MAP_DEVICE1, 91 #endif 92 #ifdef MAP_DEVICE2 93 MAP_DEVICE2, 94 #endif 95 MAP_NS_DRAM0, 96 #if SPM_MM 97 QEMU_SP_IMAGE_MMAP, 98 #else 99 MAP_BL32_MEM, 100 #endif 101 #ifdef MAP_FW_HANDOFF 102 MAP_FW_HANDOFF, 103 #endif 104 {0} 105 }; 106 #endif 107 #ifdef IMAGE_BL31 108 static const mmap_region_t plat_qemu_mmap[] = { 109 MAP_SHARED_RAM, 110 MAP_DEVICE0, 111 #ifdef MAP_DEVICE1 112 MAP_DEVICE1, 113 #endif 114 #ifdef MAP_DEVICE2 115 MAP_DEVICE2, 116 #endif 117 #ifdef MAP_FW_HANDOFF 118 MAP_FW_HANDOFF, 119 #endif 120 #ifdef MAP_FW_NS_HANDOFF 121 MAP_FW_NS_HANDOFF, 122 #endif 123 #if SPM_MM 124 MAP_NS_DRAM0, 125 QEMU_SPM_BUF_EL3_MMAP, 126 #elif !SPMC_AT_EL3 127 MAP_BL32_MEM, 128 #endif 129 {0} 130 }; 131 #endif 132 #ifdef IMAGE_BL32 133 static const mmap_region_t plat_qemu_mmap[] = { 134 MAP_SHARED_RAM, 135 MAP_DEVICE0, 136 #ifdef MAP_DEVICE1 137 MAP_DEVICE1, 138 #endif 139 #ifdef MAP_DEVICE2 140 MAP_DEVICE2, 141 #endif 142 {0} 143 }; 144 #endif 145 146 #ifdef IMAGE_RMM 147 const mmap_region_t plat_qemu_mmap[] = { 148 MAP_DEVICE0, 149 #ifdef MAP_DEVICE1 150 MAP_DEVICE1, 151 #endif 152 #ifdef MAP_DEVICE2 153 MAP_DEVICE2, 154 #endif 155 {0} 156 }; 157 #endif 158 159 /******************************************************************************* 160 * Returns QEMU platform specific memory map regions. 161 ******************************************************************************/ 162 const mmap_region_t *plat_qemu_get_mmap(void) 163 { 164 return plat_qemu_mmap; 165 } 166 167 #if MEASURED_BOOT || TRUSTED_BOARD_BOOT 168 int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 169 { 170 return get_mbedtls_heap_helper(heap_addr, heap_size); 171 } 172 #endif 173 174 #if SPMC_AT_EL3 175 /* 176 * When using the EL3 SPMC implementation allocate the datastore 177 * for tracking shared memory descriptors in normal memory. 178 */ 179 #define PLAT_SPMC_SHMEM_DATASTORE_SIZE 64 * 1024 180 181 uint8_t plat_spmc_shmem_datastore[PLAT_SPMC_SHMEM_DATASTORE_SIZE]; 182 183 int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size) 184 { 185 *datastore = plat_spmc_shmem_datastore; 186 *size = PLAT_SPMC_SHMEM_DATASTORE_SIZE; 187 return 0; 188 } 189 190 int plat_spmc_shmem_begin(struct ffa_mtd *desc) 191 { 192 return 0; 193 } 194 195 int plat_spmc_shmem_reclaim(struct ffa_mtd *desc) 196 { 197 return 0; 198 } 199 #endif 200 201 #if defined(SPD_spmd) && (SPMC_AT_EL3 == 0) 202 /* 203 * A dummy implementation of the platform handler for Group0 secure interrupt. 204 */ 205 int plat_spmd_handle_group0_interrupt(uint32_t intid) 206 { 207 (void)intid; 208 return -1; 209 } 210 #endif /*defined(SPD_spmd) && (SPMC_AT_EL3 == 0)*/ 211 212 #if ENABLE_RME 213 /* 214 * Get a pointer to the RMM-EL3 Shared buffer and return it 215 * through the pointer passed as parameter. 216 * 217 * This function returns the size of the shared buffer. 218 */ 219 size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared) 220 { 221 *shared = (uintptr_t)RMM_SHARED_BASE; 222 223 return (size_t)RMM_SHARED_SIZE; 224 } 225 226 int plat_rmmd_load_manifest(struct rmm_manifest *manifest) 227 { 228 uint64_t checksum; 229 uintptr_t base; 230 uint64_t size; 231 size_t num_banks = 1; 232 size_t num_consoles = 1; 233 struct ns_dram_bank *bank_ptr; 234 struct console_info *console_ptr; 235 236 assert(manifest != NULL); 237 238 manifest->version = RMMD_MANIFEST_VERSION; 239 manifest->padding = 0U; /* RES0 */ 240 manifest->plat_data = (uintptr_t)NULL; 241 manifest->plat_dram.num_banks = num_banks; 242 manifest->plat_console.num_consoles = num_consoles; 243 244 /* 245 * Boot manifest structure illustration: 246 * 247 * +----------------------------------------+ 248 * | offset | field | comment | 249 * +----------+--------------+--------------+ 250 * | 0 | version | 0x00000003 | 251 * +----------+--------------+--------------+ 252 * | 4 | padding | 0x00000000 | 253 * +----------+--------------+--------------+ 254 * | 8 | plat_data | NULL | 255 * +----------+--------------+--------------+ 256 * | 16 | num_banks | | 257 * +----------+--------------+ | 258 * | 24 | banks | plat_dram | 259 * +----------+--------------+ | 260 * | 32 | checksum | | 261 * +----------+--------------+--------------+ 262 * | 40 | num_consoles | | 263 * +----------+--------------+ | 264 * | 48 | consoles | plat_console | 265 * +----------+--------------+ | 266 * | 56 | checksum | | 267 * +----------+--------------+--------------+ 268 * | 64 | base 0 | | 269 * +----------+--------------+ bank[0] | 270 * | 72 | size 0 | | 271 * +----------+--------------+--------------+ 272 * | 80 | base | | 273 * +----------+--------------+ | 274 * | 88 | map_pages | | 275 * +----------+--------------+ | 276 * | 96 | name | | 277 * +----------+--------------+ consoles[0] | 278 * | 104 | clk_in_hz | | 279 * +----------+--------------+ | 280 * | 112 | baud_rate | | 281 * +----------+--------------+ | 282 * | 120 | flags | | 283 * +----------+--------------+--------------+ 284 */ 285 bank_ptr = (struct ns_dram_bank *) 286 (((uintptr_t)manifest) + sizeof(*manifest)); 287 288 console_ptr = (struct console_info *) 289 ((uintptr_t)bank_ptr + (num_banks * sizeof(*bank_ptr))); 290 291 manifest->plat_dram.banks = bank_ptr; 292 manifest->plat_console.consoles = console_ptr; 293 294 /* Ensure the manifest is not larger than the shared buffer */ 295 assert((sizeof(struct rmm_manifest) + 296 (sizeof(struct console_info) * num_consoles) + 297 (sizeof(struct ns_dram_bank) * num_banks)) <= RMM_SHARED_SIZE); 298 299 /* Calculate checksum of plat_dram structure */ 300 checksum = num_banks + (uint64_t)bank_ptr; 301 302 base = NS_DRAM0_BASE; 303 size = NS_DRAM0_SIZE; 304 bank_ptr[0].base = base; 305 bank_ptr[0].size = size; 306 checksum += base + size; 307 308 /* Checksum must be 0 */ 309 manifest->plat_dram.checksum = ~checksum + 1UL; 310 311 /* Calculate the checksum of the plat_consoles structure */ 312 checksum = num_consoles + (uint64_t)console_ptr; 313 314 /* Zero out the console info struct */ 315 memset((void *)console_ptr, 0, sizeof(struct console_info) * num_consoles); 316 317 console_ptr[0].map_pages = 1; 318 console_ptr[0].base = PLAT_QEMU_BOOT_UART_BASE; 319 console_ptr[0].clk_in_hz = PLAT_QEMU_BOOT_UART_CLK_IN_HZ; 320 console_ptr[0].baud_rate = PLAT_QEMU_CONSOLE_BAUDRATE; 321 322 strlcpy(console_ptr[0].name, "pl011", sizeof(console_ptr[0].name)); 323 324 /* Update checksum */ 325 checksum += console_ptr[0].base + console_ptr[0].map_pages + 326 console_ptr[0].clk_in_hz + console_ptr[0].baud_rate; 327 328 /* Checksum must be 0 */ 329 manifest->plat_console.checksum = ~checksum + 1UL; 330 331 return 0; 332 } 333 #endif /* ENABLE_RME */ 334