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