xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_plat.c (revision 29de2aa43fb78064130f4ed6588f986b98c42b4d)
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 
plat_get_secure_partition_mmap(void * cookie)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 
plat_get_secure_partition_boot_info(void * cookie)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
plat_get_mbedtls_heap(void ** heap_addr,size_t * heap_size)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 
plat_arm_secure_wdt_start(void)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 
plat_arm_secure_wdt_stop(void)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 
plat_arm_secure_wdt_refresh(void)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 
plat_sds_get_regions(unsigned int * region_count)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