xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_plat.c (revision 28b2d86cd28ffc54c6272defcd6f123a925012f1)
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