16ec0c65bSUsama Arif /* 2*6f503e0eSTamas Ban * Copyright (c) 2020-2024, 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> 15*6f503e0eSTamas Ban #include <drivers/arm/css/sds.h> 16*6f503e0eSTamas Ban #include <lib/utils_def.h> 176ec0c65bSUsama Arif #include <plat/arm/common/plat_arm.h> 186ec0c65bSUsama Arif #include <plat/common/platform.h> 196ec0c65bSUsama Arif #include <drivers/arm/sbsa.h> 206ec0c65bSUsama Arif 216ec0c65bSUsama Arif #if SPM_MM 226ec0c65bSUsama Arif #include <services/spm_mm_partition.h> 236ec0c65bSUsama Arif #endif 246ec0c65bSUsama Arif 256ec0c65bSUsama Arif /* 266ec0c65bSUsama Arif * Table of regions for different BL stages to map using the MMU. 276ec0c65bSUsama Arif * This doesn't include Trusted RAM as the 'mem_layout' argument passed to 286ec0c65bSUsama Arif * arm_configure_mmu_elx() will give the available subset of that. 296ec0c65bSUsama Arif */ 306ec0c65bSUsama Arif #if IMAGE_BL1 316ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 326ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 336ec0c65bSUsama Arif TC_FLASH0_RO, 346ec0c65bSUsama Arif TC_MAP_DEVICE, 356ec0c65bSUsama Arif {0} 366ec0c65bSUsama Arif }; 376ec0c65bSUsama Arif #endif 386ec0c65bSUsama Arif #if IMAGE_BL2 396ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 406ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 416ec0c65bSUsama Arif TC_FLASH0_RO, 426ec0c65bSUsama Arif TC_MAP_DEVICE, 436ec0c65bSUsama Arif TC_MAP_NS_DRAM1, 446ec0c65bSUsama Arif #if defined(SPD_spmd) 456ec0c65bSUsama Arif TC_MAP_TZC_DRAM1, 466ec0c65bSUsama Arif #endif 476ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM 486ec0c65bSUsama Arif ARM_MAP_BL31_SEC_DRAM, 496ec0c65bSUsama Arif #endif 506ec0c65bSUsama Arif #if SPM_MM 516ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 526ec0c65bSUsama Arif #endif 5342d4d3baSArvind Ram Prakash #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2 546ec0c65bSUsama Arif ARM_MAP_BL1_RW, 556ec0c65bSUsama Arif #endif 566ec0c65bSUsama Arif #ifdef SPD_opteed 576ec0c65bSUsama Arif ARM_MAP_OPTEE_CORE_MEM, 586ec0c65bSUsama Arif ARM_OPTEE_PAGEABLE_LOAD_MEM, 596ec0c65bSUsama Arif #endif 606ec0c65bSUsama Arif {0} 616ec0c65bSUsama Arif }; 626ec0c65bSUsama Arif #endif 636ec0c65bSUsama Arif #if IMAGE_BL31 646ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 656ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 666ec0c65bSUsama Arif V2M_MAP_IOFPGA, 676ec0c65bSUsama Arif TC_MAP_DEVICE, 6834a87d74SUsama Arif PLAT_DTB_DRAM_NS, 696ec0c65bSUsama Arif #if SPM_MM 706ec0c65bSUsama Arif ARM_SPM_BUF_EL3_MMAP, 716ec0c65bSUsama Arif #endif 726ec0c65bSUsama Arif {0} 736ec0c65bSUsama Arif }; 746ec0c65bSUsama Arif 756ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 766ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = { 776ec0c65bSUsama Arif PLAT_ARM_SECURE_MAP_DEVICE, 786ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 796ec0c65bSUsama Arif ARM_SP_IMAGE_NS_BUF_MMAP, 806ec0c65bSUsama Arif ARM_SP_CPER_BUF_MMAP, 816ec0c65bSUsama Arif ARM_SP_IMAGE_RW_MMAP, 826ec0c65bSUsama Arif ARM_SPM_BUF_EL0_MMAP, 836ec0c65bSUsama Arif {0} 846ec0c65bSUsama Arif }; 856ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 866ec0c65bSUsama Arif #endif 876ec0c65bSUsama Arif 886ec0c65bSUsama Arif ARM_CASSERT_MMAP 896ec0c65bSUsama Arif 906ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 916ec0c65bSUsama Arif /* 926ec0c65bSUsama Arif * Boot information passed to a secure partition during initialisation. Linear 936ec0c65bSUsama Arif * indices in MP information will be filled at runtime. 946ec0c65bSUsama Arif */ 956ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = { 966ec0c65bSUsama Arif [0] = {0x81000000, 0}, 976ec0c65bSUsama Arif [1] = {0x81000100, 0}, 986ec0c65bSUsama Arif [2] = {0x81000200, 0}, 996ec0c65bSUsama Arif [3] = {0x81000300, 0}, 1006ec0c65bSUsama Arif [4] = {0x81010000, 0}, 1016ec0c65bSUsama Arif [5] = {0x81010100, 0}, 1026ec0c65bSUsama Arif [6] = {0x81010200, 0}, 1036ec0c65bSUsama Arif [7] = {0x81010300, 0}, 1046ec0c65bSUsama Arif }; 1056ec0c65bSUsama Arif 1066ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = { 1076ec0c65bSUsama Arif .h.type = PARAM_SP_IMAGE_BOOT_INFO, 1086ec0c65bSUsama Arif .h.version = VERSION_1, 1096ec0c65bSUsama Arif .h.size = sizeof(spm_mm_boot_info_t), 1106ec0c65bSUsama Arif .h.attr = 0, 1116ec0c65bSUsama Arif .sp_mem_base = ARM_SP_IMAGE_BASE, 1126ec0c65bSUsama Arif .sp_mem_limit = ARM_SP_IMAGE_LIMIT, 1136ec0c65bSUsama Arif .sp_image_base = ARM_SP_IMAGE_BASE, 1146ec0c65bSUsama Arif .sp_stack_base = PLAT_SP_IMAGE_STACK_BASE, 1156ec0c65bSUsama Arif .sp_heap_base = ARM_SP_IMAGE_HEAP_BASE, 1166ec0c65bSUsama Arif .sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE, 1176ec0c65bSUsama Arif .sp_shared_buf_base = PLAT_SPM_BUF_BASE, 1186ec0c65bSUsama Arif .sp_image_size = ARM_SP_IMAGE_SIZE, 1196ec0c65bSUsama Arif .sp_pcpu_stack_size = PLAT_SP_IMAGE_STACK_PCPU_SIZE, 1206ec0c65bSUsama Arif .sp_heap_size = ARM_SP_IMAGE_HEAP_SIZE, 1216ec0c65bSUsama Arif .sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE, 1226ec0c65bSUsama Arif .sp_shared_buf_size = PLAT_SPM_BUF_SIZE, 1236ec0c65bSUsama Arif .num_sp_mem_regions = ARM_SP_IMAGE_NUM_MEM_REGIONS, 1246ec0c65bSUsama Arif .num_cpus = PLATFORM_CORE_COUNT, 1256ec0c65bSUsama Arif .mp_info = &sp_mp_info[0], 1266ec0c65bSUsama Arif }; 1276ec0c65bSUsama Arif 1286ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie) 1296ec0c65bSUsama Arif { 1306ec0c65bSUsama Arif return plat_arm_secure_partition_mmap; 1316ec0c65bSUsama Arif } 1326ec0c65bSUsama Arif 1336ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info( 1346ec0c65bSUsama Arif void *cookie) 1356ec0c65bSUsama Arif { 1366ec0c65bSUsama Arif return &plat_arm_secure_partition_boot_info; 1376ec0c65bSUsama Arif } 1386ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 1396ec0c65bSUsama Arif 1406cb5d326STamas Ban #if TRUSTED_BOARD_BOOT || MEASURED_BOOT 1416ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 1426ec0c65bSUsama Arif { 1436ec0c65bSUsama Arif assert(heap_addr != NULL); 1446ec0c65bSUsama Arif assert(heap_size != NULL); 1456ec0c65bSUsama Arif 1466ec0c65bSUsama Arif return arm_get_mbedtls_heap(heap_addr, heap_size); 1476ec0c65bSUsama Arif } 1486ec0c65bSUsama Arif #endif 1496ec0c65bSUsama Arif 1506ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void) 1516ec0c65bSUsama Arif { 15228b2d86cSMadhukar Pappireddy sbsa_wdog_start(SBSA_SECURE_WDOG_CONTROL_BASE, SBSA_SECURE_WDOG_TIMEOUT); 1536ec0c65bSUsama Arif } 1546ec0c65bSUsama Arif 1556ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void) 1566ec0c65bSUsama Arif { 15728b2d86cSMadhukar Pappireddy sbsa_wdog_stop(SBSA_SECURE_WDOG_CONTROL_BASE); 15828b2d86cSMadhukar Pappireddy } 15928b2d86cSMadhukar Pappireddy 16028b2d86cSMadhukar Pappireddy void plat_arm_secure_wdt_refresh(void) 16128b2d86cSMadhukar Pappireddy { 16228b2d86cSMadhukar Pappireddy sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE); 1636ec0c65bSUsama Arif } 164*6f503e0eSTamas Ban 165*6f503e0eSTamas Ban static sds_region_desc_t tc_sds_regions[] = { 166*6f503e0eSTamas Ban { .base = PLAT_ARM_SDS_MEM_BASE }, 167*6f503e0eSTamas Ban { .base = PLAT_ARM_RSS_AP_SDS_MEM_BASE }, 168*6f503e0eSTamas Ban }; 169*6f503e0eSTamas Ban 170*6f503e0eSTamas Ban sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) 171*6f503e0eSTamas Ban { 172*6f503e0eSTamas Ban *region_count = ARRAY_SIZE(tc_sds_regions); 173*6f503e0eSTamas Ban 174*6f503e0eSTamas Ban return tc_sds_regions; 175*6f503e0eSTamas Ban } 176