1*91f16700Schasinglulu 2*91f16700Schasinglulu /* 3*91f16700Schasinglulu * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #include <platform_def.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <arch_helpers.h> 11*91f16700Schasinglulu #include <common/bl_common.h> 12*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h> 13*91f16700Schasinglulu #include <services/el3_spmc_ffa_memory.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <plat/common/platform.h> 16*91f16700Schasinglulu #include "qemu_private.h" 17*91f16700Schasinglulu 18*91f16700Schasinglulu #define MAP_DEVICE0 MAP_REGION_FLAT(DEVICE0_BASE, \ 19*91f16700Schasinglulu DEVICE0_SIZE, \ 20*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE) 21*91f16700Schasinglulu 22*91f16700Schasinglulu #ifdef DEVICE1_BASE 23*91f16700Schasinglulu #define MAP_DEVICE1 MAP_REGION_FLAT(DEVICE1_BASE, \ 24*91f16700Schasinglulu DEVICE1_SIZE, \ 25*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE) 26*91f16700Schasinglulu #endif 27*91f16700Schasinglulu 28*91f16700Schasinglulu #ifdef DEVICE2_BASE 29*91f16700Schasinglulu #define MAP_DEVICE2 MAP_REGION_FLAT(DEVICE2_BASE, \ 30*91f16700Schasinglulu DEVICE2_SIZE, \ 31*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE) 32*91f16700Schasinglulu #endif 33*91f16700Schasinglulu 34*91f16700Schasinglulu #define MAP_SHARED_RAM MAP_REGION_FLAT(SHARED_RAM_BASE, \ 35*91f16700Schasinglulu SHARED_RAM_SIZE, \ 36*91f16700Schasinglulu MT_DEVICE | MT_RW | MT_SECURE) 37*91f16700Schasinglulu 38*91f16700Schasinglulu #define MAP_BL32_MEM MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE, \ 39*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_SECURE) 40*91f16700Schasinglulu 41*91f16700Schasinglulu #define MAP_NS_DRAM0 MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE, \ 42*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_NS) 43*91f16700Schasinglulu 44*91f16700Schasinglulu #define MAP_FLASH0 MAP_REGION_FLAT(QEMU_FLASH0_BASE, QEMU_FLASH0_SIZE, \ 45*91f16700Schasinglulu MT_MEMORY | MT_RO | MT_SECURE) 46*91f16700Schasinglulu 47*91f16700Schasinglulu #define MAP_FLASH1 MAP_REGION_FLAT(QEMU_FLASH1_BASE, QEMU_FLASH1_SIZE, \ 48*91f16700Schasinglulu MT_MEMORY | MT_RO | MT_SECURE) 49*91f16700Schasinglulu 50*91f16700Schasinglulu #ifdef FW_HANDOFF_BASE 51*91f16700Schasinglulu #define MAP_FW_HANDOFF MAP_REGION_FLAT(FW_HANDOFF_BASE, FW_HANDOFF_SIZE, \ 52*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_SECURE) 53*91f16700Schasinglulu #endif 54*91f16700Schasinglulu #ifdef FW_NS_HANDOFF_BASE 55*91f16700Schasinglulu #define MAP_FW_NS_HANDOFF MAP_REGION_FLAT(FW_NS_HANDOFF_BASE, FW_HANDOFF_SIZE, \ 56*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_NS) 57*91f16700Schasinglulu #endif 58*91f16700Schasinglulu /* 59*91f16700Schasinglulu * Table of regions for various BL stages to map using the MMU. 60*91f16700Schasinglulu * This doesn't include TZRAM as the 'mem_layout' argument passed to 61*91f16700Schasinglulu * arm_configure_mmu_elx() will give the available subset of that, 62*91f16700Schasinglulu */ 63*91f16700Schasinglulu #ifdef IMAGE_BL1 64*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = { 65*91f16700Schasinglulu MAP_FLASH0, 66*91f16700Schasinglulu MAP_FLASH1, 67*91f16700Schasinglulu MAP_SHARED_RAM, 68*91f16700Schasinglulu MAP_DEVICE0, 69*91f16700Schasinglulu #ifdef MAP_DEVICE1 70*91f16700Schasinglulu MAP_DEVICE1, 71*91f16700Schasinglulu #endif 72*91f16700Schasinglulu #ifdef MAP_DEVICE2 73*91f16700Schasinglulu MAP_DEVICE2, 74*91f16700Schasinglulu #endif 75*91f16700Schasinglulu {0} 76*91f16700Schasinglulu }; 77*91f16700Schasinglulu #endif 78*91f16700Schasinglulu #ifdef IMAGE_BL2 79*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = { 80*91f16700Schasinglulu MAP_FLASH0, 81*91f16700Schasinglulu MAP_FLASH1, 82*91f16700Schasinglulu MAP_SHARED_RAM, 83*91f16700Schasinglulu MAP_DEVICE0, 84*91f16700Schasinglulu #ifdef MAP_DEVICE1 85*91f16700Schasinglulu MAP_DEVICE1, 86*91f16700Schasinglulu #endif 87*91f16700Schasinglulu #ifdef MAP_DEVICE2 88*91f16700Schasinglulu MAP_DEVICE2, 89*91f16700Schasinglulu #endif 90*91f16700Schasinglulu MAP_NS_DRAM0, 91*91f16700Schasinglulu #if SPM_MM 92*91f16700Schasinglulu QEMU_SP_IMAGE_MMAP, 93*91f16700Schasinglulu #else 94*91f16700Schasinglulu MAP_BL32_MEM, 95*91f16700Schasinglulu #endif 96*91f16700Schasinglulu #ifdef MAP_FW_HANDOFF 97*91f16700Schasinglulu MAP_FW_HANDOFF, 98*91f16700Schasinglulu #endif 99*91f16700Schasinglulu {0} 100*91f16700Schasinglulu }; 101*91f16700Schasinglulu #endif 102*91f16700Schasinglulu #ifdef IMAGE_BL31 103*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = { 104*91f16700Schasinglulu MAP_SHARED_RAM, 105*91f16700Schasinglulu MAP_DEVICE0, 106*91f16700Schasinglulu #ifdef MAP_DEVICE1 107*91f16700Schasinglulu MAP_DEVICE1, 108*91f16700Schasinglulu #endif 109*91f16700Schasinglulu #ifdef MAP_DEVICE2 110*91f16700Schasinglulu MAP_DEVICE2, 111*91f16700Schasinglulu #endif 112*91f16700Schasinglulu #ifdef MAP_FW_HANDOFF 113*91f16700Schasinglulu MAP_FW_HANDOFF, 114*91f16700Schasinglulu #endif 115*91f16700Schasinglulu #ifdef MAP_FW_NS_HANDOFF 116*91f16700Schasinglulu MAP_FW_NS_HANDOFF, 117*91f16700Schasinglulu #endif 118*91f16700Schasinglulu #if SPM_MM 119*91f16700Schasinglulu MAP_NS_DRAM0, 120*91f16700Schasinglulu QEMU_SPM_BUF_EL3_MMAP, 121*91f16700Schasinglulu #elif !SPMC_AT_EL3 122*91f16700Schasinglulu MAP_BL32_MEM, 123*91f16700Schasinglulu #endif 124*91f16700Schasinglulu {0} 125*91f16700Schasinglulu }; 126*91f16700Schasinglulu #endif 127*91f16700Schasinglulu #ifdef IMAGE_BL32 128*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = { 129*91f16700Schasinglulu MAP_SHARED_RAM, 130*91f16700Schasinglulu MAP_DEVICE0, 131*91f16700Schasinglulu #ifdef MAP_DEVICE1 132*91f16700Schasinglulu MAP_DEVICE1, 133*91f16700Schasinglulu #endif 134*91f16700Schasinglulu #ifdef MAP_DEVICE2 135*91f16700Schasinglulu MAP_DEVICE2, 136*91f16700Schasinglulu #endif 137*91f16700Schasinglulu {0} 138*91f16700Schasinglulu }; 139*91f16700Schasinglulu #endif 140*91f16700Schasinglulu 141*91f16700Schasinglulu /******************************************************************************* 142*91f16700Schasinglulu * Returns QEMU platform specific memory map regions. 143*91f16700Schasinglulu ******************************************************************************/ 144*91f16700Schasinglulu const mmap_region_t *plat_qemu_get_mmap(void) 145*91f16700Schasinglulu { 146*91f16700Schasinglulu return plat_qemu_mmap; 147*91f16700Schasinglulu } 148*91f16700Schasinglulu 149*91f16700Schasinglulu #if MEASURED_BOOT || TRUSTED_BOARD_BOOT 150*91f16700Schasinglulu int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 151*91f16700Schasinglulu { 152*91f16700Schasinglulu return get_mbedtls_heap_helper(heap_addr, heap_size); 153*91f16700Schasinglulu } 154*91f16700Schasinglulu #endif 155*91f16700Schasinglulu 156*91f16700Schasinglulu #if SPMC_AT_EL3 157*91f16700Schasinglulu /* 158*91f16700Schasinglulu * When using the EL3 SPMC implementation allocate the datastore 159*91f16700Schasinglulu * for tracking shared memory descriptors in normal memory. 160*91f16700Schasinglulu */ 161*91f16700Schasinglulu #define PLAT_SPMC_SHMEM_DATASTORE_SIZE 64 * 1024 162*91f16700Schasinglulu 163*91f16700Schasinglulu uint8_t plat_spmc_shmem_datastore[PLAT_SPMC_SHMEM_DATASTORE_SIZE]; 164*91f16700Schasinglulu 165*91f16700Schasinglulu int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size) 166*91f16700Schasinglulu { 167*91f16700Schasinglulu *datastore = plat_spmc_shmem_datastore; 168*91f16700Schasinglulu *size = PLAT_SPMC_SHMEM_DATASTORE_SIZE; 169*91f16700Schasinglulu return 0; 170*91f16700Schasinglulu } 171*91f16700Schasinglulu 172*91f16700Schasinglulu int plat_spmc_shmem_begin(struct ffa_mtd *desc) 173*91f16700Schasinglulu { 174*91f16700Schasinglulu return 0; 175*91f16700Schasinglulu } 176*91f16700Schasinglulu 177*91f16700Schasinglulu int plat_spmc_shmem_reclaim(struct ffa_mtd *desc) 178*91f16700Schasinglulu { 179*91f16700Schasinglulu return 0; 180*91f16700Schasinglulu } 181*91f16700Schasinglulu #endif 182*91f16700Schasinglulu 183*91f16700Schasinglulu #if defined(SPD_spmd) && (SPMC_AT_EL3 == 0) 184*91f16700Schasinglulu /* 185*91f16700Schasinglulu * A dummy implementation of the platform handler for Group0 secure interrupt. 186*91f16700Schasinglulu */ 187*91f16700Schasinglulu int plat_spmd_handle_group0_interrupt(uint32_t intid) 188*91f16700Schasinglulu { 189*91f16700Schasinglulu (void)intid; 190*91f16700Schasinglulu return -1; 191*91f16700Schasinglulu } 192*91f16700Schasinglulu #endif /*defined(SPD_spmd) && (SPMC_AT_EL3 == 0)*/ 193