16ec0c65bSUsama Arif /* 2*28b2d86cSMadhukar Pappireddy * Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved. 36ec0c65bSUsama Arif * 46ec0c65bSUsama Arif * SPDX-License-Identifier: BSD-3-Clause 56ec0c65bSUsama Arif */ 66ec0c65bSUsama Arif 76ec0c65bSUsama Arif #include <assert.h> 86ec0c65bSUsama Arif 96ec0c65bSUsama Arif #include <platform_def.h> 106ec0c65bSUsama Arif 116ec0c65bSUsama Arif #include <plat/common/platform.h> 126ec0c65bSUsama Arif #include <common/bl_common.h> 136ec0c65bSUsama Arif #include <common/debug.h> 146ec0c65bSUsama Arif #include <drivers/arm/ccn.h> 156ec0c65bSUsama Arif #include <plat/arm/common/plat_arm.h> 166ec0c65bSUsama Arif #include <plat/common/platform.h> 176ec0c65bSUsama Arif #include <drivers/arm/sbsa.h> 186ec0c65bSUsama Arif 196ec0c65bSUsama Arif #if SPM_MM 206ec0c65bSUsama Arif #include <services/spm_mm_partition.h> 216ec0c65bSUsama Arif #endif 226ec0c65bSUsama Arif 236ec0c65bSUsama Arif /* 246ec0c65bSUsama Arif * Table of regions for different BL stages to map using the MMU. 256ec0c65bSUsama Arif * This doesn't include Trusted RAM as the 'mem_layout' argument passed to 266ec0c65bSUsama Arif * arm_configure_mmu_elx() will give the available subset of that. 276ec0c65bSUsama Arif */ 286ec0c65bSUsama Arif #if IMAGE_BL1 296ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 306ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 316ec0c65bSUsama Arif TC_FLASH0_RO, 326ec0c65bSUsama Arif TC_MAP_DEVICE, 336ec0c65bSUsama Arif {0} 346ec0c65bSUsama Arif }; 356ec0c65bSUsama Arif #endif 366ec0c65bSUsama Arif #if IMAGE_BL2 376ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 386ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 396ec0c65bSUsama Arif TC_FLASH0_RO, 406ec0c65bSUsama Arif TC_MAP_DEVICE, 416ec0c65bSUsama Arif TC_MAP_NS_DRAM1, 426ec0c65bSUsama Arif #if defined(SPD_spmd) 436ec0c65bSUsama Arif TC_MAP_TZC_DRAM1, 446ec0c65bSUsama Arif #endif 456ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM 466ec0c65bSUsama Arif ARM_MAP_BL31_SEC_DRAM, 476ec0c65bSUsama Arif #endif 486ec0c65bSUsama Arif #if SPM_MM 496ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 506ec0c65bSUsama Arif #endif 5142d4d3baSArvind Ram Prakash #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2 526ec0c65bSUsama Arif ARM_MAP_BL1_RW, 536ec0c65bSUsama Arif #endif 546ec0c65bSUsama Arif #ifdef SPD_opteed 556ec0c65bSUsama Arif ARM_MAP_OPTEE_CORE_MEM, 566ec0c65bSUsama Arif ARM_OPTEE_PAGEABLE_LOAD_MEM, 576ec0c65bSUsama Arif #endif 586ec0c65bSUsama Arif {0} 596ec0c65bSUsama Arif }; 606ec0c65bSUsama Arif #endif 616ec0c65bSUsama Arif #if IMAGE_BL31 626ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 636ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 646ec0c65bSUsama Arif V2M_MAP_IOFPGA, 656ec0c65bSUsama Arif TC_MAP_DEVICE, 6634a87d74SUsama Arif PLAT_DTB_DRAM_NS, 676ec0c65bSUsama Arif #if SPM_MM 686ec0c65bSUsama Arif ARM_SPM_BUF_EL3_MMAP, 696ec0c65bSUsama Arif #endif 706ec0c65bSUsama Arif {0} 716ec0c65bSUsama Arif }; 726ec0c65bSUsama Arif 736ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 746ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = { 756ec0c65bSUsama Arif PLAT_ARM_SECURE_MAP_DEVICE, 766ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 776ec0c65bSUsama Arif ARM_SP_IMAGE_NS_BUF_MMAP, 786ec0c65bSUsama Arif ARM_SP_CPER_BUF_MMAP, 796ec0c65bSUsama Arif ARM_SP_IMAGE_RW_MMAP, 806ec0c65bSUsama Arif ARM_SPM_BUF_EL0_MMAP, 816ec0c65bSUsama Arif {0} 826ec0c65bSUsama Arif }; 836ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 846ec0c65bSUsama Arif #endif 856ec0c65bSUsama Arif 866ec0c65bSUsama Arif ARM_CASSERT_MMAP 876ec0c65bSUsama Arif 886ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 896ec0c65bSUsama Arif /* 906ec0c65bSUsama Arif * Boot information passed to a secure partition during initialisation. Linear 916ec0c65bSUsama Arif * indices in MP information will be filled at runtime. 926ec0c65bSUsama Arif */ 936ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = { 946ec0c65bSUsama Arif [0] = {0x81000000, 0}, 956ec0c65bSUsama Arif [1] = {0x81000100, 0}, 966ec0c65bSUsama Arif [2] = {0x81000200, 0}, 976ec0c65bSUsama Arif [3] = {0x81000300, 0}, 986ec0c65bSUsama Arif [4] = {0x81010000, 0}, 996ec0c65bSUsama Arif [5] = {0x81010100, 0}, 1006ec0c65bSUsama Arif [6] = {0x81010200, 0}, 1016ec0c65bSUsama Arif [7] = {0x81010300, 0}, 1026ec0c65bSUsama Arif }; 1036ec0c65bSUsama Arif 1046ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = { 1056ec0c65bSUsama Arif .h.type = PARAM_SP_IMAGE_BOOT_INFO, 1066ec0c65bSUsama Arif .h.version = VERSION_1, 1076ec0c65bSUsama Arif .h.size = sizeof(spm_mm_boot_info_t), 1086ec0c65bSUsama Arif .h.attr = 0, 1096ec0c65bSUsama Arif .sp_mem_base = ARM_SP_IMAGE_BASE, 1106ec0c65bSUsama Arif .sp_mem_limit = ARM_SP_IMAGE_LIMIT, 1116ec0c65bSUsama Arif .sp_image_base = ARM_SP_IMAGE_BASE, 1126ec0c65bSUsama Arif .sp_stack_base = PLAT_SP_IMAGE_STACK_BASE, 1136ec0c65bSUsama Arif .sp_heap_base = ARM_SP_IMAGE_HEAP_BASE, 1146ec0c65bSUsama Arif .sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE, 1156ec0c65bSUsama Arif .sp_shared_buf_base = PLAT_SPM_BUF_BASE, 1166ec0c65bSUsama Arif .sp_image_size = ARM_SP_IMAGE_SIZE, 1176ec0c65bSUsama Arif .sp_pcpu_stack_size = PLAT_SP_IMAGE_STACK_PCPU_SIZE, 1186ec0c65bSUsama Arif .sp_heap_size = ARM_SP_IMAGE_HEAP_SIZE, 1196ec0c65bSUsama Arif .sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE, 1206ec0c65bSUsama Arif .sp_shared_buf_size = PLAT_SPM_BUF_SIZE, 1216ec0c65bSUsama Arif .num_sp_mem_regions = ARM_SP_IMAGE_NUM_MEM_REGIONS, 1226ec0c65bSUsama Arif .num_cpus = PLATFORM_CORE_COUNT, 1236ec0c65bSUsama Arif .mp_info = &sp_mp_info[0], 1246ec0c65bSUsama Arif }; 1256ec0c65bSUsama Arif 1266ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie) 1276ec0c65bSUsama Arif { 1286ec0c65bSUsama Arif return plat_arm_secure_partition_mmap; 1296ec0c65bSUsama Arif } 1306ec0c65bSUsama Arif 1316ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info( 1326ec0c65bSUsama Arif void *cookie) 1336ec0c65bSUsama Arif { 1346ec0c65bSUsama Arif return &plat_arm_secure_partition_boot_info; 1356ec0c65bSUsama Arif } 1366ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 1376ec0c65bSUsama Arif 1386cb5d326STamas Ban #if TRUSTED_BOARD_BOOT || MEASURED_BOOT 1396ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 1406ec0c65bSUsama Arif { 1416ec0c65bSUsama Arif assert(heap_addr != NULL); 1426ec0c65bSUsama Arif assert(heap_size != NULL); 1436ec0c65bSUsama Arif 1446ec0c65bSUsama Arif return arm_get_mbedtls_heap(heap_addr, heap_size); 1456ec0c65bSUsama Arif } 1466ec0c65bSUsama Arif #endif 1476ec0c65bSUsama Arif 1486ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void) 1496ec0c65bSUsama Arif { 150*28b2d86cSMadhukar Pappireddy sbsa_wdog_start(SBSA_SECURE_WDOG_CONTROL_BASE, SBSA_SECURE_WDOG_TIMEOUT); 1516ec0c65bSUsama Arif } 1526ec0c65bSUsama Arif 1536ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void) 1546ec0c65bSUsama Arif { 155*28b2d86cSMadhukar Pappireddy sbsa_wdog_stop(SBSA_SECURE_WDOG_CONTROL_BASE); 156*28b2d86cSMadhukar Pappireddy } 157*28b2d86cSMadhukar Pappireddy 158*28b2d86cSMadhukar Pappireddy void plat_arm_secure_wdt_refresh(void) 159*28b2d86cSMadhukar Pappireddy { 160*28b2d86cSMadhukar Pappireddy sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE); 1616ec0c65bSUsama Arif } 162