xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_plat.c (revision 4bfe49ec4eff17ded7f7b13fe4ceaa7307a78f92)
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,
3318f754a2SBoyan 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,
43*4bfe49ecSJackson Cooper-Driver 	ARM_V2M_MAP_MEM_PROTECT,
446ec0c65bSUsama Arif 	TC_MAP_DEVICE,
456ec0c65bSUsama Arif 	TC_MAP_NS_DRAM1,
466ec0c65bSUsama Arif #if defined(SPD_spmd)
476ec0c65bSUsama Arif 	TC_MAP_TZC_DRAM1,
486ec0c65bSUsama Arif #endif
496ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM
506ec0c65bSUsama Arif 	ARM_MAP_BL31_SEC_DRAM,
516ec0c65bSUsama Arif #endif
526ec0c65bSUsama Arif #if SPM_MM
536ec0c65bSUsama Arif 	ARM_SP_IMAGE_MMAP,
546ec0c65bSUsama Arif #endif
5542d4d3baSArvind Ram Prakash #if TRUSTED_BOARD_BOOT && !RESET_TO_BL2
566ec0c65bSUsama Arif 	ARM_MAP_BL1_RW,
576ec0c65bSUsama Arif #endif
586ec0c65bSUsama Arif #ifdef SPD_opteed
596ec0c65bSUsama Arif 	ARM_MAP_OPTEE_CORE_MEM,
606ec0c65bSUsama Arif 	ARM_OPTEE_PAGEABLE_LOAD_MEM,
616ec0c65bSUsama Arif #endif
626ec0c65bSUsama Arif 	{0}
636ec0c65bSUsama Arif };
646ec0c65bSUsama Arif #endif
656ec0c65bSUsama Arif #if IMAGE_BL31
666ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = {
676ec0c65bSUsama Arif 	ARM_MAP_SHARED_RAM,
686ec0c65bSUsama Arif 	V2M_MAP_IOFPGA,
69*4bfe49ecSJackson Cooper-Driver 	ARM_V2M_MAP_MEM_PROTECT,
706ec0c65bSUsama Arif 	TC_MAP_DEVICE,
7134a87d74SUsama Arif 	PLAT_DTB_DRAM_NS,
726ec0c65bSUsama Arif #if SPM_MM
736ec0c65bSUsama Arif 	ARM_SPM_BUF_EL3_MMAP,
746ec0c65bSUsama Arif #endif
756ec0c65bSUsama Arif 	{0}
766ec0c65bSUsama Arif };
776ec0c65bSUsama Arif 
786ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31)
796ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = {
806ec0c65bSUsama Arif 	PLAT_ARM_SECURE_MAP_DEVICE,
816ec0c65bSUsama Arif 	ARM_SP_IMAGE_MMAP,
826ec0c65bSUsama Arif 	ARM_SP_IMAGE_NS_BUF_MMAP,
836ec0c65bSUsama Arif 	ARM_SP_CPER_BUF_MMAP,
846ec0c65bSUsama Arif 	ARM_SP_IMAGE_RW_MMAP,
856ec0c65bSUsama Arif 	ARM_SPM_BUF_EL0_MMAP,
866ec0c65bSUsama Arif 	{0}
876ec0c65bSUsama Arif };
886ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */
896ec0c65bSUsama Arif #endif
906ec0c65bSUsama Arif 
916ec0c65bSUsama Arif ARM_CASSERT_MMAP
926ec0c65bSUsama Arif 
936ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31)
946ec0c65bSUsama Arif /*
956ec0c65bSUsama Arif  * Boot information passed to a secure partition during initialisation. Linear
966ec0c65bSUsama Arif  * indices in MP information will be filled at runtime.
976ec0c65bSUsama Arif  */
986ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = {
996ec0c65bSUsama Arif 	[0] = {0x81000000, 0},
1006ec0c65bSUsama Arif 	[1] = {0x81000100, 0},
1016ec0c65bSUsama Arif 	[2] = {0x81000200, 0},
1026ec0c65bSUsama Arif 	[3] = {0x81000300, 0},
1036ec0c65bSUsama Arif 	[4] = {0x81010000, 0},
1046ec0c65bSUsama Arif 	[5] = {0x81010100, 0},
1056ec0c65bSUsama Arif 	[6] = {0x81010200, 0},
1066ec0c65bSUsama Arif 	[7] = {0x81010300, 0},
1076ec0c65bSUsama Arif };
1086ec0c65bSUsama Arif 
1096ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = {
1106ec0c65bSUsama Arif 	.h.type              = PARAM_SP_IMAGE_BOOT_INFO,
1116ec0c65bSUsama Arif 	.h.version           = VERSION_1,
1126ec0c65bSUsama Arif 	.h.size              = sizeof(spm_mm_boot_info_t),
1136ec0c65bSUsama Arif 	.h.attr              = 0,
1146ec0c65bSUsama Arif 	.sp_mem_base         = ARM_SP_IMAGE_BASE,
1156ec0c65bSUsama Arif 	.sp_mem_limit        = ARM_SP_IMAGE_LIMIT,
1166ec0c65bSUsama Arif 	.sp_image_base       = ARM_SP_IMAGE_BASE,
1176ec0c65bSUsama Arif 	.sp_stack_base       = PLAT_SP_IMAGE_STACK_BASE,
1186ec0c65bSUsama Arif 	.sp_heap_base        = ARM_SP_IMAGE_HEAP_BASE,
1196ec0c65bSUsama Arif 	.sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE,
1206ec0c65bSUsama Arif 	.sp_shared_buf_base  = PLAT_SPM_BUF_BASE,
1216ec0c65bSUsama Arif 	.sp_image_size       = ARM_SP_IMAGE_SIZE,
1226ec0c65bSUsama Arif 	.sp_pcpu_stack_size  = PLAT_SP_IMAGE_STACK_PCPU_SIZE,
1236ec0c65bSUsama Arif 	.sp_heap_size        = ARM_SP_IMAGE_HEAP_SIZE,
1246ec0c65bSUsama Arif 	.sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE,
1256ec0c65bSUsama Arif 	.sp_shared_buf_size  = PLAT_SPM_BUF_SIZE,
1266ec0c65bSUsama Arif 	.num_sp_mem_regions  = ARM_SP_IMAGE_NUM_MEM_REGIONS,
1276ec0c65bSUsama Arif 	.num_cpus            = PLATFORM_CORE_COUNT,
1286ec0c65bSUsama Arif 	.mp_info             = &sp_mp_info[0],
1296ec0c65bSUsama Arif };
1306ec0c65bSUsama Arif 
1316ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie)
1326ec0c65bSUsama Arif {
1336ec0c65bSUsama Arif 	return plat_arm_secure_partition_mmap;
1346ec0c65bSUsama Arif }
1356ec0c65bSUsama Arif 
1366ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
1376ec0c65bSUsama Arif 		void *cookie)
1386ec0c65bSUsama Arif {
1396ec0c65bSUsama Arif 	return &plat_arm_secure_partition_boot_info;
1406ec0c65bSUsama Arif }
1416ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */
1426ec0c65bSUsama Arif 
1436cb5d326STamas Ban #if TRUSTED_BOARD_BOOT || MEASURED_BOOT
1446ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
1456ec0c65bSUsama Arif {
1466ec0c65bSUsama Arif 	assert(heap_addr != NULL);
1476ec0c65bSUsama Arif 	assert(heap_size != NULL);
1486ec0c65bSUsama Arif 
1496ec0c65bSUsama Arif 	return arm_get_mbedtls_heap(heap_addr, heap_size);
1506ec0c65bSUsama Arif }
1516ec0c65bSUsama Arif #endif
1526ec0c65bSUsama Arif 
1536ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void)
1546ec0c65bSUsama Arif {
15528b2d86cSMadhukar Pappireddy 	sbsa_wdog_start(SBSA_SECURE_WDOG_CONTROL_BASE, SBSA_SECURE_WDOG_TIMEOUT);
1566ec0c65bSUsama Arif }
1576ec0c65bSUsama Arif 
1586ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void)
1596ec0c65bSUsama Arif {
16028b2d86cSMadhukar Pappireddy 	sbsa_wdog_stop(SBSA_SECURE_WDOG_CONTROL_BASE);
16128b2d86cSMadhukar Pappireddy }
16228b2d86cSMadhukar Pappireddy 
16328b2d86cSMadhukar Pappireddy void plat_arm_secure_wdt_refresh(void)
16428b2d86cSMadhukar Pappireddy {
16528b2d86cSMadhukar Pappireddy 	sbsa_wdog_refresh(SBSA_SECURE_WDOG_REFRESH_BASE);
1666ec0c65bSUsama Arif }
1676f503e0eSTamas Ban 
1686f503e0eSTamas Ban static sds_region_desc_t tc_sds_regions[] = {
1696f503e0eSTamas Ban 	{ .base = PLAT_ARM_SDS_MEM_BASE },
1707f8589cdSTamas Ban 	{ .base = PLAT_ARM_RSE_AP_SDS_MEM_BASE },
1716f503e0eSTamas Ban };
1726f503e0eSTamas Ban 
1736f503e0eSTamas Ban sds_region_desc_t *plat_sds_get_regions(unsigned int *region_count)
1746f503e0eSTamas Ban {
1756f503e0eSTamas Ban 	*region_count = ARRAY_SIZE(tc_sds_regions);
1766f503e0eSTamas Ban 
1776f503e0eSTamas Ban 	return tc_sds_regions;
1786f503e0eSTamas Ban }
179