16ec0c65bSUsama Arif /* 293c50ae6SJayanth Dodderi Chidanand * Copyright (c) 2020-2025, 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, 3318f754a2SBoyan Karatotev TC_MAP_NS_DRAM1, 346ec0c65bSUsama Arif TC_FLASH0_RO, 356ec0c65bSUsama Arif TC_MAP_DEVICE, 3693c50ae6SJayanth Dodderi Chidanand #if TRANSFER_LIST 3793c50ae6SJayanth Dodderi Chidanand TC_MAP_EL3_FW_HANDOFF, 3893c50ae6SJayanth Dodderi Chidanand #endif 396ec0c65bSUsama Arif {0} 406ec0c65bSUsama Arif }; 416ec0c65bSUsama Arif #endif 426ec0c65bSUsama Arif #if IMAGE_BL2 436ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 446ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 456ec0c65bSUsama Arif TC_FLASH0_RO, 464bfe49ecSJackson Cooper-Driver ARM_V2M_MAP_MEM_PROTECT, 476ec0c65bSUsama Arif TC_MAP_DEVICE, 486ec0c65bSUsama Arif TC_MAP_NS_DRAM1, 496ec0c65bSUsama Arif #if defined(SPD_spmd) 506ec0c65bSUsama Arif TC_MAP_TZC_DRAM1, 516ec0c65bSUsama Arif #endif 526ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM 536ec0c65bSUsama Arif ARM_MAP_BL31_SEC_DRAM, 546ec0c65bSUsama Arif #endif 556ec0c65bSUsama Arif #if SPM_MM 566ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 576ec0c65bSUsama Arif #endif 5842d4d3baSArvind Ram Prakash #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2 596ec0c65bSUsama Arif ARM_MAP_BL1_RW, 606ec0c65bSUsama Arif #endif 616ec0c65bSUsama Arif #ifdef SPD_opteed 626ec0c65bSUsama Arif ARM_MAP_OPTEE_CORE_MEM, 636ec0c65bSUsama Arif ARM_OPTEE_PAGEABLE_LOAD_MEM, 646ec0c65bSUsama Arif #endif 6593c50ae6SJayanth Dodderi Chidanand #if TRANSFER_LIST 6693c50ae6SJayanth Dodderi Chidanand TC_MAP_EL3_FW_HANDOFF, 6793c50ae6SJayanth Dodderi Chidanand #endif 686ec0c65bSUsama Arif {0} 696ec0c65bSUsama Arif }; 706ec0c65bSUsama Arif #endif 716ec0c65bSUsama Arif #if IMAGE_BL31 726ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = { 736ec0c65bSUsama Arif ARM_MAP_SHARED_RAM, 746ec0c65bSUsama Arif V2M_MAP_IOFPGA, 754bfe49ecSJackson Cooper-Driver ARM_V2M_MAP_MEM_PROTECT, 766ec0c65bSUsama Arif TC_MAP_DEVICE, 7734a87d74SUsama Arif PLAT_DTB_DRAM_NS, 786ec0c65bSUsama Arif #if SPM_MM 796ec0c65bSUsama Arif ARM_SPM_BUF_EL3_MMAP, 806ec0c65bSUsama Arif #endif 81*25a6bcd5SJayanth Dodderi Chidanand #if TRANSFER_LIST 82*25a6bcd5SJayanth Dodderi Chidanand TC_MAP_FW_NS_HANDOFF, 83*25a6bcd5SJayanth Dodderi Chidanand TC_MAP_EL3_FW_HANDOFF, 84*25a6bcd5SJayanth Dodderi Chidanand #endif 856ec0c65bSUsama Arif {0} 866ec0c65bSUsama Arif }; 876ec0c65bSUsama Arif 886ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 896ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = { 906ec0c65bSUsama Arif PLAT_ARM_SECURE_MAP_DEVICE, 916ec0c65bSUsama Arif ARM_SP_IMAGE_MMAP, 926ec0c65bSUsama Arif ARM_SP_IMAGE_NS_BUF_MMAP, 936ec0c65bSUsama Arif ARM_SP_CPER_BUF_MMAP, 946ec0c65bSUsama Arif ARM_SP_IMAGE_RW_MMAP, 956ec0c65bSUsama Arif ARM_SPM_BUF_EL0_MMAP, 966ec0c65bSUsama Arif {0} 976ec0c65bSUsama Arif }; 986ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 996ec0c65bSUsama Arif #endif 1006ec0c65bSUsama Arif 1016ec0c65bSUsama Arif ARM_CASSERT_MMAP 1026ec0c65bSUsama Arif 1036ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31) 1046ec0c65bSUsama Arif /* 1056ec0c65bSUsama Arif * Boot information passed to a secure partition during initialisation. Linear 1066ec0c65bSUsama Arif * indices in MP information will be filled at runtime. 1076ec0c65bSUsama Arif */ 1086ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = { 1096ec0c65bSUsama Arif [0] = {0x81000000, 0}, 1106ec0c65bSUsama Arif [1] = {0x81000100, 0}, 1116ec0c65bSUsama Arif [2] = {0x81000200, 0}, 1126ec0c65bSUsama Arif [3] = {0x81000300, 0}, 1136ec0c65bSUsama Arif [4] = {0x81010000, 0}, 1146ec0c65bSUsama Arif [5] = {0x81010100, 0}, 1156ec0c65bSUsama Arif [6] = {0x81010200, 0}, 1166ec0c65bSUsama Arif [7] = {0x81010300, 0}, 1176ec0c65bSUsama Arif }; 1186ec0c65bSUsama Arif 1196ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = { 1206ec0c65bSUsama Arif .h.type = PARAM_SP_IMAGE_BOOT_INFO, 1216ec0c65bSUsama Arif .h.version = VERSION_1, 1226ec0c65bSUsama Arif .h.size = sizeof(spm_mm_boot_info_t), 1236ec0c65bSUsama Arif .h.attr = 0, 1246ec0c65bSUsama Arif .sp_mem_base = ARM_SP_IMAGE_BASE, 1256ec0c65bSUsama Arif .sp_mem_limit = ARM_SP_IMAGE_LIMIT, 1266ec0c65bSUsama Arif .sp_image_base = ARM_SP_IMAGE_BASE, 1276ec0c65bSUsama Arif .sp_stack_base = PLAT_SP_IMAGE_STACK_BASE, 1286ec0c65bSUsama Arif .sp_heap_base = ARM_SP_IMAGE_HEAP_BASE, 1296ec0c65bSUsama Arif .sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE, 1306ec0c65bSUsama Arif .sp_shared_buf_base = PLAT_SPM_BUF_BASE, 1316ec0c65bSUsama Arif .sp_image_size = ARM_SP_IMAGE_SIZE, 1326ec0c65bSUsama Arif .sp_pcpu_stack_size = PLAT_SP_IMAGE_STACK_PCPU_SIZE, 1336ec0c65bSUsama Arif .sp_heap_size = ARM_SP_IMAGE_HEAP_SIZE, 1346ec0c65bSUsama Arif .sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE, 1356ec0c65bSUsama Arif .sp_shared_buf_size = PLAT_SPM_BUF_SIZE, 1366ec0c65bSUsama Arif .num_sp_mem_regions = ARM_SP_IMAGE_NUM_MEM_REGIONS, 1376ec0c65bSUsama Arif .num_cpus = PLATFORM_CORE_COUNT, 1386ec0c65bSUsama Arif .mp_info = &sp_mp_info[0], 1396ec0c65bSUsama Arif }; 1406ec0c65bSUsama Arif 1416ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie) 1426ec0c65bSUsama Arif { 1436ec0c65bSUsama Arif return plat_arm_secure_partition_mmap; 1446ec0c65bSUsama Arif } 1456ec0c65bSUsama Arif 1466ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info( 1476ec0c65bSUsama Arif void *cookie) 1486ec0c65bSUsama Arif { 1496ec0c65bSUsama Arif return &plat_arm_secure_partition_boot_info; 1506ec0c65bSUsama Arif } 1516ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */ 1526ec0c65bSUsama Arif 1536cb5d326STamas Ban #if TRUSTED_BOARD_BOOT || MEASURED_BOOT 1546ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 1556ec0c65bSUsama Arif { 1566ec0c65bSUsama Arif assert(heap_addr != NULL); 1576ec0c65bSUsama Arif assert(heap_size != NULL); 1586ec0c65bSUsama Arif 1596ec0c65bSUsama Arif return arm_get_mbedtls_heap(heap_addr, heap_size); 1606ec0c65bSUsama Arif } 1616ec0c65bSUsama Arif #endif 1626ec0c65bSUsama Arif 1636ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void) 1646ec0c65bSUsama Arif { 16528b2d86cSMadhukar Pappireddy sbsa_wdog_start(SBSA_SECURE_WDOG_CONTROL_BASE, SBSA_SECURE_WDOG_TIMEOUT); 1666ec0c65bSUsama Arif } 1676ec0c65bSUsama Arif 1686ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void) 1696ec0c65bSUsama Arif { 17028b2d86cSMadhukar Pappireddy sbsa_wdog_stop(SBSA_SECURE_WDOG_CONTROL_BASE); 17128b2d86cSMadhukar Pappireddy } 17228b2d86cSMadhukar Pappireddy 17328b2d86cSMadhukar Pappireddy void plat_arm_secure_wdt_refresh(void) 17428b2d86cSMadhukar Pappireddy { 17528b2d86cSMadhukar Pappireddy sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE); 1766ec0c65bSUsama Arif } 1776f503e0eSTamas Ban 1786f503e0eSTamas Ban static sds_region_desc_t tc_sds_regions[] = { 1796f503e0eSTamas Ban { .base = PLAT_ARM_SDS_MEM_BASE }, 1807f8589cdSTamas Ban { .base = PLAT_ARM_RSE_AP_SDS_MEM_BASE }, 1816f503e0eSTamas Ban }; 1826f503e0eSTamas Ban 1836f503e0eSTamas Ban sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count) 1846f503e0eSTamas Ban { 1856f503e0eSTamas Ban *region_count = ARRAY_SIZE(tc_sds_regions); 1866f503e0eSTamas Ban 1876f503e0eSTamas Ban return tc_sds_regions; 1886f503e0eSTamas Ban } 189