xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_plat.c (revision 6ec0c65b09745fd0f4cee44ee3aa99870303f448)
1*6ec0c65bSUsama Arif /*
2*6ec0c65bSUsama Arif  * Copyright (c) 2020, ARM Limited and Contributors. All rights reserved.
3*6ec0c65bSUsama Arif  *
4*6ec0c65bSUsama Arif  * SPDX-License-Identifier: BSD-3-Clause
5*6ec0c65bSUsama Arif  */
6*6ec0c65bSUsama Arif 
7*6ec0c65bSUsama Arif #include <assert.h>
8*6ec0c65bSUsama Arif 
9*6ec0c65bSUsama Arif #include <platform_def.h>
10*6ec0c65bSUsama Arif 
11*6ec0c65bSUsama Arif #include <plat/common/platform.h>
12*6ec0c65bSUsama Arif #include <common/bl_common.h>
13*6ec0c65bSUsama Arif #include <common/debug.h>
14*6ec0c65bSUsama Arif #include <drivers/arm/ccn.h>
15*6ec0c65bSUsama Arif #include <plat/arm/common/plat_arm.h>
16*6ec0c65bSUsama Arif #include <plat/common/platform.h>
17*6ec0c65bSUsama Arif #include <drivers/arm/sbsa.h>
18*6ec0c65bSUsama Arif 
19*6ec0c65bSUsama Arif #if SPM_MM
20*6ec0c65bSUsama Arif #include <services/spm_mm_partition.h>
21*6ec0c65bSUsama Arif #endif
22*6ec0c65bSUsama Arif 
23*6ec0c65bSUsama Arif /*
24*6ec0c65bSUsama Arif  * Table of regions for different BL stages to map using the MMU.
25*6ec0c65bSUsama Arif  * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
26*6ec0c65bSUsama Arif  * arm_configure_mmu_elx() will give the available subset of that.
27*6ec0c65bSUsama Arif  */
28*6ec0c65bSUsama Arif #if IMAGE_BL1
29*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = {
30*6ec0c65bSUsama Arif 	ARM_MAP_SHARED_RAM,
31*6ec0c65bSUsama Arif 	TC_FLASH0_RO,
32*6ec0c65bSUsama Arif 	TC_MAP_DEVICE,
33*6ec0c65bSUsama Arif 	{0}
34*6ec0c65bSUsama Arif };
35*6ec0c65bSUsama Arif #endif
36*6ec0c65bSUsama Arif #if IMAGE_BL2
37*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = {
38*6ec0c65bSUsama Arif 	ARM_MAP_SHARED_RAM,
39*6ec0c65bSUsama Arif 	TC_FLASH0_RO,
40*6ec0c65bSUsama Arif 	TC_MAP_DEVICE,
41*6ec0c65bSUsama Arif 	TC_MAP_NS_DRAM1,
42*6ec0c65bSUsama Arif #if defined(SPD_spmd)
43*6ec0c65bSUsama Arif 	TC_MAP_TZC_DRAM1,
44*6ec0c65bSUsama Arif #endif
45*6ec0c65bSUsama Arif #if ARM_BL31_IN_DRAM
46*6ec0c65bSUsama Arif 	ARM_MAP_BL31_SEC_DRAM,
47*6ec0c65bSUsama Arif #endif
48*6ec0c65bSUsama Arif #if SPM_MM
49*6ec0c65bSUsama Arif 	ARM_SP_IMAGE_MMAP,
50*6ec0c65bSUsama Arif #endif
51*6ec0c65bSUsama Arif #if TRUSTED_BOARD_BOOT && !BL2_AT_EL3
52*6ec0c65bSUsama Arif 	ARM_MAP_BL1_RW,
53*6ec0c65bSUsama Arif #endif
54*6ec0c65bSUsama Arif #ifdef SPD_opteed
55*6ec0c65bSUsama Arif 	ARM_MAP_OPTEE_CORE_MEM,
56*6ec0c65bSUsama Arif 	ARM_OPTEE_PAGEABLE_LOAD_MEM,
57*6ec0c65bSUsama Arif #endif
58*6ec0c65bSUsama Arif 	{0}
59*6ec0c65bSUsama Arif };
60*6ec0c65bSUsama Arif #endif
61*6ec0c65bSUsama Arif #if IMAGE_BL31
62*6ec0c65bSUsama Arif const mmap_region_t plat_arm_mmap[] = {
63*6ec0c65bSUsama Arif 	ARM_MAP_SHARED_RAM,
64*6ec0c65bSUsama Arif 	V2M_MAP_IOFPGA,
65*6ec0c65bSUsama Arif 	TC_MAP_DEVICE,
66*6ec0c65bSUsama Arif #if SPM_MM
67*6ec0c65bSUsama Arif 	ARM_SPM_BUF_EL3_MMAP,
68*6ec0c65bSUsama Arif #endif
69*6ec0c65bSUsama Arif 	{0}
70*6ec0c65bSUsama Arif };
71*6ec0c65bSUsama Arif 
72*6ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31)
73*6ec0c65bSUsama Arif const mmap_region_t plat_arm_secure_partition_mmap[] = {
74*6ec0c65bSUsama Arif 	PLAT_ARM_SECURE_MAP_DEVICE,
75*6ec0c65bSUsama Arif 	ARM_SP_IMAGE_MMAP,
76*6ec0c65bSUsama Arif 	ARM_SP_IMAGE_NS_BUF_MMAP,
77*6ec0c65bSUsama Arif 	ARM_SP_CPER_BUF_MMAP,
78*6ec0c65bSUsama Arif 	ARM_SP_IMAGE_RW_MMAP,
79*6ec0c65bSUsama Arif 	ARM_SPM_BUF_EL0_MMAP,
80*6ec0c65bSUsama Arif 	{0}
81*6ec0c65bSUsama Arif };
82*6ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */
83*6ec0c65bSUsama Arif #endif
84*6ec0c65bSUsama Arif 
85*6ec0c65bSUsama Arif ARM_CASSERT_MMAP
86*6ec0c65bSUsama Arif 
87*6ec0c65bSUsama Arif #if SPM_MM && defined(IMAGE_BL31)
88*6ec0c65bSUsama Arif /*
89*6ec0c65bSUsama Arif  * Boot information passed to a secure partition during initialisation. Linear
90*6ec0c65bSUsama Arif  * indices in MP information will be filled at runtime.
91*6ec0c65bSUsama Arif  */
92*6ec0c65bSUsama Arif static spm_mm_mp_info_t sp_mp_info[] = {
93*6ec0c65bSUsama Arif 	[0] = {0x81000000, 0},
94*6ec0c65bSUsama Arif 	[1] = {0x81000100, 0},
95*6ec0c65bSUsama Arif 	[2] = {0x81000200, 0},
96*6ec0c65bSUsama Arif 	[3] = {0x81000300, 0},
97*6ec0c65bSUsama Arif 	[4] = {0x81010000, 0},
98*6ec0c65bSUsama Arif 	[5] = {0x81010100, 0},
99*6ec0c65bSUsama Arif 	[6] = {0x81010200, 0},
100*6ec0c65bSUsama Arif 	[7] = {0x81010300, 0},
101*6ec0c65bSUsama Arif };
102*6ec0c65bSUsama Arif 
103*6ec0c65bSUsama Arif const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = {
104*6ec0c65bSUsama Arif 	.h.type              = PARAM_SP_IMAGE_BOOT_INFO,
105*6ec0c65bSUsama Arif 	.h.version           = VERSION_1,
106*6ec0c65bSUsama Arif 	.h.size              = sizeof(spm_mm_boot_info_t),
107*6ec0c65bSUsama Arif 	.h.attr              = 0,
108*6ec0c65bSUsama Arif 	.sp_mem_base         = ARM_SP_IMAGE_BASE,
109*6ec0c65bSUsama Arif 	.sp_mem_limit        = ARM_SP_IMAGE_LIMIT,
110*6ec0c65bSUsama Arif 	.sp_image_base       = ARM_SP_IMAGE_BASE,
111*6ec0c65bSUsama Arif 	.sp_stack_base       = PLAT_SP_IMAGE_STACK_BASE,
112*6ec0c65bSUsama Arif 	.sp_heap_base        = ARM_SP_IMAGE_HEAP_BASE,
113*6ec0c65bSUsama Arif 	.sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE,
114*6ec0c65bSUsama Arif 	.sp_shared_buf_base  = PLAT_SPM_BUF_BASE,
115*6ec0c65bSUsama Arif 	.sp_image_size       = ARM_SP_IMAGE_SIZE,
116*6ec0c65bSUsama Arif 	.sp_pcpu_stack_size  = PLAT_SP_IMAGE_STACK_PCPU_SIZE,
117*6ec0c65bSUsama Arif 	.sp_heap_size        = ARM_SP_IMAGE_HEAP_SIZE,
118*6ec0c65bSUsama Arif 	.sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE,
119*6ec0c65bSUsama Arif 	.sp_shared_buf_size  = PLAT_SPM_BUF_SIZE,
120*6ec0c65bSUsama Arif 	.num_sp_mem_regions  = ARM_SP_IMAGE_NUM_MEM_REGIONS,
121*6ec0c65bSUsama Arif 	.num_cpus            = PLATFORM_CORE_COUNT,
122*6ec0c65bSUsama Arif 	.mp_info             = &sp_mp_info[0],
123*6ec0c65bSUsama Arif };
124*6ec0c65bSUsama Arif 
125*6ec0c65bSUsama Arif const struct mmap_region *plat_get_secure_partition_mmap(void *cookie)
126*6ec0c65bSUsama Arif {
127*6ec0c65bSUsama Arif 	return plat_arm_secure_partition_mmap;
128*6ec0c65bSUsama Arif }
129*6ec0c65bSUsama Arif 
130*6ec0c65bSUsama Arif const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
131*6ec0c65bSUsama Arif 		void *cookie)
132*6ec0c65bSUsama Arif {
133*6ec0c65bSUsama Arif 	return &plat_arm_secure_partition_boot_info;
134*6ec0c65bSUsama Arif }
135*6ec0c65bSUsama Arif #endif /* SPM_MM && defined(IMAGE_BL31) */
136*6ec0c65bSUsama Arif 
137*6ec0c65bSUsama Arif #if TRUSTED_BOARD_BOOT
138*6ec0c65bSUsama Arif int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
139*6ec0c65bSUsama Arif {
140*6ec0c65bSUsama Arif 	assert(heap_addr != NULL);
141*6ec0c65bSUsama Arif 	assert(heap_size != NULL);
142*6ec0c65bSUsama Arif 
143*6ec0c65bSUsama Arif 	return arm_get_mbedtls_heap(heap_addr, heap_size);
144*6ec0c65bSUsama Arif }
145*6ec0c65bSUsama Arif #endif
146*6ec0c65bSUsama Arif 
147*6ec0c65bSUsama Arif void plat_arm_secure_wdt_start(void)
148*6ec0c65bSUsama Arif {
149*6ec0c65bSUsama Arif 	sbsa_wdog_start(SBSA_SECURE_WDOG_BASE, SBSA_SECURE_WDOG_TIMEOUT);
150*6ec0c65bSUsama Arif }
151*6ec0c65bSUsama Arif 
152*6ec0c65bSUsama Arif void plat_arm_secure_wdt_stop(void)
153*6ec0c65bSUsama Arif {
154*6ec0c65bSUsama Arif 	sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE);
155*6ec0c65bSUsama Arif }
156