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