1*6ec0c65bSUsama Arif /* 2*6ec0c65bSUsama Arif * Copyright (c) 2020, ARM Limited and Contributors. All rights reserved. 3*6ec0c65bSUsama Arif * 4*6ec0c65bSUsama Arif * SPDX-License-Identifier: BSD-3-Clause 5*6ec0c65bSUsama Arif */ 6*6ec0c65bSUsama Arif 7*6ec0c65bSUsama Arif #include <assert.h> 8*6ec0c65bSUsama Arif 9*6ec0c65bSUsama Arif #include <platform_def.h> 10*6ec0c65bSUsama Arif 11*6ec0c65bSUsama Arif #include <plat/common/platform.h> 12*6ec0c65bSUsama Arif #include <common/bl_common.h> 13*6ec0c65bSUsama Arif #include <common/debug.h> 14*6ec0c65bSUsama Arif #include <drivers/arm/ccn.h> 15*6ec0c65bSUsama Arif #include <plat/arm/common/plat_arm.h> 16*6ec0c65bSUsama Arif #include <plat/common/platform.h> 17*6ec0c65bSUsama Arif #include <drivers/arm/sbsa.h> 18*6ec0c65bSUsama Arif 19*6ec0c65bSUsama Arif #if SPM_MM 20*6ec0c65bSUsama Arif #include <services/spm_mm_partition.h> 21*6ec0c65bSUsama Arif #endif 22*6ec0c65bSUsama Arif 23*6ec0c65bSUsama Arif /* 24*6ec0c65bSUsama Arif * Table of regions for different BL stages to map using the MMU. 25*6ec0c65bSUsama Arif * This doesn't include Trusted RAM as the 'mem_layout' argument passed to 26*6ec0c65bSUsama Arif * arm_configure_mmu_elx() will give the available subset of that. 27*6ec0c65bSUsama Arif */ 28*6ec0c65bSUsama Arif #if IMAGE_BL1 29*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 30*6ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 31*6ec0c65bSUsama Arif TC_FLASH0_RO, 32*6ec0c65bSUsama Arif TC_MAP_DEVICE, 33*6ec0c65bSUsama Arif {0} 34*6ec0c65bSUsama Arif }; 35*6ec0c65bSUsama Arif #endif 36*6ec0c65bSUsama Arif #if IMAGE_BL2 37*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 38*6ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 39*6ec0c65bSUsama Arif TC_FLASH0_RO, 40*6ec0c65bSUsama Arif TC_MAP_DEVICE, 41*6ec0c65bSUsama Arif TC_MAP_NS_DRAM1, 42*6ec0c65bSUsama Arif #if defined(SPD_spmd) 43*6ec0c65bSUsama Arif TC_MAP_TZC_DRAM1, 44*6ec0c65bSUsama Arif #endif 45*6ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM 46*6ec0c65bSUsama Arif ARM_MAP_BL31_SEC_DRAM, 47*6ec0c65bSUsama Arif #endif 48*6ec0c65bSUsama Arif #if SPM_MM 49*6ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 50*6ec0c65bSUsama Arif #endif 51*6ec0c65bSUsama Arif #if TRUSTED_BOARD_BOOT && !BL2_AT_EL3 52*6ec0c65bSUsama Arif ARM_MAP_BL1_RW, 53*6ec0c65bSUsama Arif #endif 54*6ec0c65bSUsama Arif #ifdef SPD_opteed 55*6ec0c65bSUsama Arif ARM_MAP_OPTEE_CORE_MEM, 56*6ec0c65bSUsama Arif ARM_OPTEE_PAGEABLE_LOAD_MEM, 57*6ec0c65bSUsama Arif #endif 58*6ec0c65bSUsama Arif {0} 59*6ec0c65bSUsama Arif }; 60*6ec0c65bSUsama Arif #endif 61*6ec0c65bSUsama Arif #if IMAGE_BL31 62*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 63*6ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 64*6ec0c65bSUsama Arif V2M_MAP_IOFPGA, 65*6ec0c65bSUsama Arif TC_MAP_DEVICE, 66*6ec0c65bSUsama Arif #if SPM_MM 67*6ec0c65bSUsama Arif ARM_SPM_BUF_EL3_MMAP, 68*6ec0c65bSUsama Arif #endif 69*6ec0c65bSUsama Arif {0} 70*6ec0c65bSUsama Arif }; 71*6ec0c65bSUsama Arif 72*6ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 73*6ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = { 74*6ec0c65bSUsama Arif PLAT_ARM_SECURE_MAP_DEVICE, 75*6ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 76*6ec0c65bSUsama Arif ARM_SP_IMAGE_NS_BUF_MMAP, 77*6ec0c65bSUsama Arif ARM_SP_CPER_BUF_MMAP, 78*6ec0c65bSUsama Arif ARM_SP_IMAGE_RW_MMAP, 79*6ec0c65bSUsama Arif ARM_SPM_BUF_EL0_MMAP, 80*6ec0c65bSUsama Arif {0} 81*6ec0c65bSUsama Arif }; 82*6ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 83*6ec0c65bSUsama Arif #endif 84*6ec0c65bSUsama Arif 85*6ec0c65bSUsama Arif ARM_CASSERT_MMAP 86*6ec0c65bSUsama Arif 87*6ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 88*6ec0c65bSUsama Arif /* 89*6ec0c65bSUsama Arif * Boot information passed to a secure partition during initialisation. Linear 90*6ec0c65bSUsama Arif * indices in MP information will be filled at runtime. 91*6ec0c65bSUsama Arif */ 92*6ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = { 93*6ec0c65bSUsama Arif [0] = {0x81000000, 0}, 94*6ec0c65bSUsama Arif [1] = {0x81000100, 0}, 95*6ec0c65bSUsama Arif [2] = {0x81000200, 0}, 96*6ec0c65bSUsama Arif [3] = {0x81000300, 0}, 97*6ec0c65bSUsama Arif [4] = {0x81010000, 0}, 98*6ec0c65bSUsama Arif [5] = {0x81010100, 0}, 99*6ec0c65bSUsama Arif [6] = {0x81010200, 0}, 100*6ec0c65bSUsama Arif [7] = {0x81010300, 0}, 101*6ec0c65bSUsama Arif }; 102*6ec0c65bSUsama Arif 103*6ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = { 104*6ec0c65bSUsama Arif .h.type = PARAM_SP_IMAGE_BOOT_INFO, 105*6ec0c65bSUsama Arif .h.version = VERSION_1, 106*6ec0c65bSUsama Arif .h.size = sizeof(spm_mm_boot_info_t), 107*6ec0c65bSUsama Arif .h.attr = 0, 108*6ec0c65bSUsama Arif .sp_mem_base = ARM_SP_IMAGE_BASE, 109*6ec0c65bSUsama Arif .sp_mem_limit = ARM_SP_IMAGE_LIMIT, 110*6ec0c65bSUsama Arif .sp_image_base = ARM_SP_IMAGE_BASE, 111*6ec0c65bSUsama Arif .sp_stack_base = PLAT_SP_IMAGE_STACK_BASE, 112*6ec0c65bSUsama Arif .sp_heap_base = ARM_SP_IMAGE_HEAP_BASE, 113*6ec0c65bSUsama Arif .sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE, 114*6ec0c65bSUsama Arif .sp_shared_buf_base = PLAT_SPM_BUF_BASE, 115*6ec0c65bSUsama Arif .sp_image_size = ARM_SP_IMAGE_SIZE, 116*6ec0c65bSUsama Arif .sp_pcpu_stack_size = PLAT_SP_IMAGE_STACK_PCPU_SIZE, 117*6ec0c65bSUsama Arif .sp_heap_size = ARM_SP_IMAGE_HEAP_SIZE, 118*6ec0c65bSUsama Arif .sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE, 119*6ec0c65bSUsama Arif .sp_shared_buf_size = PLAT_SPM_BUF_SIZE, 120*6ec0c65bSUsama Arif .num_sp_mem_regions = ARM_SP_IMAGE_NUM_MEM_REGIONS, 121*6ec0c65bSUsama Arif .num_cpus = PLATFORM_CORE_COUNT, 122*6ec0c65bSUsama Arif .mp_info = &sp_mp_info[0], 123*6ec0c65bSUsama Arif }; 124*6ec0c65bSUsama Arif 125*6ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie) 126*6ec0c65bSUsama Arif { 127*6ec0c65bSUsama Arif return plat_arm_secure_partition_mmap; 128*6ec0c65bSUsama Arif } 129*6ec0c65bSUsama Arif 130*6ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info( 131*6ec0c65bSUsama Arif void *cookie) 132*6ec0c65bSUsama Arif { 133*6ec0c65bSUsama Arif return &plat_arm_secure_partition_boot_info; 134*6ec0c65bSUsama Arif } 135*6ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 136*6ec0c65bSUsama Arif 137*6ec0c65bSUsama Arif #if TRUSTED_BOARD_BOOT 138*6ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 139*6ec0c65bSUsama Arif { 140*6ec0c65bSUsama Arif assert(heap_addr != NULL); 141*6ec0c65bSUsama Arif assert(heap_size != NULL); 142*6ec0c65bSUsama Arif 143*6ec0c65bSUsama Arif return arm_get_mbedtls_heap(heap_addr, heap_size); 144*6ec0c65bSUsama Arif } 145*6ec0c65bSUsama Arif #endif 146*6ec0c65bSUsama Arif 147*6ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void) 148*6ec0c65bSUsama Arif { 149*6ec0c65bSUsama Arif sbsa_wdog_start(SBSA_SECURE_WDOG_BASE, SBSA_SECURE_WDOG_TIMEOUT); 150*6ec0c65bSUsama Arif } 151*6ec0c65bSUsama Arif 152*6ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void) 153*6ec0c65bSUsama Arif { 154*6ec0c65bSUsama Arif sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); 155*6ec0c65bSUsama Arif } 156