xref: /rk3399_ARM-atf/plat/hisilicon/poplar/bl2_plat_setup.c (revision 0d8052a4eacc73aa808bf4b242f9f64b62875b9d)
1e35d0edbSJorge Ramirez-Ortiz /*
2e35d0edbSJorge Ramirez-Ortiz  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3e35d0edbSJorge Ramirez-Ortiz  *
4e35d0edbSJorge Ramirez-Ortiz  * SPDX-License-Identifier: BSD-3-Clause
5e35d0edbSJorge Ramirez-Ortiz  */
6e35d0edbSJorge Ramirez-Ortiz 
7e35d0edbSJorge Ramirez-Ortiz #include <arch_helpers.h>
8e35d0edbSJorge Ramirez-Ortiz #include <assert.h>
9e35d0edbSJorge Ramirez-Ortiz #include <bl_common.h>
10e35d0edbSJorge Ramirez-Ortiz #include <console.h>
11e35d0edbSJorge Ramirez-Ortiz #include <debug.h>
12*0d8052a4SVictor Chong #include <desc_image_load.h>
1359149bbeSVictor Chong #include <dw_mmc.h>
1459149bbeSVictor Chong #include <emmc.h>
15e35d0edbSJorge Ramirez-Ortiz #include <errno.h>
16e35d0edbSJorge Ramirez-Ortiz #include <generic_delay_timer.h>
17e35d0edbSJorge Ramirez-Ortiz #include <mmio.h>
18e35d0edbSJorge Ramirez-Ortiz #include <partition/partition.h>
19e35d0edbSJorge Ramirez-Ortiz #include <platform.h>
20e35d0edbSJorge Ramirez-Ortiz #include <string.h>
21e35d0edbSJorge Ramirez-Ortiz #include "hi3798cv200.h"
22e35d0edbSJorge Ramirez-Ortiz #include "plat_private.h"
23e35d0edbSJorge Ramirez-Ortiz 
24e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for code and read only data sections */
25e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_BASE	(unsigned long)(&__RO_START__)
26e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_LIMIT	(unsigned long)(&__RO_END__)
27e35d0edbSJorge Ramirez-Ortiz 
28e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for coherent memory section */
29e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_BASE	(unsigned long)(&__COHERENT_RAM_START__)
30e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_LIMIT	(unsigned long)(&__COHERENT_RAM_END__)
31e35d0edbSJorge Ramirez-Ortiz 
32*0d8052a4SVictor Chong static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
33*0d8052a4SVictor Chong 
34*0d8052a4SVictor Chong #if !LOAD_IMAGE_V2
35*0d8052a4SVictor Chong 
36*0d8052a4SVictor Chong /*******************************************************************************
37*0d8052a4SVictor Chong  * This structure represents the superset of information that is passed to
38*0d8052a4SVictor Chong  * BL31, e.g. while passing control to it from BL2, bl31_params
39*0d8052a4SVictor Chong  * and other platform specific params
40*0d8052a4SVictor Chong  ******************************************************************************/
41e35d0edbSJorge Ramirez-Ortiz typedef struct bl2_to_bl31_params_mem {
42e35d0edbSJorge Ramirez-Ortiz 	bl31_params_t		bl31_params;
43e35d0edbSJorge Ramirez-Ortiz 	image_info_t		bl31_image_info;
44f336774bSVictor Chong 	image_info_t		bl32_image_info;
45e35d0edbSJorge Ramirez-Ortiz 	image_info_t		bl33_image_info;
46e35d0edbSJorge Ramirez-Ortiz 	entry_point_info_t	bl33_ep_info;
47f336774bSVictor Chong 	entry_point_info_t	bl32_ep_info;
48e35d0edbSJorge Ramirez-Ortiz 	entry_point_info_t	bl31_ep_info;
49e35d0edbSJorge Ramirez-Ortiz } bl2_to_bl31_params_mem_t;
50e35d0edbSJorge Ramirez-Ortiz 
51e35d0edbSJorge Ramirez-Ortiz static bl2_to_bl31_params_mem_t bl31_params_mem;
52e35d0edbSJorge Ramirez-Ortiz 
53e35d0edbSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void)
54e35d0edbSJorge Ramirez-Ortiz {
55e35d0edbSJorge Ramirez-Ortiz 	return &bl2_tzram_layout;
56e35d0edbSJorge Ramirez-Ortiz }
57e35d0edbSJorge Ramirez-Ortiz 
58*0d8052a4SVictor Chong #ifdef SCP_BL2_BASE
59*0d8052a4SVictor Chong void bl2_plat_get_scp_bl2_meminfo(meminfo_t *scp_bl2_meminfo)
60*0d8052a4SVictor Chong {
61*0d8052a4SVictor Chong 	/*
62*0d8052a4SVictor Chong 	 * This platform has no SCP_BL2 yet
63*0d8052a4SVictor Chong 	 */
64*0d8052a4SVictor Chong }
65*0d8052a4SVictor Chong #endif
66*0d8052a4SVictor Chong #endif /* LOAD_IMAGE_V2 */
67*0d8052a4SVictor Chong 
68*0d8052a4SVictor Chong /*******************************************************************************
69*0d8052a4SVictor Chong  * Transfer SCP_BL2 from Trusted RAM using the SCP Download protocol.
70*0d8052a4SVictor Chong  * Return 0 on success, -1 otherwise.
71*0d8052a4SVictor Chong  ******************************************************************************/
72*0d8052a4SVictor Chong #if LOAD_IMAGE_V2
73*0d8052a4SVictor Chong int plat_poplar_bl2_handle_scp_bl2(image_info_t *scp_bl2_image_info)
74*0d8052a4SVictor Chong #else
75*0d8052a4SVictor Chong int bl2_plat_handle_scp_bl2(struct image_info *scp_bl2_image_info)
76*0d8052a4SVictor Chong #endif
77*0d8052a4SVictor Chong {
78*0d8052a4SVictor Chong 	/*
79*0d8052a4SVictor Chong 	 * This platform has no SCP_BL2 yet
80*0d8052a4SVictor Chong 	 */
81*0d8052a4SVictor Chong 	return 0;
82*0d8052a4SVictor Chong }
83*0d8052a4SVictor Chong 
84*0d8052a4SVictor Chong /*******************************************************************************
85*0d8052a4SVictor Chong  * Gets SPSR for BL32 entry
86*0d8052a4SVictor Chong  ******************************************************************************/
87*0d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl32_entry(void)
88*0d8052a4SVictor Chong {
89*0d8052a4SVictor Chong 	/*
90*0d8052a4SVictor Chong 	 * The Secure Payload Dispatcher service is responsible for
91*0d8052a4SVictor Chong 	 * setting the SPSR prior to entry into the BL3-2 image.
92*0d8052a4SVictor Chong 	 */
93*0d8052a4SVictor Chong 	return 0;
94*0d8052a4SVictor Chong }
95*0d8052a4SVictor Chong 
96*0d8052a4SVictor Chong /*******************************************************************************
97*0d8052a4SVictor Chong  * Gets SPSR for BL33 entry
98*0d8052a4SVictor Chong  ******************************************************************************/
99*0d8052a4SVictor Chong #ifndef AARCH32
100*0d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl33_entry(void)
101*0d8052a4SVictor Chong {
102*0d8052a4SVictor Chong 	unsigned long el_status;
103*0d8052a4SVictor Chong 	unsigned int mode;
104*0d8052a4SVictor Chong 	uint32_t spsr;
105*0d8052a4SVictor Chong 
106*0d8052a4SVictor Chong 	/* Figure out what mode we enter the non-secure world in */
107*0d8052a4SVictor Chong 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
108*0d8052a4SVictor Chong 	el_status &= ID_AA64PFR0_ELX_MASK;
109*0d8052a4SVictor Chong 
110*0d8052a4SVictor Chong 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
111*0d8052a4SVictor Chong 
112*0d8052a4SVictor Chong 	/*
113*0d8052a4SVictor Chong 	 * TODO: Consider the possibility of specifying the SPSR in
114*0d8052a4SVictor Chong 	 * the FIP ToC and allowing the platform to have a say as
115*0d8052a4SVictor Chong 	 * well.
116*0d8052a4SVictor Chong 	 */
117*0d8052a4SVictor Chong 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
118*0d8052a4SVictor Chong 	return spsr;
119*0d8052a4SVictor Chong }
120*0d8052a4SVictor Chong #else
121*0d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl33_entry(void)
122*0d8052a4SVictor Chong {
123*0d8052a4SVictor Chong 	unsigned int hyp_status, mode, spsr;
124*0d8052a4SVictor Chong 
125*0d8052a4SVictor Chong 	hyp_status = GET_VIRT_EXT(read_id_pfr1());
126*0d8052a4SVictor Chong 
127*0d8052a4SVictor Chong 	mode = (hyp_status) ? MODE32_hyp : MODE32_svc;
128*0d8052a4SVictor Chong 
129*0d8052a4SVictor Chong 	/*
130*0d8052a4SVictor Chong 	 * TODO: Consider the possibility of specifying the SPSR in
131*0d8052a4SVictor Chong 	 * the FIP ToC and allowing the platform to have a say as
132*0d8052a4SVictor Chong 	 * well.
133*0d8052a4SVictor Chong 	 */
134*0d8052a4SVictor Chong 	spsr = SPSR_MODE32(mode, plat_get_ns_image_entrypoint() & 0x1,
135*0d8052a4SVictor Chong 			SPSR_E_LITTLE, DISABLE_ALL_EXCEPTIONS);
136*0d8052a4SVictor Chong 	return spsr;
137*0d8052a4SVictor Chong }
138*0d8052a4SVictor Chong #endif /* AARCH32 */
139*0d8052a4SVictor Chong 
140*0d8052a4SVictor Chong #if LOAD_IMAGE_V2
141*0d8052a4SVictor Chong int poplar_bl2_handle_post_image_load(unsigned int image_id)
142*0d8052a4SVictor Chong {
143*0d8052a4SVictor Chong 	int err = 0;
144*0d8052a4SVictor Chong 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
145*0d8052a4SVictor Chong 
146*0d8052a4SVictor Chong 	assert(bl_mem_params);
147*0d8052a4SVictor Chong 
148*0d8052a4SVictor Chong 	switch (image_id) {
149*0d8052a4SVictor Chong #ifdef AARCH64
150*0d8052a4SVictor Chong 	case BL32_IMAGE_ID:
151*0d8052a4SVictor Chong 		bl_mem_params->ep_info.spsr = poplar_get_spsr_for_bl32_entry();
152*0d8052a4SVictor Chong 		break;
153*0d8052a4SVictor Chong #endif
154*0d8052a4SVictor Chong 
155*0d8052a4SVictor Chong 	case BL33_IMAGE_ID:
156*0d8052a4SVictor Chong 		/* BL33 expects to receive the primary CPU MPID (through r0) */
157*0d8052a4SVictor Chong 		bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
158*0d8052a4SVictor Chong 		bl_mem_params->ep_info.spsr = poplar_get_spsr_for_bl33_entry();
159*0d8052a4SVictor Chong 		break;
160*0d8052a4SVictor Chong 
161*0d8052a4SVictor Chong #ifdef SCP_BL2_BASE
162*0d8052a4SVictor Chong 	case SCP_BL2_IMAGE_ID:
163*0d8052a4SVictor Chong 		/* The subsequent handling of SCP_BL2 is platform specific */
164*0d8052a4SVictor Chong 		err = plat_poplar_bl2_handle_scp_bl2(&bl_mem_params->image_info);
165*0d8052a4SVictor Chong 		if (err) {
166*0d8052a4SVictor Chong 			WARN("Failure in platform-specific handling of SCP_BL2 image.\n");
167*0d8052a4SVictor Chong 		}
168*0d8052a4SVictor Chong 		break;
169*0d8052a4SVictor Chong #endif
170*0d8052a4SVictor Chong 	}
171*0d8052a4SVictor Chong 
172*0d8052a4SVictor Chong 	return err;
173*0d8052a4SVictor Chong }
174*0d8052a4SVictor Chong 
175*0d8052a4SVictor Chong /*******************************************************************************
176*0d8052a4SVictor Chong  * This function can be used by the platforms to update/use image
177*0d8052a4SVictor Chong  * information for given `image_id`.
178*0d8052a4SVictor Chong  ******************************************************************************/
179*0d8052a4SVictor Chong int bl2_plat_handle_post_image_load(unsigned int image_id)
180*0d8052a4SVictor Chong {
181*0d8052a4SVictor Chong 	return poplar_bl2_handle_post_image_load(image_id);
182*0d8052a4SVictor Chong }
183*0d8052a4SVictor Chong 
184*0d8052a4SVictor Chong #else /* LOAD_IMAGE_V2 */
185*0d8052a4SVictor Chong 
186e35d0edbSJorge Ramirez-Ortiz bl31_params_t *bl2_plat_get_bl31_params(void)
187e35d0edbSJorge Ramirez-Ortiz {
188e35d0edbSJorge Ramirez-Ortiz 	bl31_params_t *bl2_to_bl31_params = NULL;
189e35d0edbSJorge Ramirez-Ortiz 
190e35d0edbSJorge Ramirez-Ortiz 	/*
191e35d0edbSJorge Ramirez-Ortiz 	 * Initialise the memory for all the arguments that needs to
192e35d0edbSJorge Ramirez-Ortiz 	 * be passed to BL3-1
193e35d0edbSJorge Ramirez-Ortiz 	 */
194e35d0edbSJorge Ramirez-Ortiz 	memset(&bl31_params_mem, 0, sizeof(bl2_to_bl31_params_mem_t));
195e35d0edbSJorge Ramirez-Ortiz 
196e35d0edbSJorge Ramirez-Ortiz 	/* Assign memory for TF related information */
197e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params = &bl31_params_mem.bl31_params;
198e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0);
199e35d0edbSJorge Ramirez-Ortiz 
200e35d0edbSJorge Ramirez-Ortiz 	/* Fill BL3-1 related information */
201e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info;
202e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info,
203e35d0edbSJorge Ramirez-Ortiz 		       PARAM_IMAGE_BINARY, VERSION_1, 0);
204e35d0edbSJorge Ramirez-Ortiz 
205f336774bSVictor Chong 	/* Fill BL3-2 related information if it exists */
206f336774bSVictor Chong #ifdef BL32_BASE
207f336774bSVictor Chong 	bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem.bl32_ep_info;
208f336774bSVictor Chong 	SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP,
209f336774bSVictor Chong 		VERSION_1, 0);
210f336774bSVictor Chong 	bl2_to_bl31_params->bl32_image_info = &bl31_params_mem.bl32_image_info;
211f336774bSVictor Chong 	SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY,
212f336774bSVictor Chong 		VERSION_1, 0);
213f336774bSVictor Chong #endif
214f336774bSVictor Chong 
215e35d0edbSJorge Ramirez-Ortiz 	/* Fill BL3-3 related information */
216e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info;
217e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info,
218e35d0edbSJorge Ramirez-Ortiz 		       PARAM_EP, VERSION_1, 0);
219e35d0edbSJorge Ramirez-Ortiz 
220e35d0edbSJorge Ramirez-Ortiz 	/* BL3-3 expects to receive the primary CPU MPID (through x0) */
221e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_ep_info->args.arg0 = 0xffff & read_mpidr();
222e35d0edbSJorge Ramirez-Ortiz 
223e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info;
224e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info,
225e35d0edbSJorge Ramirez-Ortiz 		       PARAM_IMAGE_BINARY, VERSION_1, 0);
226e35d0edbSJorge Ramirez-Ortiz 
227e35d0edbSJorge Ramirez-Ortiz 	return bl2_to_bl31_params;
228e35d0edbSJorge Ramirez-Ortiz }
229e35d0edbSJorge Ramirez-Ortiz 
230e35d0edbSJorge Ramirez-Ortiz struct entry_point_info *bl2_plat_get_bl31_ep_info(void)
231e35d0edbSJorge Ramirez-Ortiz {
232*0d8052a4SVictor Chong #if DEBUG
233*0d8052a4SVictor Chong 	bl31_params_mem.bl31_ep_info.args.arg1 = POPLAR_BL31_PLAT_PARAM_VAL;
234*0d8052a4SVictor Chong #endif
235*0d8052a4SVictor Chong 
236e35d0edbSJorge Ramirez-Ortiz 	return &bl31_params_mem.bl31_ep_info;
237e35d0edbSJorge Ramirez-Ortiz }
238e35d0edbSJorge Ramirez-Ortiz 
239e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl31_ep_info(image_info_t *image,
240e35d0edbSJorge Ramirez-Ortiz 			       entry_point_info_t *bl31_ep_info)
241e35d0edbSJorge Ramirez-Ortiz {
242e35d0edbSJorge Ramirez-Ortiz 	SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE);
243e35d0edbSJorge Ramirez-Ortiz 	bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
244e35d0edbSJorge Ramirez-Ortiz 				     DISABLE_ALL_EXCEPTIONS);
245e35d0edbSJorge Ramirez-Ortiz }
246e35d0edbSJorge Ramirez-Ortiz 
247f336774bSVictor Chong /*******************************************************************************
248f336774bSVictor Chong  * Before calling this function BL32 is loaded in memory and its entrypoint
249f336774bSVictor Chong  * is set by load_image. This is a placeholder for the platform to change
250f336774bSVictor Chong  * the entrypoint of BL32 and set SPSR and security state.
251f336774bSVictor Chong  * On Poplar we only set the security state of the entrypoint
252f336774bSVictor Chong  ******************************************************************************/
253f336774bSVictor Chong #ifdef BL32_BASE
254f336774bSVictor Chong void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info,
255f336774bSVictor Chong 					entry_point_info_t *bl32_ep_info)
256f336774bSVictor Chong {
257f336774bSVictor Chong 	SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE);
258f336774bSVictor Chong 	/*
259f336774bSVictor Chong 	 * The Secure Payload Dispatcher service is responsible for
260f336774bSVictor Chong 	 * setting the SPSR prior to entry into the BL32 image.
261f336774bSVictor Chong 	 */
262f336774bSVictor Chong 	bl32_ep_info->spsr = 0;
263f336774bSVictor Chong }
264f336774bSVictor Chong 
265f336774bSVictor Chong /*******************************************************************************
266f336774bSVictor Chong  * Populate the extents of memory available for loading BL32
267f336774bSVictor Chong  ******************************************************************************/
268f336774bSVictor Chong void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo)
269f336774bSVictor Chong {
270f336774bSVictor Chong 	/*
271f336774bSVictor Chong 	 * Populate the extents of memory available for loading BL32.
272f336774bSVictor Chong 	 */
273f336774bSVictor Chong 	bl32_meminfo->total_base = BL32_BASE;
274f336774bSVictor Chong 	bl32_meminfo->free_base = BL32_BASE;
275f336774bSVictor Chong 	bl32_meminfo->total_size =
276f336774bSVictor Chong 			(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
277f336774bSVictor Chong 	bl32_meminfo->free_size =
278f336774bSVictor Chong 			(TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE;
279f336774bSVictor Chong }
280f336774bSVictor Chong #endif /* BL32_BASE */
281f336774bSVictor Chong 
282e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl33_ep_info(image_info_t *image,
283e35d0edbSJorge Ramirez-Ortiz 			       entry_point_info_t *bl33_ep_info)
284e35d0edbSJorge Ramirez-Ortiz {
285e35d0edbSJorge Ramirez-Ortiz 	SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE);
286*0d8052a4SVictor Chong 	bl33_ep_info->spsr = poplar_get_spsr_for_bl33_entry();
287e35d0edbSJorge Ramirez-Ortiz 	bl33_ep_info->args.arg2 = image->image_size;
288e35d0edbSJorge Ramirez-Ortiz }
289e35d0edbSJorge Ramirez-Ortiz 
290e35d0edbSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void)
291e35d0edbSJorge Ramirez-Ortiz {
292e35d0edbSJorge Ramirez-Ortiz 	flush_dcache_range((unsigned long)&bl31_params_mem,
293e35d0edbSJorge Ramirez-Ortiz 			   sizeof(bl2_to_bl31_params_mem_t));
294e35d0edbSJorge Ramirez-Ortiz }
295e35d0edbSJorge Ramirez-Ortiz 
296e35d0edbSJorge Ramirez-Ortiz void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo)
297e35d0edbSJorge Ramirez-Ortiz {
298e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->total_base = DDR_BASE;
299e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->total_size = DDR_SIZE;
300e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->free_base  = DDR_BASE;
301e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->free_size  = DDR_SIZE;
302e35d0edbSJorge Ramirez-Ortiz }
303*0d8052a4SVictor Chong #endif /* LOAD_IMAGE_V2 */
304e35d0edbSJorge Ramirez-Ortiz 
305e35d0edbSJorge Ramirez-Ortiz void bl2_early_platform_setup(meminfo_t *mem_layout)
306e35d0edbSJorge Ramirez-Ortiz {
30715b54e7bSVictor Chong #if !POPLAR_RECOVERY
30859149bbeSVictor Chong 	dw_mmc_params_t params = EMMC_INIT_PARAMS(POPLAR_EMMC_DESC_BASE);
30915b54e7bSVictor Chong #endif
31059149bbeSVictor Chong 
311e35d0edbSJorge Ramirez-Ortiz 	console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE);
312e35d0edbSJorge Ramirez-Ortiz 
313e35d0edbSJorge Ramirez-Ortiz 	/* Enable arch timer */
314e35d0edbSJorge Ramirez-Ortiz 	generic_delay_timer_init();
315e35d0edbSJorge Ramirez-Ortiz 
316e35d0edbSJorge Ramirez-Ortiz 	bl2_tzram_layout = *mem_layout;
31759149bbeSVictor Chong 
31815b54e7bSVictor Chong #if !POPLAR_RECOVERY
31959149bbeSVictor Chong 	/* SoC-specific emmc register are initialized/configured by bootrom */
32059149bbeSVictor Chong 	INFO("BL2: initializing emmc\n");
32159149bbeSVictor Chong 	dw_mmc_init(&params);
32215b54e7bSVictor Chong #endif
32359149bbeSVictor Chong 
32459149bbeSVictor Chong 	plat_io_setup();
325e35d0edbSJorge Ramirez-Ortiz }
326e35d0edbSJorge Ramirez-Ortiz 
327e35d0edbSJorge Ramirez-Ortiz void bl2_plat_arch_setup(void)
328e35d0edbSJorge Ramirez-Ortiz {
329e35d0edbSJorge Ramirez-Ortiz 	plat_configure_mmu_el1(bl2_tzram_layout.total_base,
330e35d0edbSJorge Ramirez-Ortiz 			       bl2_tzram_layout.total_size,
331e35d0edbSJorge Ramirez-Ortiz 			       BL2_RO_BASE,
332e35d0edbSJorge Ramirez-Ortiz 			       BL2_RO_LIMIT,
333e35d0edbSJorge Ramirez-Ortiz 			       BL2_COHERENT_RAM_BASE,
334e35d0edbSJorge Ramirez-Ortiz 			       BL2_COHERENT_RAM_LIMIT);
335e35d0edbSJorge Ramirez-Ortiz }
336e35d0edbSJorge Ramirez-Ortiz 
337e35d0edbSJorge Ramirez-Ortiz void bl2_platform_setup(void)
338e35d0edbSJorge Ramirez-Ortiz {
339e35d0edbSJorge Ramirez-Ortiz }
340e35d0edbSJorge Ramirez-Ortiz 
341*0d8052a4SVictor Chong uintptr_t plat_get_ns_image_entrypoint(void)
342e35d0edbSJorge Ramirez-Ortiz {
343*0d8052a4SVictor Chong #ifdef PRELOADED_BL33_BASE
344*0d8052a4SVictor Chong 	return PRELOADED_BL33_BASE;
345*0d8052a4SVictor Chong #else
3465a3ec61fSVictor Chong 	return PLAT_POPLAR_NS_IMAGE_OFFSET;
347*0d8052a4SVictor Chong #endif
348e35d0edbSJorge Ramirez-Ortiz }
349