16ec0c65bSUsama Arif /* 26f503e0eSTamas 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> 156f503e0eSTamas Ban #include <drivers/arm/css/sds.h> 166f503e0eSTamas 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, 33*18f754a2SBoyan Karatotev TC_MAP_NS_DRAM1, 346ec0c65bSUsama Arif TC_FLASH0_RO, 356ec0c65bSUsama Arif TC_MAP_DEVICE, 366ec0c65bSUsama Arif {0} 376ec0c65bSUsama Arif }; 386ec0c65bSUsama Arif #endif 396ec0c65bSUsama Arif #if IMAGE_BL2 406ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 416ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 426ec0c65bSUsama Arif TC_FLASH0_RO, 436ec0c65bSUsama Arif TC_MAP_DEVICE, 446ec0c65bSUsama Arif TC_MAP_NS_DRAM1, 456ec0c65bSUsama Arif #if defined(SPD_spmd) 466ec0c65bSUsama Arif TC_MAP_TZC_DRAM1, 476ec0c65bSUsama Arif #endif 486ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM 496ec0c65bSUsama Arif ARM_MAP_BL31_SEC_DRAM, 506ec0c65bSUsama Arif #endif 516ec0c65bSUsama Arif #if SPM_MM 526ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 536ec0c65bSUsama Arif #endif 5442d4d3baSArvind Ram Prakash #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2 556ec0c65bSUsama Arif ARM_MAP_BL1_RW, 566ec0c65bSUsama Arif #endif 576ec0c65bSUsama Arif #ifdef SPD_opteed 586ec0c65bSUsama Arif ARM_MAP_OPTEE_CORE_MEM, 596ec0c65bSUsama Arif ARM_OPTEE_PAGEABLE_LOAD_MEM, 606ec0c65bSUsama Arif #endif 616ec0c65bSUsama Arif {0} 626ec0c65bSUsama Arif }; 636ec0c65bSUsama Arif #endif 646ec0c65bSUsama Arif #if IMAGE_BL31 656ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 666ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 676ec0c65bSUsama Arif V2M_MAP_IOFPGA, 686ec0c65bSUsama Arif TC_MAP_DEVICE, 6934a87d74SUsama Arif PLAT_DTB_DRAM_NS, 706ec0c65bSUsama Arif #if SPM_MM 716ec0c65bSUsama Arif ARM_SPM_BUF_EL3_MMAP, 726ec0c65bSUsama Arif #endif 736ec0c65bSUsama Arif {0} 746ec0c65bSUsama Arif }; 756ec0c65bSUsama Arif 766ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 776ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = { 786ec0c65bSUsama Arif PLAT_ARM_SECURE_MAP_DEVICE, 796ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 806ec0c65bSUsama Arif ARM_SP_IMAGE_NS_BUF_MMAP, 816ec0c65bSUsama Arif ARM_SP_CPER_BUF_MMAP, 826ec0c65bSUsama Arif ARM_SP_IMAGE_RW_MMAP, 836ec0c65bSUsama Arif ARM_SPM_BUF_EL0_MMAP, 846ec0c65bSUsama Arif {0} 856ec0c65bSUsama Arif }; 866ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 876ec0c65bSUsama Arif #endif 886ec0c65bSUsama Arif 896ec0c65bSUsama Arif ARM_CASSERT_MMAP 906ec0c65bSUsama Arif 916ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 926ec0c65bSUsama Arif /* 936ec0c65bSUsama Arif * Boot information passed to a secure partition during initialisation. Linear 946ec0c65bSUsama Arif * indices in MP information will be filled at runtime. 956ec0c65bSUsama Arif */ 966ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = { 976ec0c65bSUsama Arif [0] = {0x81000000, 0}, 986ec0c65bSUsama Arif [1] = {0x81000100, 0}, 996ec0c65bSUsama Arif [2] = {0x81000200, 0}, 1006ec0c65bSUsama Arif [3] = {0x81000300, 0}, 1016ec0c65bSUsama Arif [4] = {0x81010000, 0}, 1026ec0c65bSUsama Arif [5] = {0x81010100, 0}, 1036ec0c65bSUsama Arif [6] = {0x81010200, 0}, 1046ec0c65bSUsama Arif [7] = {0x81010300, 0}, 1056ec0c65bSUsama Arif }; 1066ec0c65bSUsama Arif 1076ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = { 1086ec0c65bSUsama Arif .h.type = PARAM_SP_IMAGE_BOOT_INFO, 1096ec0c65bSUsama Arif .h.version = VERSION_1, 1106ec0c65bSUsama Arif .h.size = sizeof(spm_mm_boot_info_t), 1116ec0c65bSUsama Arif .h.attr = 0, 1126ec0c65bSUsama Arif .sp_mem_base = ARM_SP_IMAGE_BASE, 1136ec0c65bSUsama Arif .sp_mem_limit = ARM_SP_IMAGE_LIMIT, 1146ec0c65bSUsama Arif .sp_image_base = ARM_SP_IMAGE_BASE, 1156ec0c65bSUsama Arif .sp_stack_base = PLAT_SP_IMAGE_STACK_BASE, 1166ec0c65bSUsama Arif .sp_heap_base = ARM_SP_IMAGE_HEAP_BASE, 1176ec0c65bSUsama Arif .sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE, 1186ec0c65bSUsama Arif .sp_shared_buf_base = PLAT_SPM_BUF_BASE, 1196ec0c65bSUsama Arif .sp_image_size = ARM_SP_IMAGE_SIZE, 1206ec0c65bSUsama Arif .sp_pcpu_stack_size = PLAT_SP_IMAGE_STACK_PCPU_SIZE, 1216ec0c65bSUsama Arif .sp_heap_size = ARM_SP_IMAGE_HEAP_SIZE, 1226ec0c65bSUsama Arif .sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE, 1236ec0c65bSUsama Arif .sp_shared_buf_size = PLAT_SPM_BUF_SIZE, 1246ec0c65bSUsama Arif .num_sp_mem_regions = ARM_SP_IMAGE_NUM_MEM_REGIONS, 1256ec0c65bSUsama Arif .num_cpus = PLATFORM_CORE_COUNT, 1266ec0c65bSUsama Arif .mp_info = &sp_mp_info[0], 1276ec0c65bSUsama Arif }; 1286ec0c65bSUsama Arif 1296ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie) 1306ec0c65bSUsama Arif { 1316ec0c65bSUsama Arif return plat_arm_secure_partition_mmap; 1326ec0c65bSUsama Arif } 1336ec0c65bSUsama Arif 1346ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info( 1356ec0c65bSUsama Arif void *cookie) 1366ec0c65bSUsama Arif { 1376ec0c65bSUsama Arif return &plat_arm_secure_partition_boot_info; 1386ec0c65bSUsama Arif } 1396ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 1406ec0c65bSUsama Arif 1416cb5d326STamas Ban #if TRUSTED_BOARD_BOOT || MEASURED_BOOT 1426ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 1436ec0c65bSUsama Arif { 1446ec0c65bSUsama Arif assert(heap_addr != NULL); 1456ec0c65bSUsama Arif assert(heap_size != NULL); 1466ec0c65bSUsama Arif 1476ec0c65bSUsama Arif return arm_get_mbedtls_heap(heap_addr, heap_size); 1486ec0c65bSUsama Arif } 1496ec0c65bSUsama Arif #endif 1506ec0c65bSUsama Arif 1516ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void) 1526ec0c65bSUsama Arif { 15328b2d86cSMadhukar Pappireddy sbsa_wdog_start(SBSA_SECURE_WDOG_CONTROL_BASE, SBSA_SECURE_WDOG_TIMEOUT); 1546ec0c65bSUsama Arif } 1556ec0c65bSUsama Arif 1566ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void) 1576ec0c65bSUsama Arif { 15828b2d86cSMadhukar Pappireddy sbsa_wdog_stop(SBSA_SECURE_WDOG_CONTROL_BASE); 15928b2d86cSMadhukar Pappireddy } 16028b2d86cSMadhukar Pappireddy 16128b2d86cSMadhukar Pappireddy void plat_arm_secure_wdt_refresh(void) 16228b2d86cSMadhukar Pappireddy { 16328b2d86cSMadhukar Pappireddy sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE); 1646ec0c65bSUsama Arif } 1656f503e0eSTamas Ban 1666f503e0eSTamas Ban static sds_region_desc_t tc_sds_regions[] = { 1676f503e0eSTamas Ban { .base = PLAT_ARM_SDS_MEM_BASE }, 1686f503e0eSTamas Ban { .base = PLAT_ARM_RSS_AP_SDS_MEM_BASE }, 1696f503e0eSTamas Ban }; 1706f503e0eSTamas Ban 1716f503e0eSTamas Ban sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) 1726f503e0eSTamas Ban { 1736f503e0eSTamas Ban *region_count = ARRAY_SIZE(tc_sds_regions); 1746f503e0eSTamas Ban 1756f503e0eSTamas Ban return tc_sds_regions; 1766f503e0eSTamas Ban } 177