xref: /rk3399_ARM-atf/plat/arm/board/fvp/fvp_common.c (revision 1a0ebff784c11f0b11f203b56eeb3180f994c0b9)
13e4b8fdcSSoby Mathew /*
286e4859aSRohit Mathew  * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved.
33e4b8fdcSSoby Mathew  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
53e4b8fdcSSoby Mathew  */
63e4b8fdcSSoby Mathew 
709d40e0eSAntonio Nino Diaz #include <assert.h>
832904472SSoby Mathew #include <string.h>
909d40e0eSAntonio Nino Diaz 
1009d40e0eSAntonio Nino Diaz #include <common/debug.h>
1109d40e0eSAntonio Nino Diaz #include <drivers/arm/cci.h>
1209d40e0eSAntonio Nino Diaz #include <drivers/arm/ccn.h>
1309d40e0eSAntonio Nino Diaz #include <drivers/arm/gicv2.h>
141b597c22SAlexei Fedorov #include <drivers/arm/sp804_delay_timer.h>
151b597c22SAlexei Fedorov #include <drivers/generic_delay_timer.h>
1682685904SAlexeiFedorov #include <fconf_hw_config_getter.h>
1709d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
18ed9653ffSManish V Badarkhe #include <lib/smccc.h>
1909d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables_compat.h>
20234bc7f8SAntonio Nino Diaz #include <platform_def.h>
21ed9653ffSManish V Badarkhe #include <services/arm_arch_svc.h>
221d0ca40eSJavier Almansa Sobrino #include <services/rmm_core_manifest.h>
239d9ae976SOlivier Deprez #if SPM_MM
24aeaa225cSPaul Beesley #include <services/spm_mm_partition.h>
259d9ae976SOlivier Deprez #endif
2609d40e0eSAntonio Nino Diaz 
27ed9653ffSManish V Badarkhe #include <plat/arm/common/arm_config.h>
28ed9653ffSManish V Badarkhe #include <plat/arm/common/plat_arm.h>
29ed9653ffSManish V Badarkhe #include <plat/common/platform.h>
30ed9653ffSManish V Badarkhe 
311af540efSRoberto Vargas #include "fvp_private.h"
323e4b8fdcSSoby Mathew 
333e4b8fdcSSoby Mathew /* Defines for GIC Driver build time selection */
343e4b8fdcSSoby Mathew #define FVP_GICV2		1
353e4b8fdcSSoby Mathew #define FVP_GICV3		2
363e4b8fdcSSoby Mathew 
3732904472SSoby Mathew /* Defines for RMM Console*/
3832904472SSoby Mathew #define FVP_RMM_CONSOLE_BASE		UL(0x1c0c0000)
3932904472SSoby Mathew #define FVP_RMM_CONSOLE_BAUD		UL(115200)
4032904472SSoby Mathew #define FVP_RMM_CONSOLE_CLK_IN_HZ	UL(14745600)
4132904472SSoby Mathew #define FVP_RMM_CONSOLE_NAME		"pl011"
4232904472SSoby Mathew 
4332904472SSoby Mathew #define FVP_RMM_CONSOLE_COUNT		UL(1)
4432904472SSoby Mathew 
453e4b8fdcSSoby Mathew /*******************************************************************************
463e4b8fdcSSoby Mathew  * arm_config holds the characteristics of the differences between the three FVP
473e4b8fdcSSoby Mathew  * platforms (Base, A53_A57 & Foundation). It will be populated during cold boot
483e4b8fdcSSoby Mathew  * at each boot stage by the primary before enabling the MMU (to allow
493e4b8fdcSSoby Mathew  * interconnect configuration) & used thereafter. Each BL will have its own copy
503e4b8fdcSSoby Mathew  * to allow independent operation.
513e4b8fdcSSoby Mathew  ******************************************************************************/
523e4b8fdcSSoby Mathew arm_config_t arm_config;
533e4b8fdcSSoby Mathew 
543e4b8fdcSSoby Mathew #define MAP_DEVICE0	MAP_REGION_FLAT(DEVICE0_BASE,			\
553e4b8fdcSSoby Mathew 					DEVICE0_SIZE,			\
563e4b8fdcSSoby Mathew 					MT_DEVICE | MT_RW | MT_SECURE)
573e4b8fdcSSoby Mathew 
583e4b8fdcSSoby Mathew #define MAP_DEVICE1	MAP_REGION_FLAT(DEVICE1_BASE,			\
593e4b8fdcSSoby Mathew 					DEVICE1_SIZE,			\
603e4b8fdcSSoby Mathew 					MT_DEVICE | MT_RW | MT_SECURE)
613e4b8fdcSSoby Mathew 
62f98630fbSManish V Badarkhe #if FVP_GICR_REGION_PROTECTION
63f98630fbSManish V Badarkhe #define MAP_GICD_MEM	MAP_REGION_FLAT(BASE_GICD_BASE,			\
64f98630fbSManish V Badarkhe 					BASE_GICD_SIZE,			\
65f98630fbSManish V Badarkhe 					MT_DEVICE | MT_RW | MT_SECURE)
66f98630fbSManish V Badarkhe 
67f98630fbSManish V Badarkhe /* Map all core's redistributor memory as read-only. After boots up,
68f98630fbSManish V Badarkhe  * per-core map its redistributor memory as read-write */
69f98630fbSManish V Badarkhe #define MAP_GICR_MEM	MAP_REGION_FLAT(BASE_GICR_BASE,			\
70f98630fbSManish V Badarkhe 					(BASE_GICR_SIZE * PLATFORM_CORE_COUNT),\
71f98630fbSManish V Badarkhe 					MT_DEVICE | MT_RO | MT_SECURE)
72f98630fbSManish V Badarkhe #endif /* FVP_GICR_REGION_PROTECTION */
73f98630fbSManish V Badarkhe 
74284c3d67SSandrine Bailleux /*
75284c3d67SSandrine Bailleux  * Need to be mapped with write permissions in order to set a new non-volatile
76284c3d67SSandrine Bailleux  * counter value.
77284c3d67SSandrine Bailleux  */
783e4b8fdcSSoby Mathew #define MAP_DEVICE2	MAP_REGION_FLAT(DEVICE2_BASE,			\
793e4b8fdcSSoby Mathew 					DEVICE2_SIZE,			\
80fe7de035SAntonio Nino Diaz 					MT_DEVICE | MT_RW | MT_SECURE)
813e4b8fdcSSoby Mathew 
8294c90ac8SHarrison Mutai #if TRANSFER_LIST
8394c90ac8SHarrison Mutai #ifdef FW_NS_HANDOFF_BASE
84a5566f65SHarrison Mutai #define MAP_FW_NS_HANDOFF                                             \
85a5566f65SHarrison Mutai 	MAP_REGION_FLAT(FW_NS_HANDOFF_BASE, PLAT_ARM_FW_HANDOFF_SIZE, \
8694c90ac8SHarrison Mutai 			MT_MEMORY | MT_RW | MT_NS)
8794c90ac8SHarrison Mutai #endif
88a5566f65SHarrison Mutai #ifdef PLAT_ARM_EL3_FW_HANDOFF_BASE
89a5566f65SHarrison Mutai #define MAP_EL3_FW_HANDOFF                            \
90a5566f65SHarrison Mutai 	MAP_REGION_FLAT(PLAT_ARM_EL3_FW_HANDOFF_BASE, \
91a5566f65SHarrison Mutai 			PLAT_ARM_FW_HANDOFF_SIZE, MT_MEMORY | MT_RW | EL3_PAS)
92a5566f65SHarrison Mutai #endif
9394c90ac8SHarrison Mutai #endif
9494c90ac8SHarrison Mutai 
953e4b8fdcSSoby Mathew /*
96b5fa6563SSandrine Bailleux  * Table of memory regions for various BL stages to map using the MMU.
970916c38dSRoberto Vargas  * This doesn't include Trusted SRAM as setup_page_tables() already takes care
980916c38dSRoberto Vargas  * of mapping it.
993e4b8fdcSSoby Mathew  */
1003d8256b2SMasahiro Yamada #ifdef IMAGE_BL1
1013e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
1023e4b8fdcSSoby Mathew 	ARM_MAP_SHARED_RAM,
10379d8be3cSManish V Badarkhe 	V2M_MAP_FLASH0_RO,
1043e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
1053e4b8fdcSSoby Mathew 	MAP_DEVICE0,
106e0cea783SManish V Badarkhe #if FVP_INTERCONNECT_DRIVER == FVP_CCN
1073e4b8fdcSSoby Mathew 	MAP_DEVICE1,
108e0cea783SManish V Badarkhe #endif
1093e4b8fdcSSoby Mathew #if TRUSTED_BOARD_BOOT
110284c3d67SSandrine Bailleux 	/* To access the Root of Trust Public Key registers. */
111284c3d67SSandrine Bailleux 	MAP_DEVICE2,
112284c3d67SSandrine Bailleux 	/* Map DRAM to authenticate NS_BL2U image. */
1133e4b8fdcSSoby Mathew 	ARM_MAP_NS_DRAM1,
1143e4b8fdcSSoby Mathew #endif
1153e4b8fdcSSoby Mathew 	{0}
1163e4b8fdcSSoby Mathew };
1173e4b8fdcSSoby Mathew #endif
1183d8256b2SMasahiro Yamada #ifdef IMAGE_BL2
1193e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
1203e4b8fdcSSoby Mathew 	ARM_MAP_SHARED_RAM,
1213e4b8fdcSSoby Mathew 	V2M_MAP_FLASH0_RW,
1223e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
1233e4b8fdcSSoby Mathew 	MAP_DEVICE0,
124e0cea783SManish V Badarkhe #if FVP_INTERCONNECT_DRIVER == FVP_CCN
1253e4b8fdcSSoby Mathew 	MAP_DEVICE1,
126e0cea783SManish V Badarkhe #endif
1273e4b8fdcSSoby Mathew 	ARM_MAP_NS_DRAM1,
128402b3cf8SJulius Werner #ifdef __aarch64__
129b09ba056SRoberto Vargas 	ARM_MAP_DRAM2,
130b09ba056SRoberto Vargas #endif
13139f0b86aSManish V Badarkhe 	/*
13239f0b86aSManish V Badarkhe 	 * Required to load HW_CONFIG, SPMC and SPs to trusted DRAM.
13339f0b86aSManish V Badarkhe 	 */
13464758c97SAchin Gupta 	ARM_MAP_TRUSTED_DRAM,
1356b2e961fSManish V Badarkhe 
1366b2e961fSManish V Badarkhe 	/*
1376b2e961fSManish V Badarkhe 	 * Required to load Event Log in TZC secured memory
1386b2e961fSManish V Badarkhe 	 */
1396b2e961fSManish V Badarkhe #if MEASURED_BOOT && (defined(SPD_tspd) || defined(SPD_opteed) || \
1406b2e961fSManish V Badarkhe defined(SPD_spmd))
1416b2e961fSManish V Badarkhe 	ARM_MAP_EVENT_LOG_DRAM1,
1426b2e961fSManish V Badarkhe #endif /* MEASURED_BOOT && (SPD_tspd || SPD_opteed || SPD_spmd) */
1436b2e961fSManish V Badarkhe 
144c8720729SZelalem Aweke #if ENABLE_RME
145c8720729SZelalem Aweke 	ARM_MAP_RMM_DRAM,
146c8720729SZelalem Aweke 	ARM_MAP_GPT_L1_DRAM,
147c8720729SZelalem Aweke #endif /* ENABLE_RME */
1483eb2d672SSandrine Bailleux #ifdef SPD_tspd
1493e4b8fdcSSoby Mathew 	ARM_MAP_TSP_SEC_MEM,
1503eb2d672SSandrine Bailleux #endif
151284c3d67SSandrine Bailleux #if TRUSTED_BOARD_BOOT
152284c3d67SSandrine Bailleux 	/* To access the Root of Trust Public Key registers. */
153284c3d67SSandrine Bailleux 	MAP_DEVICE2,
154ba597da7SJohn Tsichritzis #endif /* TRUSTED_BOARD_BOOT */
15588c51c3fSManish V Badarkhe 
15642d4d3baSArvind Ram Prakash #if CRYPTO_SUPPORT && !RESET_TO_BL2
15788c51c3fSManish V Badarkhe 	/*
15888c51c3fSManish V Badarkhe 	 * To access shared the Mbed TLS heap while booting the
15988c51c3fSManish V Badarkhe 	 * system with Crypto support
16088c51c3fSManish V Badarkhe 	 */
16188c51c3fSManish V Badarkhe 	ARM_MAP_BL1_RW,
16242d4d3baSArvind Ram Prakash #endif /* CRYPTO_SUPPORT && !RESET_TO_BL2 */
16344639ab7SMarc Bonnici #if SPM_MM || SPMC_AT_EL3
164e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_MMAP,
165e29efeb1SAntonio Nino Diaz #endif
1663e4b8fdcSSoby Mathew #if ARM_BL31_IN_DRAM
1673e4b8fdcSSoby Mathew 	ARM_MAP_BL31_SEC_DRAM,
1683e4b8fdcSSoby Mathew #endif
169810d9213SJens Wiklander #ifdef SPD_opteed
170b3ba6fdaSSoby Mathew 	ARM_MAP_OPTEE_CORE_MEM,
171810d9213SJens Wiklander 	ARM_OPTEE_PAGEABLE_LOAD_MEM,
172810d9213SJens Wiklander #endif
173a5566f65SHarrison Mutai #ifdef MAP_EL3_FW_HANDOFF
174a5566f65SHarrison Mutai 	MAP_EL3_FW_HANDOFF,
175a5566f65SHarrison Mutai #endif
1763e4b8fdcSSoby Mathew 	{ 0 }
1773e4b8fdcSSoby Mathew };
1783e4b8fdcSSoby Mathew #endif
1793d8256b2SMasahiro Yamada #ifdef IMAGE_BL2U
1803e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
1813e4b8fdcSSoby Mathew 	MAP_DEVICE0,
1823e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
1833e4b8fdcSSoby Mathew 	{0}
1843e4b8fdcSSoby Mathew };
1853e4b8fdcSSoby Mathew #endif
1863d8256b2SMasahiro Yamada #ifdef IMAGE_BL31
1873e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
1883e4b8fdcSSoby Mathew 	ARM_MAP_SHARED_RAM,
189992f091bSAmbroise Vincent #if USE_DEBUGFS
190992f091bSAmbroise Vincent 	/* Required by devfip, can be removed if devfip is not used */
191992f091bSAmbroise Vincent 	V2M_MAP_FLASH0_RW,
192992f091bSAmbroise Vincent #endif /* USE_DEBUGFS */
193e35a3fb5SSoby Mathew 	ARM_MAP_EL3_TZC_DRAM,
1943e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
1953e4b8fdcSSoby Mathew 	MAP_DEVICE0,
196f98630fbSManish V Badarkhe #if FVP_GICR_REGION_PROTECTION
197f98630fbSManish V Badarkhe 	MAP_GICD_MEM,
198f98630fbSManish V Badarkhe 	MAP_GICR_MEM,
199f98630fbSManish V Badarkhe #else
2003e4b8fdcSSoby Mathew 	MAP_DEVICE1,
201f98630fbSManish V Badarkhe #endif /* FVP_GICR_REGION_PROTECTION */
202f145403cSRoberto Vargas 	ARM_V2M_MAP_MEM_PROTECT,
2033f3c341aSPaul Beesley #if SPM_MM
204e29efeb1SAntonio Nino Diaz 	ARM_SPM_BUF_EL3_MMAP,
205e29efeb1SAntonio Nino Diaz #endif
206c8720729SZelalem Aweke #if ENABLE_RME
207c8720729SZelalem Aweke 	ARM_MAP_GPT_L1_DRAM,
2088c980a4aSJavier Almansa Sobrino 	ARM_MAP_EL3_RMM_SHARED_MEM,
209c8720729SZelalem Aweke #endif
21094c90ac8SHarrison Mutai #ifdef MAP_FW_NS_HANDOFF
21194c90ac8SHarrison Mutai 	MAP_FW_NS_HANDOFF,
21294c90ac8SHarrison Mutai #endif
213*1a0ebff7SHarrison Mutai #if defined(MAP_EL3_FW_HANDOFF) && !RESET_TO_BL31
214a5566f65SHarrison Mutai 	MAP_EL3_FW_HANDOFF,
215a5566f65SHarrison Mutai #endif
2163e4b8fdcSSoby Mathew 	{ 0 }
2173e4b8fdcSSoby Mathew };
218e29efeb1SAntonio Nino Diaz 
2193f3c341aSPaul Beesley #if defined(IMAGE_BL31) && SPM_MM
220e29efeb1SAntonio Nino Diaz const mmap_region_t plat_arm_secure_partition_mmap[] = {
221e29efeb1SAntonio Nino Diaz 	V2M_MAP_IOFPGA_EL0, /* for the UART */
2229fb76763Slevi.yun 	V2M_MAP_SECURE_SYSTEMREG_EL0, /* for initializing flash */
2239fb76763Slevi.yun #if PSA_FWU_SUPPORT
2249fb76763Slevi.yun 	V2M_MAP_FLASH0_RW_EL0, /* for firmware update service in standalone mm */
2259fb76763Slevi.yun #endif
2269fb76763Slevi.yun 	V2M_MAP_FLASH1_RW_EL0, /* for secure variable service in standalone mm */
2279a90d720SElyes Haouas 	MAP_REGION_FLAT(DEVICE0_BASE,
2289a90d720SElyes Haouas 			DEVICE0_SIZE,
229c4fa1739SSandrine Bailleux 			MT_DEVICE | MT_RO | MT_SECURE | MT_USER),
230e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_MMAP,
231e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_NS_BUF_MMAP,
232e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_RW_MMAP,
233e29efeb1SAntonio Nino Diaz 	ARM_SPM_BUF_EL0_MMAP,
234e29efeb1SAntonio Nino Diaz 	{0}
235e29efeb1SAntonio Nino Diaz };
236e29efeb1SAntonio Nino Diaz #endif
2373e4b8fdcSSoby Mathew #endif
2383d8256b2SMasahiro Yamada #ifdef IMAGE_BL32
2393e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
240402b3cf8SJulius Werner #ifndef __aarch64__
241877cf3ffSSoby Mathew 	ARM_MAP_SHARED_RAM,
242950c6956SJoel Hutton 	ARM_V2M_MAP_MEM_PROTECT,
243877cf3ffSSoby Mathew #endif
2443e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
2453e4b8fdcSSoby Mathew 	MAP_DEVICE0,
2463e4b8fdcSSoby Mathew 	MAP_DEVICE1,
2473e4b8fdcSSoby Mathew 	{0}
2483e4b8fdcSSoby Mathew };
2493e4b8fdcSSoby Mathew #endif
2503e4b8fdcSSoby Mathew 
2519d870b79SZelalem Aweke #ifdef IMAGE_RMM
2529d870b79SZelalem Aweke const mmap_region_t plat_arm_mmap[] = {
2539d870b79SZelalem Aweke 	V2M_MAP_IOFPGA,
2549d870b79SZelalem Aweke 	MAP_DEVICE0,
2559d870b79SZelalem Aweke 	MAP_DEVICE1,
2569d870b79SZelalem Aweke 	{0}
2579d870b79SZelalem Aweke };
2589d870b79SZelalem Aweke #endif
2599d870b79SZelalem Aweke 
2603e4b8fdcSSoby Mathew ARM_CASSERT_MMAP
2613e4b8fdcSSoby Mathew 
262955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER != FVP_CCN
263955242d8SJeenu Viswambharan static const int fvp_cci400_map[] = {
264955242d8SJeenu Viswambharan 	PLAT_FVP_CCI400_CLUS0_SL_PORT,
265955242d8SJeenu Viswambharan 	PLAT_FVP_CCI400_CLUS1_SL_PORT,
266955242d8SJeenu Viswambharan };
267955242d8SJeenu Viswambharan 
268955242d8SJeenu Viswambharan static const int fvp_cci5xx_map[] = {
269955242d8SJeenu Viswambharan 	PLAT_FVP_CCI5XX_CLUS0_SL_PORT,
270955242d8SJeenu Viswambharan 	PLAT_FVP_CCI5XX_CLUS1_SL_PORT,
271955242d8SJeenu Viswambharan };
272955242d8SJeenu Viswambharan 
273955242d8SJeenu Viswambharan static unsigned int get_interconnect_master(void)
274955242d8SJeenu Viswambharan {
275955242d8SJeenu Viswambharan 	unsigned int master;
276955242d8SJeenu Viswambharan 	u_register_t mpidr;
277955242d8SJeenu Viswambharan 
278955242d8SJeenu Viswambharan 	mpidr = read_mpidr_el1();
279583e0791SAntonio Nino Diaz 	master = ((arm_config.flags & ARM_CONFIG_FVP_SHIFTED_AFF) != 0U) ?
280955242d8SJeenu Viswambharan 		MPIDR_AFFLVL2_VAL(mpidr) : MPIDR_AFFLVL1_VAL(mpidr);
281955242d8SJeenu Viswambharan 
282955242d8SJeenu Viswambharan 	assert(master < FVP_CLUSTER_COUNT);
283955242d8SJeenu Viswambharan 	return master;
284955242d8SJeenu Viswambharan }
285955242d8SJeenu Viswambharan #endif
2863e4b8fdcSSoby Mathew 
2873f3c341aSPaul Beesley #if defined(IMAGE_BL31) && SPM_MM
288e29efeb1SAntonio Nino Diaz /*
289e29efeb1SAntonio Nino Diaz  * Boot information passed to a secure partition during initialisation. Linear
290e29efeb1SAntonio Nino Diaz  * indices in MP information will be filled at runtime.
291e29efeb1SAntonio Nino Diaz  */
292aeaa225cSPaul Beesley static spm_mm_mp_info_t sp_mp_info[] = {
293e29efeb1SAntonio Nino Diaz 	[0] = {0x80000000, 0},
294e29efeb1SAntonio Nino Diaz 	[1] = {0x80000001, 0},
295e29efeb1SAntonio Nino Diaz 	[2] = {0x80000002, 0},
296e29efeb1SAntonio Nino Diaz 	[3] = {0x80000003, 0},
297e29efeb1SAntonio Nino Diaz 	[4] = {0x80000100, 0},
298e29efeb1SAntonio Nino Diaz 	[5] = {0x80000101, 0},
299e29efeb1SAntonio Nino Diaz 	[6] = {0x80000102, 0},
300e29efeb1SAntonio Nino Diaz 	[7] = {0x80000103, 0},
301e29efeb1SAntonio Nino Diaz };
302e29efeb1SAntonio Nino Diaz 
303aeaa225cSPaul Beesley const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = {
304e29efeb1SAntonio Nino Diaz 	.h.type              = PARAM_SP_IMAGE_BOOT_INFO,
305e29efeb1SAntonio Nino Diaz 	.h.version           = VERSION_1,
306aeaa225cSPaul Beesley 	.h.size              = sizeof(spm_mm_boot_info_t),
307e29efeb1SAntonio Nino Diaz 	.h.attr              = 0,
308e29efeb1SAntonio Nino Diaz 	.sp_mem_base         = ARM_SP_IMAGE_BASE,
309e29efeb1SAntonio Nino Diaz 	.sp_mem_limit        = ARM_SP_IMAGE_LIMIT,
310e29efeb1SAntonio Nino Diaz 	.sp_image_base       = ARM_SP_IMAGE_BASE,
311e29efeb1SAntonio Nino Diaz 	.sp_stack_base       = PLAT_SP_IMAGE_STACK_BASE,
312e29efeb1SAntonio Nino Diaz 	.sp_heap_base        = ARM_SP_IMAGE_HEAP_BASE,
3130560efb9SArd Biesheuvel 	.sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE,
314e29efeb1SAntonio Nino Diaz 	.sp_shared_buf_base  = PLAT_SPM_BUF_BASE,
315e29efeb1SAntonio Nino Diaz 	.sp_image_size       = ARM_SP_IMAGE_SIZE,
316e29efeb1SAntonio Nino Diaz 	.sp_pcpu_stack_size  = PLAT_SP_IMAGE_STACK_PCPU_SIZE,
317e29efeb1SAntonio Nino Diaz 	.sp_heap_size        = ARM_SP_IMAGE_HEAP_SIZE,
3180560efb9SArd Biesheuvel 	.sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE,
319e29efeb1SAntonio Nino Diaz 	.sp_shared_buf_size  = PLAT_SPM_BUF_SIZE,
320e29efeb1SAntonio Nino Diaz 	.num_sp_mem_regions  = ARM_SP_IMAGE_NUM_MEM_REGIONS,
321e29efeb1SAntonio Nino Diaz 	.num_cpus            = PLATFORM_CORE_COUNT,
322e29efeb1SAntonio Nino Diaz 	.mp_info             = &sp_mp_info[0],
323e29efeb1SAntonio Nino Diaz };
324e29efeb1SAntonio Nino Diaz 
325e29efeb1SAntonio Nino Diaz const struct mmap_region *plat_get_secure_partition_mmap(void *cookie)
326e29efeb1SAntonio Nino Diaz {
327e29efeb1SAntonio Nino Diaz 	return plat_arm_secure_partition_mmap;
328e29efeb1SAntonio Nino Diaz }
329e29efeb1SAntonio Nino Diaz 
330aeaa225cSPaul Beesley const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
331e29efeb1SAntonio Nino Diaz 		void *cookie)
332e29efeb1SAntonio Nino Diaz {
333e29efeb1SAntonio Nino Diaz 	return &plat_arm_secure_partition_boot_info;
334e29efeb1SAntonio Nino Diaz }
335e29efeb1SAntonio Nino Diaz #endif
336e29efeb1SAntonio Nino Diaz 
3373e4b8fdcSSoby Mathew /*******************************************************************************
3383e4b8fdcSSoby Mathew  * A single boot loader stack is expected to work on both the Foundation FVP
3393e4b8fdcSSoby Mathew  * models and the two flavours of the Base FVP models (AEMv8 & Cortex). The
3403e4b8fdcSSoby Mathew  * SYS_ID register provides a mechanism for detecting the differences between
3413e4b8fdcSSoby Mathew  * these platforms. This information is stored in a per-BL array to allow the
3423e4b8fdcSSoby Mathew  * code to take the correct path.Per BL platform configuration.
3433e4b8fdcSSoby Mathew  ******************************************************************************/
3444d010d0dSDaniel Boulby void __init fvp_config_setup(void)
3453e4b8fdcSSoby Mathew {
3463e4b8fdcSSoby Mathew 	unsigned int rev, hbi, bld, arch, sys_id;
3473e4b8fdcSSoby Mathew 
3483e4b8fdcSSoby Mathew 	sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
3493e4b8fdcSSoby Mathew 	rev = (sys_id >> V2M_SYS_ID_REV_SHIFT) & V2M_SYS_ID_REV_MASK;
3503e4b8fdcSSoby Mathew 	hbi = (sys_id >> V2M_SYS_ID_HBI_SHIFT) & V2M_SYS_ID_HBI_MASK;
3513e4b8fdcSSoby Mathew 	bld = (sys_id >> V2M_SYS_ID_BLD_SHIFT) & V2M_SYS_ID_BLD_MASK;
3523e4b8fdcSSoby Mathew 	arch = (sys_id >> V2M_SYS_ID_ARCH_SHIFT) & V2M_SYS_ID_ARCH_MASK;
3533e4b8fdcSSoby Mathew 
3543e4b8fdcSSoby Mathew 	if (arch != ARCH_MODEL) {
3553e4b8fdcSSoby Mathew 		ERROR("This firmware is for FVP models\n");
3563e4b8fdcSSoby Mathew 		panic();
3573e4b8fdcSSoby Mathew 	}
3583e4b8fdcSSoby Mathew 
3593e4b8fdcSSoby Mathew 	/*
3603e4b8fdcSSoby Mathew 	 * The build field in the SYS_ID tells which variant of the GIC
3613e4b8fdcSSoby Mathew 	 * memory is implemented by the model.
3623e4b8fdcSSoby Mathew 	 */
3633e4b8fdcSSoby Mathew 	switch (bld) {
3643e4b8fdcSSoby Mathew 	case BLD_GIC_VE_MMAP:
36521a3973dSSoby Mathew 		ERROR("Legacy Versatile Express memory map for GIC peripheral"
36621a3973dSSoby Mathew 				" is not supported\n");
3673e4b8fdcSSoby Mathew 		panic();
3683e4b8fdcSSoby Mathew 		break;
3693e4b8fdcSSoby Mathew 	case BLD_GIC_A53A57_MMAP:
3703e4b8fdcSSoby Mathew 		break;
3713e4b8fdcSSoby Mathew 	default:
3723e4b8fdcSSoby Mathew 		ERROR("Unsupported board build %x\n", bld);
3733e4b8fdcSSoby Mathew 		panic();
3743e4b8fdcSSoby Mathew 	}
3753e4b8fdcSSoby Mathew 
3763e4b8fdcSSoby Mathew 	/*
3773e4b8fdcSSoby Mathew 	 * The hbi field in the SYS_ID is 0x020 for the Base FVP & 0x010
3783e4b8fdcSSoby Mathew 	 * for the Foundation FVP.
3793e4b8fdcSSoby Mathew 	 */
3803e4b8fdcSSoby Mathew 	switch (hbi) {
3813e4b8fdcSSoby Mathew 	case HBI_FOUNDATION_FVP:
3823e4b8fdcSSoby Mathew 		arm_config.flags = 0;
3833e4b8fdcSSoby Mathew 
3843e4b8fdcSSoby Mathew 		/*
3853e4b8fdcSSoby Mathew 		 * Check for supported revisions of Foundation FVP
3863e4b8fdcSSoby Mathew 		 * Allow future revisions to run but emit warning diagnostic
3873e4b8fdcSSoby Mathew 		 */
3883e4b8fdcSSoby Mathew 		switch (rev) {
3893e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_V2_0:
3903e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_V2_1:
3913e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_v9_1:
3924faa4a1dSSandrine Bailleux 		case REV_FOUNDATION_FVP_v9_6:
3933e4b8fdcSSoby Mathew 			break;
3943e4b8fdcSSoby Mathew 		default:
3953e4b8fdcSSoby Mathew 			WARN("Unrecognized Foundation FVP revision %x\n", rev);
3963e4b8fdcSSoby Mathew 			break;
3973e4b8fdcSSoby Mathew 		}
3983e4b8fdcSSoby Mathew 		break;
3993e4b8fdcSSoby Mathew 	case HBI_BASE_FVP:
400955242d8SJeenu Viswambharan 		arm_config.flags |= (ARM_CONFIG_BASE_MMAP | ARM_CONFIG_HAS_TZC);
4013e4b8fdcSSoby Mathew 
4023e4b8fdcSSoby Mathew 		/*
4033e4b8fdcSSoby Mathew 		 * Check for supported revisions
4043e4b8fdcSSoby Mathew 		 * Allow future revisions to run but emit warning diagnostic
4053e4b8fdcSSoby Mathew 		 */
4063e4b8fdcSSoby Mathew 		switch (rev) {
4073e4b8fdcSSoby Mathew 		case REV_BASE_FVP_V0:
408955242d8SJeenu Viswambharan 			arm_config.flags |= ARM_CONFIG_FVP_HAS_CCI400;
409955242d8SJeenu Viswambharan 			break;
410955242d8SJeenu Viswambharan 		case REV_BASE_FVP_REVC:
4118431635bSIsla Mitchell 			arm_config.flags |= (ARM_CONFIG_FVP_HAS_SMMUV3 |
412955242d8SJeenu Viswambharan 					ARM_CONFIG_FVP_HAS_CCI5XX);
4133e4b8fdcSSoby Mathew 			break;
4143e4b8fdcSSoby Mathew 		default:
4153e4b8fdcSSoby Mathew 			WARN("Unrecognized Base FVP revision %x\n", rev);
4163e4b8fdcSSoby Mathew 			break;
4173e4b8fdcSSoby Mathew 		}
4183e4b8fdcSSoby Mathew 		break;
4193e4b8fdcSSoby Mathew 	default:
4203e4b8fdcSSoby Mathew 		ERROR("Unsupported board HBI number 0x%x\n", hbi);
4213e4b8fdcSSoby Mathew 		panic();
4223e4b8fdcSSoby Mathew 	}
4238431635bSIsla Mitchell 
4248431635bSIsla Mitchell 	/*
4258431635bSIsla Mitchell 	 * We assume that the presence of MT bit, and therefore shifted
4268431635bSIsla Mitchell 	 * affinities, is uniform across the platform: either all CPUs, or no
4278431635bSIsla Mitchell 	 * CPUs implement it.
4288431635bSIsla Mitchell 	 */
429583e0791SAntonio Nino Diaz 	if ((read_mpidr_el1() & MPIDR_MT_MASK) != 0U)
4308431635bSIsla Mitchell 		arm_config.flags |= ARM_CONFIG_FVP_SHIFTED_AFF;
4313e4b8fdcSSoby Mathew }
4323e4b8fdcSSoby Mathew 
4333e4b8fdcSSoby Mathew 
4344d010d0dSDaniel Boulby void __init fvp_interconnect_init(void)
4353e4b8fdcSSoby Mathew {
43671237876SSoby Mathew #if FVP_INTERCONNECT_DRIVER == FVP_CCN
43771237876SSoby Mathew 	if (ccn_get_part0_id(PLAT_ARM_CCN_BASE) != CCN_502_PART0_ID) {
438583e0791SAntonio Nino Diaz 		ERROR("Unrecognized CCN variant detected. Only CCN-502 is supported");
43971237876SSoby Mathew 		panic();
44071237876SSoby Mathew 	}
441955242d8SJeenu Viswambharan 
4423e4b8fdcSSoby Mathew 	plat_arm_interconnect_init();
443955242d8SJeenu Viswambharan #else
444583e0791SAntonio Nino Diaz 	uintptr_t cci_base = 0U;
445583e0791SAntonio Nino Diaz 	const int *cci_map = NULL;
446583e0791SAntonio Nino Diaz 	unsigned int map_size = 0U;
447955242d8SJeenu Viswambharan 
448955242d8SJeenu Viswambharan 	/* Initialize the right interconnect */
449583e0791SAntonio Nino Diaz 	if ((arm_config.flags & ARM_CONFIG_FVP_HAS_CCI5XX) != 0U) {
450955242d8SJeenu Viswambharan 		cci_base = PLAT_FVP_CCI5XX_BASE;
451955242d8SJeenu Viswambharan 		cci_map = fvp_cci5xx_map;
452955242d8SJeenu Viswambharan 		map_size = ARRAY_SIZE(fvp_cci5xx_map);
453583e0791SAntonio Nino Diaz 	} else if ((arm_config.flags & ARM_CONFIG_FVP_HAS_CCI400) != 0U) {
454955242d8SJeenu Viswambharan 		cci_base = PLAT_FVP_CCI400_BASE;
455955242d8SJeenu Viswambharan 		cci_map = fvp_cci400_map;
456955242d8SJeenu Viswambharan 		map_size = ARRAY_SIZE(fvp_cci400_map);
457583e0791SAntonio Nino Diaz 	} else {
458583e0791SAntonio Nino Diaz 		return;
459955242d8SJeenu Viswambharan 	}
460955242d8SJeenu Viswambharan 
461583e0791SAntonio Nino Diaz 	assert(cci_base != 0U);
462583e0791SAntonio Nino Diaz 	assert(cci_map != NULL);
463955242d8SJeenu Viswambharan 	cci_init(cci_base, cci_map, map_size);
464955242d8SJeenu Viswambharan #endif
46571237876SSoby Mathew }
4663e4b8fdcSSoby Mathew 
4673e4b8fdcSSoby Mathew void fvp_interconnect_enable(void)
4683e4b8fdcSSoby Mathew {
469955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER == FVP_CCN
4703e4b8fdcSSoby Mathew 	plat_arm_interconnect_enter_coherency();
471955242d8SJeenu Viswambharan #else
472955242d8SJeenu Viswambharan 	unsigned int master;
473955242d8SJeenu Viswambharan 
474583e0791SAntonio Nino Diaz 	if ((arm_config.flags & (ARM_CONFIG_FVP_HAS_CCI400 |
475583e0791SAntonio Nino Diaz 				 ARM_CONFIG_FVP_HAS_CCI5XX)) != 0U) {
476955242d8SJeenu Viswambharan 		master = get_interconnect_master();
477955242d8SJeenu Viswambharan 		cci_enable_snoop_dvm_reqs(master);
478955242d8SJeenu Viswambharan 	}
479955242d8SJeenu Viswambharan #endif
4803e4b8fdcSSoby Mathew }
4813e4b8fdcSSoby Mathew 
4823e4b8fdcSSoby Mathew void fvp_interconnect_disable(void)
4833e4b8fdcSSoby Mathew {
484955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER == FVP_CCN
4853e4b8fdcSSoby Mathew 	plat_arm_interconnect_exit_coherency();
486955242d8SJeenu Viswambharan #else
487955242d8SJeenu Viswambharan 	unsigned int master;
488955242d8SJeenu Viswambharan 
489583e0791SAntonio Nino Diaz 	if ((arm_config.flags & (ARM_CONFIG_FVP_HAS_CCI400 |
490583e0791SAntonio Nino Diaz 				 ARM_CONFIG_FVP_HAS_CCI5XX)) != 0U) {
491955242d8SJeenu Viswambharan 		master = get_interconnect_master();
492955242d8SJeenu Viswambharan 		cci_disable_snoop_dvm_reqs(master);
493955242d8SJeenu Viswambharan 	}
494955242d8SJeenu Viswambharan #endif
4953e4b8fdcSSoby Mathew }
496ba597da7SJohn Tsichritzis 
49788c51c3fSManish V Badarkhe #if CRYPTO_SUPPORT
498ba597da7SJohn Tsichritzis int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
499ba597da7SJohn Tsichritzis {
500ba597da7SJohn Tsichritzis 	assert(heap_addr != NULL);
501ba597da7SJohn Tsichritzis 	assert(heap_size != NULL);
502ba597da7SJohn Tsichritzis 
503ba597da7SJohn Tsichritzis 	return arm_get_mbedtls_heap(heap_addr, heap_size);
504ba597da7SJohn Tsichritzis }
50588c51c3fSManish V Badarkhe #endif /* CRYPTO_SUPPORT */
5061b597c22SAlexei Fedorov 
5071b597c22SAlexei Fedorov void fvp_timer_init(void)
5081b597c22SAlexei Fedorov {
509fddfb3baSMadhukar Pappireddy #if USE_SP804_TIMER
5101b597c22SAlexei Fedorov 	/* Enable the clock override for SP804 timer 0, which means that no
5111b597c22SAlexei Fedorov 	 * clock dividers are applied and the raw (35MHz) clock will be used.
5121b597c22SAlexei Fedorov 	 */
5131b597c22SAlexei Fedorov 	mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV);
5141b597c22SAlexei Fedorov 
5151b597c22SAlexei Fedorov 	/* Initialize delay timer driver using SP804 dual timer 0 */
5161b597c22SAlexei Fedorov 	sp804_timer_init(V2M_SP804_TIMER0_BASE,
5171b597c22SAlexei Fedorov 			SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV);
5181b597c22SAlexei Fedorov #else
5191b597c22SAlexei Fedorov 	generic_delay_timer_init();
5201b597c22SAlexei Fedorov 
5211b597c22SAlexei Fedorov 	/* Enable System level generic timer */
5221b597c22SAlexei Fedorov 	mmio_write_32(ARM_SYS_CNTCTL_BASE + CNTCR_OFF,
5231b597c22SAlexei Fedorov 			CNTCR_FCREQ(0U) | CNTCR_EN);
524fddfb3baSMadhukar Pappireddy #endif /* USE_SP804_TIMER */
5251b597c22SAlexei Fedorov }
526ed9653ffSManish V Badarkhe 
527ed9653ffSManish V Badarkhe /*****************************************************************************
528ed9653ffSManish V Badarkhe  * plat_is_smccc_feature_available() - This function checks whether SMCCC
529ed9653ffSManish V Badarkhe  *                                     feature is availabile for platform.
530ed9653ffSManish V Badarkhe  * @fid: SMCCC function id
531ed9653ffSManish V Badarkhe  *
532ed9653ffSManish V Badarkhe  * Return SMC_ARCH_CALL_SUCCESS if SMCCC feature is available and
533ed9653ffSManish V Badarkhe  * SMC_ARCH_CALL_NOT_SUPPORTED otherwise.
534ed9653ffSManish V Badarkhe  *****************************************************************************/
535ed9653ffSManish V Badarkhe int32_t plat_is_smccc_feature_available(u_register_t fid)
536ed9653ffSManish V Badarkhe {
537ed9653ffSManish V Badarkhe 	switch (fid) {
538ed9653ffSManish V Badarkhe 	case SMCCC_ARCH_SOC_ID:
539ed9653ffSManish V Badarkhe 		return SMC_ARCH_CALL_SUCCESS;
540ed9653ffSManish V Badarkhe 	default:
541ed9653ffSManish V Badarkhe 		return SMC_ARCH_CALL_NOT_SUPPORTED;
542ed9653ffSManish V Badarkhe 	}
543ed9653ffSManish V Badarkhe }
544ed9653ffSManish V Badarkhe 
545ed9653ffSManish V Badarkhe /* Get SOC version */
546ed9653ffSManish V Badarkhe int32_t plat_get_soc_version(void)
547ed9653ffSManish V Badarkhe {
548ed9653ffSManish V Badarkhe 	return (int32_t)
549dfff4686SYann Gautier 		(SOC_ID_SET_JEP_106(ARM_SOC_CONTINUATION_CODE,
550dfff4686SYann Gautier 				    ARM_SOC_IDENTIFICATION_CODE) |
551dfff4686SYann Gautier 		 (FVP_SOC_ID & SOC_ID_IMPL_DEF_MASK));
552ed9653ffSManish V Badarkhe }
553ed9653ffSManish V Badarkhe 
554ed9653ffSManish V Badarkhe /* Get SOC revision */
555ed9653ffSManish V Badarkhe int32_t plat_get_soc_revision(void)
556ed9653ffSManish V Badarkhe {
557ed9653ffSManish V Badarkhe 	unsigned int sys_id;
558ed9653ffSManish V Badarkhe 
559ed9653ffSManish V Badarkhe 	sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
560dfff4686SYann Gautier 	return (int32_t)(((sys_id >> V2M_SYS_ID_REV_SHIFT) &
561dfff4686SYann Gautier 			  V2M_SYS_ID_REV_MASK) & SOC_ID_REV_MASK);
562ed9653ffSManish V Badarkhe }
5638c980a4aSJavier Almansa Sobrino 
5648c980a4aSJavier Almansa Sobrino #if ENABLE_RME
5658c980a4aSJavier Almansa Sobrino /*
5668c980a4aSJavier Almansa Sobrino  * Get a pointer to the RMM-EL3 Shared buffer and return it
5678c980a4aSJavier Almansa Sobrino  * through the pointer passed as parameter.
5688c980a4aSJavier Almansa Sobrino  *
5698c980a4aSJavier Almansa Sobrino  * This function returns the size of the shared buffer.
5708c980a4aSJavier Almansa Sobrino  */
5718c980a4aSJavier Almansa Sobrino size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared)
5728c980a4aSJavier Almansa Sobrino {
5738c980a4aSJavier Almansa Sobrino 	*shared = (uintptr_t)RMM_SHARED_BASE;
5748c980a4aSJavier Almansa Sobrino 
5758c980a4aSJavier Almansa Sobrino 	return (size_t)RMM_SHARED_SIZE;
5768c980a4aSJavier Almansa Sobrino }
5771d0ca40eSJavier Almansa Sobrino 
578a97bfa5fSAlexeiFedorov int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
5791d0ca40eSJavier Almansa Sobrino {
58032904472SSoby Mathew 	uint64_t checksum, num_banks, num_consoles;
58182685904SAlexeiFedorov 	struct ns_dram_bank *bank_ptr;
58232904472SSoby Mathew 	struct console_info *console_ptr;
583a97bfa5fSAlexeiFedorov 
5841d0ca40eSJavier Almansa Sobrino 	assert(manifest != NULL);
5851d0ca40eSJavier Almansa Sobrino 
58682685904SAlexeiFedorov 	/* Get number of DRAM banks */
58782685904SAlexeiFedorov 	num_banks = FCONF_GET_PROPERTY(hw_config, dram_layout, num_banks);
58882685904SAlexeiFedorov 	assert(num_banks <= ARM_DRAM_NUM_BANKS);
58982685904SAlexeiFedorov 
59032904472SSoby Mathew 	/* Set number of consoles */
59132904472SSoby Mathew 	num_consoles = FVP_RMM_CONSOLE_COUNT;
59232904472SSoby Mathew 
5931d0ca40eSJavier Almansa Sobrino 	manifest->version = RMMD_MANIFEST_VERSION;
594dc0ca64eSJavier Almansa Sobrino 	manifest->padding = 0U; /* RES0 */
5951d0ca40eSJavier Almansa Sobrino 	manifest->plat_data = (uintptr_t)NULL;
59682685904SAlexeiFedorov 	manifest->plat_dram.num_banks = num_banks;
59732904472SSoby Mathew 	manifest->plat_console.num_consoles = num_consoles;
598a97bfa5fSAlexeiFedorov 
59982685904SAlexeiFedorov 	/*
60032904472SSoby Mathew 	 * Boot Manifest structure illustration, with two dram banks and
60132904472SSoby Mathew 	 * a single console.
60282685904SAlexeiFedorov 	 *
60332904472SSoby Mathew 	 * +----------------------------------------+
60482685904SAlexeiFedorov 	 * | offset |     field      |    comment   |
60532904472SSoby Mathew 	 * +--------+----------------+--------------+
60632904472SSoby Mathew 	 * |   0    |    version     |  0x00000003  |
60732904472SSoby Mathew 	 * +--------+----------------+--------------+
60882685904SAlexeiFedorov 	 * |   4    |    padding     |  0x00000000  |
60932904472SSoby Mathew 	 * +--------+----------------+--------------+
61082685904SAlexeiFedorov 	 * |   8    |   plat_data    |     NULL     |
61132904472SSoby Mathew 	 * +--------+----------------+--------------+
61282685904SAlexeiFedorov 	 * |   16   |   num_banks    |              |
61332904472SSoby Mathew 	 * +--------+----------------+              |
61482685904SAlexeiFedorov 	 * |   24   |     banks      |   plat_dram  |
61532904472SSoby Mathew 	 * +--------+----------------+              |
61682685904SAlexeiFedorov 	 * |   32   |    checksum    |              |
61732904472SSoby Mathew 	 * +--------+----------------+--------------+
61832904472SSoby Mathew 	 * |   40   |  num_consoles  |              |
61932904472SSoby Mathew 	 * +--------+----------------+              |
62032904472SSoby Mathew 	 * |   48   |    consoles    | plat_console |
62132904472SSoby Mathew 	 * +--------+----------------+              |
62232904472SSoby Mathew 	 * |   56   |    checksum    |              |
62332904472SSoby Mathew 	 * +--------+----------------+--------------+
62432904472SSoby Mathew 	 * |   64   |     base 0     |              |
62532904472SSoby Mathew 	 * +--------+----------------+    bank[0]   |
62632904472SSoby Mathew 	 * |   72   |     size 0     |              |
62732904472SSoby Mathew 	 * +--------+----------------+--------------+
62832904472SSoby Mathew 	 * |   80   |     base 1     |              |
62932904472SSoby Mathew 	 * +--------+----------------+    bank[1]   |
63032904472SSoby Mathew 	 * |   88   |     size 1     |              |
63132904472SSoby Mathew 	 * +--------+----------------+--------------+
63232904472SSoby Mathew 	 * |   96   |     base       |              |
63332904472SSoby Mathew 	 * +--------+----------------+              |
63432904472SSoby Mathew 	 * |   104  |   map_pages    |              |
63532904472SSoby Mathew 	 * +--------+----------------+              |
63632904472SSoby Mathew 	 * |   112  |     name       |              |
63732904472SSoby Mathew 	 * +--------+----------------+  consoles[0] |
63832904472SSoby Mathew 	 * |   120  |   clk_in_hz    |              |
63932904472SSoby Mathew 	 * +--------+----------------+              |
64032904472SSoby Mathew 	 * |   128  |   baud_rate    |              |
64132904472SSoby Mathew 	 * +--------+----------------+              |
64232904472SSoby Mathew 	 * |   136  |     flags      |              |
64332904472SSoby Mathew 	 * +--------+----------------+--------------+
64482685904SAlexeiFedorov 	 */
64532904472SSoby Mathew 
64682685904SAlexeiFedorov 	bank_ptr = (struct ns_dram_bank *)
64732904472SSoby Mathew 			(((uintptr_t)manifest) + sizeof(*manifest));
64832904472SSoby Mathew 	console_ptr = (struct console_info *)
64932904472SSoby Mathew 			((uintptr_t)bank_ptr + (num_banks * sizeof(*bank_ptr)));
650a97bfa5fSAlexeiFedorov 
65182685904SAlexeiFedorov 	manifest->plat_dram.banks = bank_ptr;
65232904472SSoby Mathew 	manifest->plat_console.consoles = console_ptr;
65332904472SSoby Mathew 
65432904472SSoby Mathew 	/* Ensure the manifest is not larger than the shared buffer */
65532904472SSoby Mathew 	assert((sizeof(struct rmm_manifest) +
65632904472SSoby Mathew 		(sizeof(struct console_info) * manifest->plat_console.num_consoles) +
65732904472SSoby Mathew 		(sizeof(struct ns_dram_bank) * manifest->plat_dram.num_banks)) <= ARM_EL3_RMM_SHARED_SIZE);
658a97bfa5fSAlexeiFedorov 
659a97bfa5fSAlexeiFedorov 	/* Calculate checksum of plat_dram structure */
66082685904SAlexeiFedorov 	checksum = num_banks + (uint64_t)bank_ptr;
661a97bfa5fSAlexeiFedorov 
66282685904SAlexeiFedorov 	/* Store FVP DRAM banks data in Boot Manifest */
66382685904SAlexeiFedorov 	for (unsigned long i = 0UL; i < num_banks; i++) {
66482685904SAlexeiFedorov 		uintptr_t base = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].base);
66582685904SAlexeiFedorov 		uint64_t size = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].size);
66682685904SAlexeiFedorov 
66782685904SAlexeiFedorov 		bank_ptr[i].base = base;
66882685904SAlexeiFedorov 		bank_ptr[i].size = size;
66982685904SAlexeiFedorov 
67082685904SAlexeiFedorov 		/* Update checksum */
67182685904SAlexeiFedorov 		checksum += base + size;
672a97bfa5fSAlexeiFedorov 	}
673a97bfa5fSAlexeiFedorov 
674a97bfa5fSAlexeiFedorov 	/* Checksum must be 0 */
67582685904SAlexeiFedorov 	manifest->plat_dram.checksum = ~checksum + 1UL;
6761d0ca40eSJavier Almansa Sobrino 
67732904472SSoby Mathew 	/* Calculate the checksum of the plat_consoles structure */
67832904472SSoby Mathew 	checksum = num_consoles + (uint64_t)console_ptr;
67932904472SSoby Mathew 
68032904472SSoby Mathew 	/* Zero out the console info struct */
68132904472SSoby Mathew 	memset((void *)console_ptr, '\0', sizeof(struct console_info) * num_consoles);
68232904472SSoby Mathew 
68332904472SSoby Mathew 	console_ptr[0].map_pages = 1;
68432904472SSoby Mathew 	console_ptr[0].base = FVP_RMM_CONSOLE_BASE;
68532904472SSoby Mathew 	console_ptr[0].clk_in_hz = FVP_RMM_CONSOLE_CLK_IN_HZ;
68632904472SSoby Mathew 	console_ptr[0].baud_rate = FVP_RMM_CONSOLE_BAUD;
68732904472SSoby Mathew 
68832904472SSoby Mathew 	strlcpy(console_ptr[0].name, FVP_RMM_CONSOLE_NAME, RMM_CONSOLE_MAX_NAME_LEN-1UL);
68932904472SSoby Mathew 
69032904472SSoby Mathew 	/* Update checksum */
69132904472SSoby Mathew 	checksum += console_ptr[0].base + console_ptr[0].map_pages +
69232904472SSoby Mathew 		console_ptr[0].clk_in_hz + console_ptr[0].baud_rate;
69332904472SSoby Mathew 
69432904472SSoby Mathew 	/* Checksum must be 0 */
69532904472SSoby Mathew 	manifest->plat_console.checksum = ~checksum + 1UL;
69632904472SSoby Mathew 
6971d0ca40eSJavier Almansa Sobrino 	return 0;
6981d0ca40eSJavier Almansa Sobrino }
699a97bfa5fSAlexeiFedorov #endif	/* ENABLE_RME */
700