1 /*
2  * Copyright (c) 2018-2022, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef SGI_BASE_PLATFORM_DEF_H
8 #define SGI_BASE_PLATFORM_DEF_H
9 
10 #include <lib/utils_def.h>
11 #include <lib/xlat_tables/xlat_tables_defs.h>
12 #include <plat/arm/common/arm_def.h>
13 #include <plat/arm/common/arm_spm_def.h>
14 #include <plat/arm/css/common/css_def.h>
15 #include <plat/common/common_def.h>
16 
17 #define PLATFORM_CORE_COUNT		(CSS_SGI_CHIP_COUNT *		\
18 					PLAT_ARM_CLUSTER_COUNT *	\
19 					CSS_SGI_MAX_CPUS_PER_CLUSTER *	\
20 					CSS_SGI_MAX_PE_PER_CPU)
21 
22 #define PLAT_ARM_TRUSTED_SRAM_SIZE	0x00080000	/* 512 KB */
23 
24 /* Remote chip address offset */
25 #define CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n)	\
26 		((ULL(1) << CSS_SGI_ADDR_BITS_PER_CHIP) * (n))
27 
28 /*
29  * PLAT_ARM_MMAP_ENTRIES depends on the number of entries in the
30  * plat_arm_mmap array defined for each BL stage. In addition to that, on
31  * multi-chip platforms, address regions on each of the remote chips are
32  * also mapped. In BL31, for instance, three address regions on the remote
33  * chips are accessed - secure ram, css device and soc device regions.
34  */
35 #if defined(IMAGE_BL31)
36 # if SPM_MM
37 #  define PLAT_ARM_MMAP_ENTRIES		(9  + ((CSS_SGI_CHIP_COUNT - 1) * 3))
38 #  define MAX_XLAT_TABLES		(7  + ((CSS_SGI_CHIP_COUNT - 1) * 3))
39 #  define PLAT_SP_IMAGE_MMAP_REGIONS	10
40 #  define PLAT_SP_IMAGE_MAX_XLAT_TABLES	12
41 # else
42 #  define PLAT_ARM_MMAP_ENTRIES		(5 + ((CSS_SGI_CHIP_COUNT - 1) * 3))
43 #  define MAX_XLAT_TABLES		(6 + ((CSS_SGI_CHIP_COUNT - 1) * 3))
44 # endif
45 #elif defined(IMAGE_BL32)
46 # define PLAT_ARM_MMAP_ENTRIES		8
47 # define MAX_XLAT_TABLES		5
48 #elif defined(IMAGE_BL2)
49 # define PLAT_ARM_MMAP_ENTRIES		(11 + (CSS_SGI_CHIP_COUNT - 1))
50 
51 /*
52  * MAX_XLAT_TABLES entries need to be doubled because when the address width
53  * exceeds 40 bits an additional level of translation is required. In case of
54  * multichip platforms peripherals also fall into address space with width
55  * > 40 bits
56  *
57  */
58 # define MAX_XLAT_TABLES		(7  + ((CSS_SGI_CHIP_COUNT - 1) * 2))
59 #elif !USE_ROMLIB
60 # define PLAT_ARM_MMAP_ENTRIES		11
61 # define MAX_XLAT_TABLES		7
62 #else
63 # define PLAT_ARM_MMAP_ENTRIES		12
64 # define MAX_XLAT_TABLES		6
65 #endif
66 
67 /*
68  * PLAT_ARM_MAX_BL1_RW_SIZE is calculated using the current BL1 RW debug size
69  * plus a little space for growth.
70  */
71 #define PLAT_ARM_MAX_BL1_RW_SIZE	(64 * 1024)	/* 64 KB */
72 
73 /*
74  * PLAT_ARM_MAX_ROMLIB_RW_SIZE is define to use a full page
75  */
76 
77 #if USE_ROMLIB
78 #define PLAT_ARM_MAX_ROMLIB_RW_SIZE	0x1000
79 #define PLAT_ARM_MAX_ROMLIB_RO_SIZE	0xe000
80 #else
81 #define PLAT_ARM_MAX_ROMLIB_RW_SIZE	0
82 #define PLAT_ARM_MAX_ROMLIB_RO_SIZE	0
83 #endif
84 
85 /*
86  * PLAT_ARM_MAX_BL2_SIZE is calculated using the current BL2 debug size plus a
87  * little space for growth. Additional 8KiB space is added per chip in
88  * order to accommodate the additional level of translation required for "TZC"
89  * peripheral access which lies in >4TB address space.
90  *
91  */
92 #if TRUSTED_BOARD_BOOT
93 # define PLAT_ARM_MAX_BL2_SIZE		(0x20000 + ((CSS_SGI_CHIP_COUNT - 1) * \
94 							0x2000))
95 #else
96 # define PLAT_ARM_MAX_BL2_SIZE		(0x14000 + ((CSS_SGI_CHIP_COUNT - 1) * \
97 							0x2000))
98 #endif
99 
100 /*
101  * Since BL31 NOBITS overlays BL2 and BL1-RW, PLAT_ARM_MAX_BL31_SIZE is
102  * calculated using the current BL31 PROGBITS debug size plus the sizes of BL2
103  * and BL1-RW. CSS_SGI_BL31_SIZE - is tuned with respect to the actual BL31
104  * PROGBITS size which is around 64-68KB at the time this change is being made.
105  * A buffer of ~35KB is added to account for future expansion of the image,
106  * making it a total of 100KB.
107  */
108 #define CSS_SGI_BL31_SIZE		(100 * 1024)	/* 100 KB */
109 #define PLAT_ARM_MAX_BL31_SIZE		(CSS_SGI_BL31_SIZE +		\
110 						PLAT_ARM_MAX_BL2_SIZE +	\
111 						PLAT_ARM_MAX_BL1_RW_SIZE)
112 
113 /*
114  * Size of cacheable stacks
115  */
116 #if defined(IMAGE_BL1)
117 # if TRUSTED_BOARD_BOOT
118 #  define PLATFORM_STACK_SIZE 0x1000
119 # else
120 #  define PLATFORM_STACK_SIZE 0x440
121 # endif
122 #elif defined(IMAGE_BL2)
123 # if TRUSTED_BOARD_BOOT
124 #  define PLATFORM_STACK_SIZE 0x1000
125 # else
126 #  define PLATFORM_STACK_SIZE 0x400
127 # endif
128 #elif defined(IMAGE_BL2U)
129 # define PLATFORM_STACK_SIZE 0x400
130 #elif defined(IMAGE_BL31)
131 # if SPM_MM
132 #  define PLATFORM_STACK_SIZE 0x500
133 # else
134 #  define PLATFORM_STACK_SIZE 0x400
135 # endif
136 #elif defined(IMAGE_BL32)
137 # define PLATFORM_STACK_SIZE 0x440
138 #endif
139 
140 /* PL011 UART related constants */
141 #define SOC_CSS_SEC_UART_BASE			UL(0x2A410000)
142 #define SOC_CSS_NSEC_UART_BASE			UL(0x2A400000)
143 #define SOC_CSS_UART_SIZE			UL(0x10000)
144 #define SOC_CSS_UART_CLK_IN_HZ			UL(7372800)
145 
146 /* UART related constants */
147 #define PLAT_ARM_BOOT_UART_BASE			SOC_CSS_SEC_UART_BASE
148 #define PLAT_ARM_BOOT_UART_CLK_IN_HZ		SOC_CSS_UART_CLK_IN_HZ
149 
150 #define PLAT_ARM_RUN_UART_BASE			SOC_CSS_SEC_UART_BASE
151 #define PLAT_ARM_RUN_UART_CLK_IN_HZ		SOC_CSS_UART_CLK_IN_HZ
152 
153 #define PLAT_ARM_CRASH_UART_BASE		SOC_CSS_SEC_UART_BASE
154 #define PLAT_ARM_CRASH_UART_CLK_IN_HZ		SOC_CSS_UART_CLK_IN_HZ
155 
156 #define PLAT_ARM_NSTIMER_FRAME_ID	0
157 
158 #define PLAT_ARM_TRUSTED_ROM_BASE	0x0
159 #define PLAT_ARM_TRUSTED_ROM_SIZE	0x00080000	/* 512KB */
160 
161 #define PLAT_ARM_NSRAM_BASE		0x06000000
162 #define PLAT_ARM_NSRAM_SIZE		0x00080000	/* 512KB */
163 
164 #define PLAT_ARM_DRAM2_BASE		ULL(0x8080000000)
165 #define PLAT_ARM_DRAM2_SIZE		ULL(0x180000000)
166 
167 #define PLAT_ARM_G1S_IRQ_PROPS(grp)	CSS_G1S_IRQ_PROPS(grp)
168 #define PLAT_ARM_G0_IRQ_PROPS(grp)	ARM_G0_IRQ_PROPS(grp)
169 
170 #define CSS_SGI_DEVICE_BASE	(0x20000000)
171 #define CSS_SGI_DEVICE_SIZE	(0x20000000)
172 #define CSS_SGI_MAP_DEVICE	MAP_REGION_FLAT(		\
173 					CSS_SGI_DEVICE_BASE,	\
174 					CSS_SGI_DEVICE_SIZE,	\
175 					MT_DEVICE | MT_RW | MT_SECURE)
176 
177 #define ARM_MAP_SHARED_RAM_REMOTE_CHIP(n)					\
178 			MAP_REGION_FLAT(					\
179 				CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) +		\
180 				ARM_SHARED_RAM_BASE,				\
181 				ARM_SHARED_RAM_SIZE,				\
182 				MT_NON_CACHEABLE | MT_RW | MT_SECURE		\
183 			)
184 
185 #define CSS_SGI_MAP_DEVICE_REMOTE_CHIP(n)					\
186 			MAP_REGION_FLAT(					\
187 				CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) +		\
188 				CSS_SGI_DEVICE_BASE,				\
189 				CSS_SGI_DEVICE_SIZE,				\
190 				MT_DEVICE | MT_RW | MT_SECURE			\
191 			)
192 
193 #define SOC_CSS_MAP_DEVICE_REMOTE_CHIP(n)					\
194 			MAP_REGION_FLAT(					\
195 				CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) +		\
196 				SOC_CSS_DEVICE_BASE,				\
197 				SOC_CSS_DEVICE_SIZE,				\
198 				MT_DEVICE | MT_RW | MT_SECURE			\
199 			)
200 
201 /* Map the secure region for access from S-EL0 */
202 #define PLAT_ARM_SECURE_MAP_DEVICE	MAP_REGION_FLAT(	\
203 					SOC_CSS_DEVICE_BASE,	\
204 					SOC_CSS_DEVICE_SIZE,	\
205 					MT_DEVICE | MT_RW | MT_SECURE | MT_USER)
206 
207 #define PLAT_SP_PRI				PLAT_RAS_PRI
208 
209 #if SPM_MM && RAS_EXTENSION
210 /*
211  * CPER buffer memory of 128KB is reserved and it is placed adjacent to the
212  * memory shared between EL3 and S-EL0.
213  */
214 #define CSS_SGI_SP_CPER_BUF_BASE	(PLAT_SP_IMAGE_NS_BUF_BASE + \
215 					 PLAT_SP_IMAGE_NS_BUF_SIZE)
216 #define CSS_SGI_SP_CPER_BUF_SIZE	ULL(0x20000)
217 #define CSS_SGI_SP_CPER_BUF_MMAP	MAP_REGION2(			       \
218 						CSS_SGI_SP_CPER_BUF_BASE,      \
219 						CSS_SGI_SP_CPER_BUF_BASE,      \
220 						CSS_SGI_SP_CPER_BUF_SIZE,      \
221 						MT_RW_DATA | MT_NS | MT_USER,  \
222 						PAGE_SIZE)
223 
224 /*
225  * Secure partition stack follows right after the memory space reserved for
226  * CPER buffer memory.
227  */
228 #define PLAT_ARM_SP_IMAGE_STACK_BASE		(PLAT_SP_IMAGE_NS_BUF_BASE +   \
229 						 PLAT_SP_IMAGE_NS_BUF_SIZE +   \
230 						 CSS_SGI_SP_CPER_BUF_SIZE)
231 #elif SPM_MM
232 /*
233  * Secure partition stack follows right after the memory region that is shared
234  * between EL3 and S-EL0.
235  */
236 #define PLAT_ARM_SP_IMAGE_STACK_BASE	(PLAT_SP_IMAGE_NS_BUF_BASE +	\
237 					 PLAT_SP_IMAGE_NS_BUF_SIZE)
238 #endif /* SPM_MM && RAS_EXTENSION */
239 
240 /* Platform ID address */
241 #define SSC_VERSION                     (SSC_REG_BASE + SSC_VERSION_OFFSET)
242 #ifndef __ASSEMBLER__
243 /* SSC_VERSION related accessors */
244 /* Returns the part number of the platform */
245 #define GET_SGI_PART_NUM                                       \
246 		GET_SSC_VERSION_PART_NUM(mmio_read_32(SSC_VERSION))
247 /* Returns the configuration number of the platform */
248 #define GET_SGI_CONFIG_NUM                                     \
249 		GET_SSC_VERSION_CONFIG(mmio_read_32(SSC_VERSION))
250 #endif /* __ASSEMBLER__ */
251 
252 /*******************************************************************************
253  * Memprotect definitions
254  ******************************************************************************/
255 /* PSCI memory protect definitions:
256  * This variable is stored in a non-secure flash because some ARM reference
257  * platforms do not have secure NVRAM. Real systems that provided MEM_PROTECT
258  * support must use a secure NVRAM to store the PSCI MEM_PROTECT definitions.
259  */
260 #define PLAT_ARM_MEM_PROT_ADDR		(V2M_FLASH0_BASE + \
261 					 V2M_FLASH0_SIZE - V2M_FLASH_BLOCK_SIZE)
262 
263 /*Secure Watchdog Constants */
264 #define SBSA_SECURE_WDOG_BASE		UL(0x2A480000)
265 #define SBSA_SECURE_WDOG_TIMEOUT	UL(100)
266 
267 /* Number of SCMI channels on the platform */
268 #define PLAT_ARM_SCMI_CHANNEL_COUNT	CSS_SGI_CHIP_COUNT
269 
270 /*
271  * Mapping definition of the TrustZone Controller for ARM SGI/RD platforms
272  * where both the DRAM regions are marked for non-secure access. This applies
273  * to multi-chip platforms.
274  */
275 #define SGI_PLAT_TZC_NS_REMOTE_REGIONS_DEF(n)				\
276 	{CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM1_BASE,		\
277 		CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM1_END,	\
278 		ARM_TZC_NS_DRAM_S_ACCESS, PLAT_ARM_TZC_NS_DEV_ACCESS},	\
279 	{CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM2_BASE,		\
280 		CSS_SGI_REMOTE_CHIP_MEM_OFFSET(n) + ARM_DRAM2_END,	\
281 		ARM_TZC_NS_DRAM_S_ACCESS, PLAT_ARM_TZC_NS_DEV_ACCESS}
282 
283 #if SPM_MM
284 
285 /*
286  * Stand-alone MM logs would be routed via secure UART. Define page table
287  * entry for secure UART which would be common to all platforms.
288  */
289 #define SOC_PLATFORM_SECURE_UART	MAP_REGION_FLAT(		\
290 					SOC_CSS_SEC_UART_BASE,		\
291 					SOC_CSS_UART_SIZE,		\
292 					MT_DEVICE | MT_RW | 		\
293 					MT_SECURE | MT_USER)
294 
295 #endif
296 
297 /* SDS ID for unusable CPU MPID list structure */
298 #define SDS_ISOLATED_CPU_LIST_ID		U(128)
299 
300 #endif /* SGI_BASE_PLATFORM_DEF_H */
301