xref: /rk3399_ARM-atf/plat/arm/board/fvp/fvp_common.c (revision a5566f65fd1be689ca5c63baa1f5b61b40960c8d)
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
84*a5566f65SHarrison Mutai #define MAP_FW_NS_HANDOFF                                             \
85*a5566f65SHarrison Mutai 	MAP_REGION_FLAT(FW_NS_HANDOFF_BASE, PLAT_ARM_FW_HANDOFF_SIZE, \
8694c90ac8SHarrison Mutai 			MT_MEMORY | MT_RW | MT_NS)
8794c90ac8SHarrison Mutai #endif
88*a5566f65SHarrison Mutai #ifdef PLAT_ARM_EL3_FW_HANDOFF_BASE
89*a5566f65SHarrison Mutai #define MAP_EL3_FW_HANDOFF                            \
90*a5566f65SHarrison Mutai 	MAP_REGION_FLAT(PLAT_ARM_EL3_FW_HANDOFF_BASE, \
91*a5566f65SHarrison Mutai 			PLAT_ARM_FW_HANDOFF_SIZE, MT_MEMORY | MT_RW | EL3_PAS)
92*a5566f65SHarrison 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
173*a5566f65SHarrison Mutai #ifdef MAP_EL3_FW_HANDOFF
174*a5566f65SHarrison Mutai 	MAP_EL3_FW_HANDOFF,
175*a5566f65SHarrison 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*a5566f65SHarrison Mutai #ifdef MAP_EL3_FW_HANDOFF
214*a5566f65SHarrison Mutai 	MAP_EL3_FW_HANDOFF,
215*a5566f65SHarrison 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 */
2229a90d720SElyes Haouas 	MAP_REGION_FLAT(DEVICE0_BASE,
2239a90d720SElyes Haouas 			DEVICE0_SIZE,
224c4fa1739SSandrine Bailleux 			MT_DEVICE | MT_RO | MT_SECURE | MT_USER),
225e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_MMAP,
226e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_NS_BUF_MMAP,
227e29efeb1SAntonio Nino Diaz 	ARM_SP_IMAGE_RW_MMAP,
228e29efeb1SAntonio Nino Diaz 	ARM_SPM_BUF_EL0_MMAP,
229e29efeb1SAntonio Nino Diaz 	{0}
230e29efeb1SAntonio Nino Diaz };
231e29efeb1SAntonio Nino Diaz #endif
2323e4b8fdcSSoby Mathew #endif
2333d8256b2SMasahiro Yamada #ifdef IMAGE_BL32
2343e4b8fdcSSoby Mathew const mmap_region_t plat_arm_mmap[] = {
235402b3cf8SJulius Werner #ifndef __aarch64__
236877cf3ffSSoby Mathew 	ARM_MAP_SHARED_RAM,
237950c6956SJoel Hutton 	ARM_V2M_MAP_MEM_PROTECT,
238877cf3ffSSoby Mathew #endif
2393e4b8fdcSSoby Mathew 	V2M_MAP_IOFPGA,
2403e4b8fdcSSoby Mathew 	MAP_DEVICE0,
2413e4b8fdcSSoby Mathew 	MAP_DEVICE1,
2423e4b8fdcSSoby Mathew 	{0}
2433e4b8fdcSSoby Mathew };
2443e4b8fdcSSoby Mathew #endif
2453e4b8fdcSSoby Mathew 
2469d870b79SZelalem Aweke #ifdef IMAGE_RMM
2479d870b79SZelalem Aweke const mmap_region_t plat_arm_mmap[] = {
2489d870b79SZelalem Aweke 	V2M_MAP_IOFPGA,
2499d870b79SZelalem Aweke 	MAP_DEVICE0,
2509d870b79SZelalem Aweke 	MAP_DEVICE1,
2519d870b79SZelalem Aweke 	{0}
2529d870b79SZelalem Aweke };
2539d870b79SZelalem Aweke #endif
2549d870b79SZelalem Aweke 
2553e4b8fdcSSoby Mathew ARM_CASSERT_MMAP
2563e4b8fdcSSoby Mathew 
257955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER != FVP_CCN
258955242d8SJeenu Viswambharan static const int fvp_cci400_map[] = {
259955242d8SJeenu Viswambharan 	PLAT_FVP_CCI400_CLUS0_SL_PORT,
260955242d8SJeenu Viswambharan 	PLAT_FVP_CCI400_CLUS1_SL_PORT,
261955242d8SJeenu Viswambharan };
262955242d8SJeenu Viswambharan 
263955242d8SJeenu Viswambharan static const int fvp_cci5xx_map[] = {
264955242d8SJeenu Viswambharan 	PLAT_FVP_CCI5XX_CLUS0_SL_PORT,
265955242d8SJeenu Viswambharan 	PLAT_FVP_CCI5XX_CLUS1_SL_PORT,
266955242d8SJeenu Viswambharan };
267955242d8SJeenu Viswambharan 
268955242d8SJeenu Viswambharan static unsigned int get_interconnect_master(void)
269955242d8SJeenu Viswambharan {
270955242d8SJeenu Viswambharan 	unsigned int master;
271955242d8SJeenu Viswambharan 	u_register_t mpidr;
272955242d8SJeenu Viswambharan 
273955242d8SJeenu Viswambharan 	mpidr = read_mpidr_el1();
274583e0791SAntonio Nino Diaz 	master = ((arm_config.flags & ARM_CONFIG_FVP_SHIFTED_AFF) != 0U) ?
275955242d8SJeenu Viswambharan 		MPIDR_AFFLVL2_VAL(mpidr) : MPIDR_AFFLVL1_VAL(mpidr);
276955242d8SJeenu Viswambharan 
277955242d8SJeenu Viswambharan 	assert(master < FVP_CLUSTER_COUNT);
278955242d8SJeenu Viswambharan 	return master;
279955242d8SJeenu Viswambharan }
280955242d8SJeenu Viswambharan #endif
2813e4b8fdcSSoby Mathew 
2823f3c341aSPaul Beesley #if defined(IMAGE_BL31) && SPM_MM
283e29efeb1SAntonio Nino Diaz /*
284e29efeb1SAntonio Nino Diaz  * Boot information passed to a secure partition during initialisation. Linear
285e29efeb1SAntonio Nino Diaz  * indices in MP information will be filled at runtime.
286e29efeb1SAntonio Nino Diaz  */
287aeaa225cSPaul Beesley static spm_mm_mp_info_t sp_mp_info[] = {
288e29efeb1SAntonio Nino Diaz 	[0] = {0x80000000, 0},
289e29efeb1SAntonio Nino Diaz 	[1] = {0x80000001, 0},
290e29efeb1SAntonio Nino Diaz 	[2] = {0x80000002, 0},
291e29efeb1SAntonio Nino Diaz 	[3] = {0x80000003, 0},
292e29efeb1SAntonio Nino Diaz 	[4] = {0x80000100, 0},
293e29efeb1SAntonio Nino Diaz 	[5] = {0x80000101, 0},
294e29efeb1SAntonio Nino Diaz 	[6] = {0x80000102, 0},
295e29efeb1SAntonio Nino Diaz 	[7] = {0x80000103, 0},
296e29efeb1SAntonio Nino Diaz };
297e29efeb1SAntonio Nino Diaz 
298aeaa225cSPaul Beesley const spm_mm_boot_info_t plat_arm_secure_partition_boot_info = {
299e29efeb1SAntonio Nino Diaz 	.h.type              = PARAM_SP_IMAGE_BOOT_INFO,
300e29efeb1SAntonio Nino Diaz 	.h.version           = VERSION_1,
301aeaa225cSPaul Beesley 	.h.size              = sizeof(spm_mm_boot_info_t),
302e29efeb1SAntonio Nino Diaz 	.h.attr              = 0,
303e29efeb1SAntonio Nino Diaz 	.sp_mem_base         = ARM_SP_IMAGE_BASE,
304e29efeb1SAntonio Nino Diaz 	.sp_mem_limit        = ARM_SP_IMAGE_LIMIT,
305e29efeb1SAntonio Nino Diaz 	.sp_image_base       = ARM_SP_IMAGE_BASE,
306e29efeb1SAntonio Nino Diaz 	.sp_stack_base       = PLAT_SP_IMAGE_STACK_BASE,
307e29efeb1SAntonio Nino Diaz 	.sp_heap_base        = ARM_SP_IMAGE_HEAP_BASE,
3080560efb9SArd Biesheuvel 	.sp_ns_comm_buf_base = PLAT_SP_IMAGE_NS_BUF_BASE,
309e29efeb1SAntonio Nino Diaz 	.sp_shared_buf_base  = PLAT_SPM_BUF_BASE,
310e29efeb1SAntonio Nino Diaz 	.sp_image_size       = ARM_SP_IMAGE_SIZE,
311e29efeb1SAntonio Nino Diaz 	.sp_pcpu_stack_size  = PLAT_SP_IMAGE_STACK_PCPU_SIZE,
312e29efeb1SAntonio Nino Diaz 	.sp_heap_size        = ARM_SP_IMAGE_HEAP_SIZE,
3130560efb9SArd Biesheuvel 	.sp_ns_comm_buf_size = PLAT_SP_IMAGE_NS_BUF_SIZE,
314e29efeb1SAntonio Nino Diaz 	.sp_shared_buf_size  = PLAT_SPM_BUF_SIZE,
315e29efeb1SAntonio Nino Diaz 	.num_sp_mem_regions  = ARM_SP_IMAGE_NUM_MEM_REGIONS,
316e29efeb1SAntonio Nino Diaz 	.num_cpus            = PLATFORM_CORE_COUNT,
317e29efeb1SAntonio Nino Diaz 	.mp_info             = &sp_mp_info[0],
318e29efeb1SAntonio Nino Diaz };
319e29efeb1SAntonio Nino Diaz 
320e29efeb1SAntonio Nino Diaz const struct mmap_region *plat_get_secure_partition_mmap(void *cookie)
321e29efeb1SAntonio Nino Diaz {
322e29efeb1SAntonio Nino Diaz 	return plat_arm_secure_partition_mmap;
323e29efeb1SAntonio Nino Diaz }
324e29efeb1SAntonio Nino Diaz 
325aeaa225cSPaul Beesley const struct spm_mm_boot_info *plat_get_secure_partition_boot_info(
326e29efeb1SAntonio Nino Diaz 		void *cookie)
327e29efeb1SAntonio Nino Diaz {
328e29efeb1SAntonio Nino Diaz 	return &plat_arm_secure_partition_boot_info;
329e29efeb1SAntonio Nino Diaz }
330e29efeb1SAntonio Nino Diaz #endif
331e29efeb1SAntonio Nino Diaz 
3323e4b8fdcSSoby Mathew /*******************************************************************************
3333e4b8fdcSSoby Mathew  * A single boot loader stack is expected to work on both the Foundation FVP
3343e4b8fdcSSoby Mathew  * models and the two flavours of the Base FVP models (AEMv8 & Cortex). The
3353e4b8fdcSSoby Mathew  * SYS_ID register provides a mechanism for detecting the differences between
3363e4b8fdcSSoby Mathew  * these platforms. This information is stored in a per-BL array to allow the
3373e4b8fdcSSoby Mathew  * code to take the correct path.Per BL platform configuration.
3383e4b8fdcSSoby Mathew  ******************************************************************************/
3394d010d0dSDaniel Boulby void __init fvp_config_setup(void)
3403e4b8fdcSSoby Mathew {
3413e4b8fdcSSoby Mathew 	unsigned int rev, hbi, bld, arch, sys_id;
3423e4b8fdcSSoby Mathew 
3433e4b8fdcSSoby Mathew 	sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
3443e4b8fdcSSoby Mathew 	rev = (sys_id >> V2M_SYS_ID_REV_SHIFT) & V2M_SYS_ID_REV_MASK;
3453e4b8fdcSSoby Mathew 	hbi = (sys_id >> V2M_SYS_ID_HBI_SHIFT) & V2M_SYS_ID_HBI_MASK;
3463e4b8fdcSSoby Mathew 	bld = (sys_id >> V2M_SYS_ID_BLD_SHIFT) & V2M_SYS_ID_BLD_MASK;
3473e4b8fdcSSoby Mathew 	arch = (sys_id >> V2M_SYS_ID_ARCH_SHIFT) & V2M_SYS_ID_ARCH_MASK;
3483e4b8fdcSSoby Mathew 
3493e4b8fdcSSoby Mathew 	if (arch != ARCH_MODEL) {
3503e4b8fdcSSoby Mathew 		ERROR("This firmware is for FVP models\n");
3513e4b8fdcSSoby Mathew 		panic();
3523e4b8fdcSSoby Mathew 	}
3533e4b8fdcSSoby Mathew 
3543e4b8fdcSSoby Mathew 	/*
3553e4b8fdcSSoby Mathew 	 * The build field in the SYS_ID tells which variant of the GIC
3563e4b8fdcSSoby Mathew 	 * memory is implemented by the model.
3573e4b8fdcSSoby Mathew 	 */
3583e4b8fdcSSoby Mathew 	switch (bld) {
3593e4b8fdcSSoby Mathew 	case BLD_GIC_VE_MMAP:
36021a3973dSSoby Mathew 		ERROR("Legacy Versatile Express memory map for GIC peripheral"
36121a3973dSSoby Mathew 				" is not supported\n");
3623e4b8fdcSSoby Mathew 		panic();
3633e4b8fdcSSoby Mathew 		break;
3643e4b8fdcSSoby Mathew 	case BLD_GIC_A53A57_MMAP:
3653e4b8fdcSSoby Mathew 		break;
3663e4b8fdcSSoby Mathew 	default:
3673e4b8fdcSSoby Mathew 		ERROR("Unsupported board build %x\n", bld);
3683e4b8fdcSSoby Mathew 		panic();
3693e4b8fdcSSoby Mathew 	}
3703e4b8fdcSSoby Mathew 
3713e4b8fdcSSoby Mathew 	/*
3723e4b8fdcSSoby Mathew 	 * The hbi field in the SYS_ID is 0x020 for the Base FVP & 0x010
3733e4b8fdcSSoby Mathew 	 * for the Foundation FVP.
3743e4b8fdcSSoby Mathew 	 */
3753e4b8fdcSSoby Mathew 	switch (hbi) {
3763e4b8fdcSSoby Mathew 	case HBI_FOUNDATION_FVP:
3773e4b8fdcSSoby Mathew 		arm_config.flags = 0;
3783e4b8fdcSSoby Mathew 
3793e4b8fdcSSoby Mathew 		/*
3803e4b8fdcSSoby Mathew 		 * Check for supported revisions of Foundation FVP
3813e4b8fdcSSoby Mathew 		 * Allow future revisions to run but emit warning diagnostic
3823e4b8fdcSSoby Mathew 		 */
3833e4b8fdcSSoby Mathew 		switch (rev) {
3843e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_V2_0:
3853e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_V2_1:
3863e4b8fdcSSoby Mathew 		case REV_FOUNDATION_FVP_v9_1:
3874faa4a1dSSandrine Bailleux 		case REV_FOUNDATION_FVP_v9_6:
3883e4b8fdcSSoby Mathew 			break;
3893e4b8fdcSSoby Mathew 		default:
3903e4b8fdcSSoby Mathew 			WARN("Unrecognized Foundation FVP revision %x\n", rev);
3913e4b8fdcSSoby Mathew 			break;
3923e4b8fdcSSoby Mathew 		}
3933e4b8fdcSSoby Mathew 		break;
3943e4b8fdcSSoby Mathew 	case HBI_BASE_FVP:
395955242d8SJeenu Viswambharan 		arm_config.flags |= (ARM_CONFIG_BASE_MMAP | ARM_CONFIG_HAS_TZC);
3963e4b8fdcSSoby Mathew 
3973e4b8fdcSSoby Mathew 		/*
3983e4b8fdcSSoby Mathew 		 * Check for supported revisions
3993e4b8fdcSSoby Mathew 		 * Allow future revisions to run but emit warning diagnostic
4003e4b8fdcSSoby Mathew 		 */
4013e4b8fdcSSoby Mathew 		switch (rev) {
4023e4b8fdcSSoby Mathew 		case REV_BASE_FVP_V0:
403955242d8SJeenu Viswambharan 			arm_config.flags |= ARM_CONFIG_FVP_HAS_CCI400;
404955242d8SJeenu Viswambharan 			break;
405955242d8SJeenu Viswambharan 		case REV_BASE_FVP_REVC:
4068431635bSIsla Mitchell 			arm_config.flags |= (ARM_CONFIG_FVP_HAS_SMMUV3 |
407955242d8SJeenu Viswambharan 					ARM_CONFIG_FVP_HAS_CCI5XX);
4083e4b8fdcSSoby Mathew 			break;
4093e4b8fdcSSoby Mathew 		default:
4103e4b8fdcSSoby Mathew 			WARN("Unrecognized Base FVP revision %x\n", rev);
4113e4b8fdcSSoby Mathew 			break;
4123e4b8fdcSSoby Mathew 		}
4133e4b8fdcSSoby Mathew 		break;
4143e4b8fdcSSoby Mathew 	default:
4153e4b8fdcSSoby Mathew 		ERROR("Unsupported board HBI number 0x%x\n", hbi);
4163e4b8fdcSSoby Mathew 		panic();
4173e4b8fdcSSoby Mathew 	}
4188431635bSIsla Mitchell 
4198431635bSIsla Mitchell 	/*
4208431635bSIsla Mitchell 	 * We assume that the presence of MT bit, and therefore shifted
4218431635bSIsla Mitchell 	 * affinities, is uniform across the platform: either all CPUs, or no
4228431635bSIsla Mitchell 	 * CPUs implement it.
4238431635bSIsla Mitchell 	 */
424583e0791SAntonio Nino Diaz 	if ((read_mpidr_el1() & MPIDR_MT_MASK) != 0U)
4258431635bSIsla Mitchell 		arm_config.flags |= ARM_CONFIG_FVP_SHIFTED_AFF;
4263e4b8fdcSSoby Mathew }
4273e4b8fdcSSoby Mathew 
4283e4b8fdcSSoby Mathew 
4294d010d0dSDaniel Boulby void __init fvp_interconnect_init(void)
4303e4b8fdcSSoby Mathew {
43171237876SSoby Mathew #if FVP_INTERCONNECT_DRIVER == FVP_CCN
43271237876SSoby Mathew 	if (ccn_get_part0_id(PLAT_ARM_CCN_BASE) != CCN_502_PART0_ID) {
433583e0791SAntonio Nino Diaz 		ERROR("Unrecognized CCN variant detected. Only CCN-502 is supported");
43471237876SSoby Mathew 		panic();
43571237876SSoby Mathew 	}
436955242d8SJeenu Viswambharan 
4373e4b8fdcSSoby Mathew 	plat_arm_interconnect_init();
438955242d8SJeenu Viswambharan #else
439583e0791SAntonio Nino Diaz 	uintptr_t cci_base = 0U;
440583e0791SAntonio Nino Diaz 	const int *cci_map = NULL;
441583e0791SAntonio Nino Diaz 	unsigned int map_size = 0U;
442955242d8SJeenu Viswambharan 
443955242d8SJeenu Viswambharan 	/* Initialize the right interconnect */
444583e0791SAntonio Nino Diaz 	if ((arm_config.flags & ARM_CONFIG_FVP_HAS_CCI5XX) != 0U) {
445955242d8SJeenu Viswambharan 		cci_base = PLAT_FVP_CCI5XX_BASE;
446955242d8SJeenu Viswambharan 		cci_map = fvp_cci5xx_map;
447955242d8SJeenu Viswambharan 		map_size = ARRAY_SIZE(fvp_cci5xx_map);
448583e0791SAntonio Nino Diaz 	} else if ((arm_config.flags & ARM_CONFIG_FVP_HAS_CCI400) != 0U) {
449955242d8SJeenu Viswambharan 		cci_base = PLAT_FVP_CCI400_BASE;
450955242d8SJeenu Viswambharan 		cci_map = fvp_cci400_map;
451955242d8SJeenu Viswambharan 		map_size = ARRAY_SIZE(fvp_cci400_map);
452583e0791SAntonio Nino Diaz 	} else {
453583e0791SAntonio Nino Diaz 		return;
454955242d8SJeenu Viswambharan 	}
455955242d8SJeenu Viswambharan 
456583e0791SAntonio Nino Diaz 	assert(cci_base != 0U);
457583e0791SAntonio Nino Diaz 	assert(cci_map != NULL);
458955242d8SJeenu Viswambharan 	cci_init(cci_base, cci_map, map_size);
459955242d8SJeenu Viswambharan #endif
46071237876SSoby Mathew }
4613e4b8fdcSSoby Mathew 
4623e4b8fdcSSoby Mathew void fvp_interconnect_enable(void)
4633e4b8fdcSSoby Mathew {
464955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER == FVP_CCN
4653e4b8fdcSSoby Mathew 	plat_arm_interconnect_enter_coherency();
466955242d8SJeenu Viswambharan #else
467955242d8SJeenu Viswambharan 	unsigned int master;
468955242d8SJeenu Viswambharan 
469583e0791SAntonio Nino Diaz 	if ((arm_config.flags & (ARM_CONFIG_FVP_HAS_CCI400 |
470583e0791SAntonio Nino Diaz 				 ARM_CONFIG_FVP_HAS_CCI5XX)) != 0U) {
471955242d8SJeenu Viswambharan 		master = get_interconnect_master();
472955242d8SJeenu Viswambharan 		cci_enable_snoop_dvm_reqs(master);
473955242d8SJeenu Viswambharan 	}
474955242d8SJeenu Viswambharan #endif
4753e4b8fdcSSoby Mathew }
4763e4b8fdcSSoby Mathew 
4773e4b8fdcSSoby Mathew void fvp_interconnect_disable(void)
4783e4b8fdcSSoby Mathew {
479955242d8SJeenu Viswambharan #if FVP_INTERCONNECT_DRIVER == FVP_CCN
4803e4b8fdcSSoby Mathew 	plat_arm_interconnect_exit_coherency();
481955242d8SJeenu Viswambharan #else
482955242d8SJeenu Viswambharan 	unsigned int master;
483955242d8SJeenu Viswambharan 
484583e0791SAntonio Nino Diaz 	if ((arm_config.flags & (ARM_CONFIG_FVP_HAS_CCI400 |
485583e0791SAntonio Nino Diaz 				 ARM_CONFIG_FVP_HAS_CCI5XX)) != 0U) {
486955242d8SJeenu Viswambharan 		master = get_interconnect_master();
487955242d8SJeenu Viswambharan 		cci_disable_snoop_dvm_reqs(master);
488955242d8SJeenu Viswambharan 	}
489955242d8SJeenu Viswambharan #endif
4903e4b8fdcSSoby Mathew }
491ba597da7SJohn Tsichritzis 
49288c51c3fSManish V Badarkhe #if CRYPTO_SUPPORT
493ba597da7SJohn Tsichritzis int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
494ba597da7SJohn Tsichritzis {
495ba597da7SJohn Tsichritzis 	assert(heap_addr != NULL);
496ba597da7SJohn Tsichritzis 	assert(heap_size != NULL);
497ba597da7SJohn Tsichritzis 
498ba597da7SJohn Tsichritzis 	return arm_get_mbedtls_heap(heap_addr, heap_size);
499ba597da7SJohn Tsichritzis }
50088c51c3fSManish V Badarkhe #endif /* CRYPTO_SUPPORT */
5011b597c22SAlexei Fedorov 
5021b597c22SAlexei Fedorov void fvp_timer_init(void)
5031b597c22SAlexei Fedorov {
504fddfb3baSMadhukar Pappireddy #if USE_SP804_TIMER
5051b597c22SAlexei Fedorov 	/* Enable the clock override for SP804 timer 0, which means that no
5061b597c22SAlexei Fedorov 	 * clock dividers are applied and the raw (35MHz) clock will be used.
5071b597c22SAlexei Fedorov 	 */
5081b597c22SAlexei Fedorov 	mmio_write_32(V2M_SP810_BASE, FVP_SP810_CTRL_TIM0_OV);
5091b597c22SAlexei Fedorov 
5101b597c22SAlexei Fedorov 	/* Initialize delay timer driver using SP804 dual timer 0 */
5111b597c22SAlexei Fedorov 	sp804_timer_init(V2M_SP804_TIMER0_BASE,
5121b597c22SAlexei Fedorov 			SP804_TIMER_CLKMULT, SP804_TIMER_CLKDIV);
5131b597c22SAlexei Fedorov #else
5141b597c22SAlexei Fedorov 	generic_delay_timer_init();
5151b597c22SAlexei Fedorov 
5161b597c22SAlexei Fedorov 	/* Enable System level generic timer */
5171b597c22SAlexei Fedorov 	mmio_write_32(ARM_SYS_CNTCTL_BASE + CNTCR_OFF,
5181b597c22SAlexei Fedorov 			CNTCR_FCREQ(0U) | CNTCR_EN);
519fddfb3baSMadhukar Pappireddy #endif /* USE_SP804_TIMER */
5201b597c22SAlexei Fedorov }
521ed9653ffSManish V Badarkhe 
522ed9653ffSManish V Badarkhe /*****************************************************************************
523ed9653ffSManish V Badarkhe  * plat_is_smccc_feature_available() - This function checks whether SMCCC
524ed9653ffSManish V Badarkhe  *                                     feature is availabile for platform.
525ed9653ffSManish V Badarkhe  * @fid: SMCCC function id
526ed9653ffSManish V Badarkhe  *
527ed9653ffSManish V Badarkhe  * Return SMC_ARCH_CALL_SUCCESS if SMCCC feature is available and
528ed9653ffSManish V Badarkhe  * SMC_ARCH_CALL_NOT_SUPPORTED otherwise.
529ed9653ffSManish V Badarkhe  *****************************************************************************/
530ed9653ffSManish V Badarkhe int32_t plat_is_smccc_feature_available(u_register_t fid)
531ed9653ffSManish V Badarkhe {
532ed9653ffSManish V Badarkhe 	switch (fid) {
533ed9653ffSManish V Badarkhe 	case SMCCC_ARCH_SOC_ID:
534ed9653ffSManish V Badarkhe 		return SMC_ARCH_CALL_SUCCESS;
535ed9653ffSManish V Badarkhe 	default:
536ed9653ffSManish V Badarkhe 		return SMC_ARCH_CALL_NOT_SUPPORTED;
537ed9653ffSManish V Badarkhe 	}
538ed9653ffSManish V Badarkhe }
539ed9653ffSManish V Badarkhe 
540ed9653ffSManish V Badarkhe /* Get SOC version */
541ed9653ffSManish V Badarkhe int32_t plat_get_soc_version(void)
542ed9653ffSManish V Badarkhe {
543ed9653ffSManish V Badarkhe 	return (int32_t)
544dfff4686SYann Gautier 		(SOC_ID_SET_JEP_106(ARM_SOC_CONTINUATION_CODE,
545dfff4686SYann Gautier 				    ARM_SOC_IDENTIFICATION_CODE) |
546dfff4686SYann Gautier 		 (FVP_SOC_ID & SOC_ID_IMPL_DEF_MASK));
547ed9653ffSManish V Badarkhe }
548ed9653ffSManish V Badarkhe 
549ed9653ffSManish V Badarkhe /* Get SOC revision */
550ed9653ffSManish V Badarkhe int32_t plat_get_soc_revision(void)
551ed9653ffSManish V Badarkhe {
552ed9653ffSManish V Badarkhe 	unsigned int sys_id;
553ed9653ffSManish V Badarkhe 
554ed9653ffSManish V Badarkhe 	sys_id = mmio_read_32(V2M_SYSREGS_BASE + V2M_SYS_ID);
555dfff4686SYann Gautier 	return (int32_t)(((sys_id >> V2M_SYS_ID_REV_SHIFT) &
556dfff4686SYann Gautier 			  V2M_SYS_ID_REV_MASK) & SOC_ID_REV_MASK);
557ed9653ffSManish V Badarkhe }
5588c980a4aSJavier Almansa Sobrino 
5598c980a4aSJavier Almansa Sobrino #if ENABLE_RME
5608c980a4aSJavier Almansa Sobrino /*
5618c980a4aSJavier Almansa Sobrino  * Get a pointer to the RMM-EL3 Shared buffer and return it
5628c980a4aSJavier Almansa Sobrino  * through the pointer passed as parameter.
5638c980a4aSJavier Almansa Sobrino  *
5648c980a4aSJavier Almansa Sobrino  * This function returns the size of the shared buffer.
5658c980a4aSJavier Almansa Sobrino  */
5668c980a4aSJavier Almansa Sobrino size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared)
5678c980a4aSJavier Almansa Sobrino {
5688c980a4aSJavier Almansa Sobrino 	*shared = (uintptr_t)RMM_SHARED_BASE;
5698c980a4aSJavier Almansa Sobrino 
5708c980a4aSJavier Almansa Sobrino 	return (size_t)RMM_SHARED_SIZE;
5718c980a4aSJavier Almansa Sobrino }
5721d0ca40eSJavier Almansa Sobrino 
573a97bfa5fSAlexeiFedorov int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
5741d0ca40eSJavier Almansa Sobrino {
57532904472SSoby Mathew 	uint64_t checksum, num_banks, num_consoles;
57682685904SAlexeiFedorov 	struct ns_dram_bank *bank_ptr;
57732904472SSoby Mathew 	struct console_info *console_ptr;
578a97bfa5fSAlexeiFedorov 
5791d0ca40eSJavier Almansa Sobrino 	assert(manifest != NULL);
5801d0ca40eSJavier Almansa Sobrino 
58182685904SAlexeiFedorov 	/* Get number of DRAM banks */
58282685904SAlexeiFedorov 	num_banks = FCONF_GET_PROPERTY(hw_config, dram_layout, num_banks);
58382685904SAlexeiFedorov 	assert(num_banks <= ARM_DRAM_NUM_BANKS);
58482685904SAlexeiFedorov 
58532904472SSoby Mathew 	/* Set number of consoles */
58632904472SSoby Mathew 	num_consoles = FVP_RMM_CONSOLE_COUNT;
58732904472SSoby Mathew 
5881d0ca40eSJavier Almansa Sobrino 	manifest->version = RMMD_MANIFEST_VERSION;
589dc0ca64eSJavier Almansa Sobrino 	manifest->padding = 0U; /* RES0 */
5901d0ca40eSJavier Almansa Sobrino 	manifest->plat_data = (uintptr_t)NULL;
59182685904SAlexeiFedorov 	manifest->plat_dram.num_banks = num_banks;
59232904472SSoby Mathew 	manifest->plat_console.num_consoles = num_consoles;
593a97bfa5fSAlexeiFedorov 
59482685904SAlexeiFedorov 	/*
59532904472SSoby Mathew 	 * Boot Manifest structure illustration, with two dram banks and
59632904472SSoby Mathew 	 * a single console.
59782685904SAlexeiFedorov 	 *
59832904472SSoby Mathew 	 * +----------------------------------------+
59982685904SAlexeiFedorov 	 * | offset |     field      |    comment   |
60032904472SSoby Mathew 	 * +--------+----------------+--------------+
60132904472SSoby Mathew 	 * |   0    |    version     |  0x00000003  |
60232904472SSoby Mathew 	 * +--------+----------------+--------------+
60382685904SAlexeiFedorov 	 * |   4    |    padding     |  0x00000000  |
60432904472SSoby Mathew 	 * +--------+----------------+--------------+
60582685904SAlexeiFedorov 	 * |   8    |   plat_data    |     NULL     |
60632904472SSoby Mathew 	 * +--------+----------------+--------------+
60782685904SAlexeiFedorov 	 * |   16   |   num_banks    |              |
60832904472SSoby Mathew 	 * +--------+----------------+              |
60982685904SAlexeiFedorov 	 * |   24   |     banks      |   plat_dram  |
61032904472SSoby Mathew 	 * +--------+----------------+              |
61182685904SAlexeiFedorov 	 * |   32   |    checksum    |              |
61232904472SSoby Mathew 	 * +--------+----------------+--------------+
61332904472SSoby Mathew 	 * |   40   |  num_consoles  |              |
61432904472SSoby Mathew 	 * +--------+----------------+              |
61532904472SSoby Mathew 	 * |   48   |    consoles    | plat_console |
61632904472SSoby Mathew 	 * +--------+----------------+              |
61732904472SSoby Mathew 	 * |   56   |    checksum    |              |
61832904472SSoby Mathew 	 * +--------+----------------+--------------+
61932904472SSoby Mathew 	 * |   64   |     base 0     |              |
62032904472SSoby Mathew 	 * +--------+----------------+    bank[0]   |
62132904472SSoby Mathew 	 * |   72   |     size 0     |              |
62232904472SSoby Mathew 	 * +--------+----------------+--------------+
62332904472SSoby Mathew 	 * |   80   |     base 1     |              |
62432904472SSoby Mathew 	 * +--------+----------------+    bank[1]   |
62532904472SSoby Mathew 	 * |   88   |     size 1     |              |
62632904472SSoby Mathew 	 * +--------+----------------+--------------+
62732904472SSoby Mathew 	 * |   96   |     base       |              |
62832904472SSoby Mathew 	 * +--------+----------------+              |
62932904472SSoby Mathew 	 * |   104  |   map_pages    |              |
63032904472SSoby Mathew 	 * +--------+----------------+              |
63132904472SSoby Mathew 	 * |   112  |     name       |              |
63232904472SSoby Mathew 	 * +--------+----------------+  consoles[0] |
63332904472SSoby Mathew 	 * |   120  |   clk_in_hz    |              |
63432904472SSoby Mathew 	 * +--------+----------------+              |
63532904472SSoby Mathew 	 * |   128  |   baud_rate    |              |
63632904472SSoby Mathew 	 * +--------+----------------+              |
63732904472SSoby Mathew 	 * |   136  |     flags      |              |
63832904472SSoby Mathew 	 * +--------+----------------+--------------+
63982685904SAlexeiFedorov 	 */
64032904472SSoby Mathew 
64182685904SAlexeiFedorov 	bank_ptr = (struct ns_dram_bank *)
64232904472SSoby Mathew 			(((uintptr_t)manifest) + sizeof(*manifest));
64332904472SSoby Mathew 	console_ptr = (struct console_info *)
64432904472SSoby Mathew 			((uintptr_t)bank_ptr + (num_banks * sizeof(*bank_ptr)));
645a97bfa5fSAlexeiFedorov 
64682685904SAlexeiFedorov 	manifest->plat_dram.banks = bank_ptr;
64732904472SSoby Mathew 	manifest->plat_console.consoles = console_ptr;
64832904472SSoby Mathew 
64932904472SSoby Mathew 	/* Ensure the manifest is not larger than the shared buffer */
65032904472SSoby Mathew 	assert((sizeof(struct rmm_manifest) +
65132904472SSoby Mathew 		(sizeof(struct console_info) * manifest->plat_console.num_consoles) +
65232904472SSoby Mathew 		(sizeof(struct ns_dram_bank) * manifest->plat_dram.num_banks)) <= ARM_EL3_RMM_SHARED_SIZE);
653a97bfa5fSAlexeiFedorov 
654a97bfa5fSAlexeiFedorov 	/* Calculate checksum of plat_dram structure */
65582685904SAlexeiFedorov 	checksum = num_banks + (uint64_t)bank_ptr;
656a97bfa5fSAlexeiFedorov 
65782685904SAlexeiFedorov 	/* Store FVP DRAM banks data in Boot Manifest */
65882685904SAlexeiFedorov 	for (unsigned long i = 0UL; i < num_banks; i++) {
65982685904SAlexeiFedorov 		uintptr_t base = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].base);
66082685904SAlexeiFedorov 		uint64_t size = FCONF_GET_PROPERTY(hw_config, dram_layout, dram_bank[i].size);
66182685904SAlexeiFedorov 
66282685904SAlexeiFedorov 		bank_ptr[i].base = base;
66382685904SAlexeiFedorov 		bank_ptr[i].size = size;
66482685904SAlexeiFedorov 
66582685904SAlexeiFedorov 		/* Update checksum */
66682685904SAlexeiFedorov 		checksum += base + size;
667a97bfa5fSAlexeiFedorov 	}
668a97bfa5fSAlexeiFedorov 
669a97bfa5fSAlexeiFedorov 	/* Checksum must be 0 */
67082685904SAlexeiFedorov 	manifest->plat_dram.checksum = ~checksum + 1UL;
6711d0ca40eSJavier Almansa Sobrino 
67232904472SSoby Mathew 	/* Calculate the checksum of the plat_consoles structure */
67332904472SSoby Mathew 	checksum = num_consoles + (uint64_t)console_ptr;
67432904472SSoby Mathew 
67532904472SSoby Mathew 	/* Zero out the console info struct */
67632904472SSoby Mathew 	memset((void *)console_ptr, '\0', sizeof(struct console_info) * num_consoles);
67732904472SSoby Mathew 
67832904472SSoby Mathew 	console_ptr[0].map_pages = 1;
67932904472SSoby Mathew 	console_ptr[0].base = FVP_RMM_CONSOLE_BASE;
68032904472SSoby Mathew 	console_ptr[0].clk_in_hz = FVP_RMM_CONSOLE_CLK_IN_HZ;
68132904472SSoby Mathew 	console_ptr[0].baud_rate = FVP_RMM_CONSOLE_BAUD;
68232904472SSoby Mathew 
68332904472SSoby Mathew 	strlcpy(console_ptr[0].name, FVP_RMM_CONSOLE_NAME, RMM_CONSOLE_MAX_NAME_LEN-1UL);
68432904472SSoby Mathew 
68532904472SSoby Mathew 	/* Update checksum */
68632904472SSoby Mathew 	checksum += console_ptr[0].base + console_ptr[0].map_pages +
68732904472SSoby Mathew 		console_ptr[0].clk_in_hz + console_ptr[0].baud_rate;
68832904472SSoby Mathew 
68932904472SSoby Mathew 	/* Checksum must be 0 */
69032904472SSoby Mathew 	manifest->plat_console.checksum = ~checksum + 1UL;
69132904472SSoby Mathew 
6921d0ca40eSJavier Almansa Sobrino 	return 0;
6931d0ca40eSJavier Almansa Sobrino }
694a97bfa5fSAlexeiFedorov #endif	/* ENABLE_RME */
695