xref: /rk3399_ARM-atf/plat/brcm/common/brcm_bl2_setup.c (revision 926cd70a0cc3a0cbf209a87765a8dc0b869798e3)
1*717448d6SSheetal Tigadoli /*
2*717448d6SSheetal Tigadoli  * Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved.
3*717448d6SSheetal Tigadoli  *
4*717448d6SSheetal Tigadoli  * SPDX-License-Identifier: BSD-3-Clause
5*717448d6SSheetal Tigadoli  */
6*717448d6SSheetal Tigadoli 
7*717448d6SSheetal Tigadoli #include <assert.h>
8*717448d6SSheetal Tigadoli #include <string.h>
9*717448d6SSheetal Tigadoli 
10*717448d6SSheetal Tigadoli #include <arch_helpers.h>
11*717448d6SSheetal Tigadoli #include <common/bl_common.h>
12*717448d6SSheetal Tigadoli #include <common/debug.h>
13*717448d6SSheetal Tigadoli #include <common/desc_image_load.h>
14*717448d6SSheetal Tigadoli #include <drivers/arm/sp804_delay_timer.h>
15*717448d6SSheetal Tigadoli #include <lib/mmio.h>
16*717448d6SSheetal Tigadoli 
17*717448d6SSheetal Tigadoli #include <bcm_console.h>
18*717448d6SSheetal Tigadoli #include <platform_def.h>
19*717448d6SSheetal Tigadoli #include <plat/brcm/common/plat_brcm.h>
20*717448d6SSheetal Tigadoli 
21*717448d6SSheetal Tigadoli /* Data structure which holds the extents of the trusted SRAM for BL2 */
22*717448d6SSheetal Tigadoli static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
23*717448d6SSheetal Tigadoli 
24*717448d6SSheetal Tigadoli /* Weak definitions may be overridden in specific BRCM platform */
25*717448d6SSheetal Tigadoli #pragma weak plat_bcm_bl2_platform_setup
26*717448d6SSheetal Tigadoli #pragma weak plat_bcm_bl2_plat_arch_setup
27*717448d6SSheetal Tigadoli #pragma weak plat_bcm_security_setup
28*717448d6SSheetal Tigadoli #pragma weak plat_bcm_bl2_plat_handle_scp_bl2
29*717448d6SSheetal Tigadoli #pragma weak plat_bcm_bl2_early_platform_setup
30*717448d6SSheetal Tigadoli 
plat_bcm_bl2_early_platform_setup(void)31*717448d6SSheetal Tigadoli void plat_bcm_bl2_early_platform_setup(void)
32*717448d6SSheetal Tigadoli {
33*717448d6SSheetal Tigadoli }
34*717448d6SSheetal Tigadoli 
plat_bcm_bl2_platform_setup(void)35*717448d6SSheetal Tigadoli void plat_bcm_bl2_platform_setup(void)
36*717448d6SSheetal Tigadoli {
37*717448d6SSheetal Tigadoli }
38*717448d6SSheetal Tigadoli 
plat_bcm_bl2_plat_arch_setup(void)39*717448d6SSheetal Tigadoli void plat_bcm_bl2_plat_arch_setup(void)
40*717448d6SSheetal Tigadoli {
41*717448d6SSheetal Tigadoli }
42*717448d6SSheetal Tigadoli 
plat_bcm_security_setup(void)43*717448d6SSheetal Tigadoli void plat_bcm_security_setup(void)
44*717448d6SSheetal Tigadoli {
45*717448d6SSheetal Tigadoli }
46*717448d6SSheetal Tigadoli 
bcm_bl2_early_platform_setup(uintptr_t tb_fw_config,meminfo_t * mem_layout)47*717448d6SSheetal Tigadoli void bcm_bl2_early_platform_setup(uintptr_t tb_fw_config,
48*717448d6SSheetal Tigadoli 				  meminfo_t *mem_layout)
49*717448d6SSheetal Tigadoli {
50*717448d6SSheetal Tigadoli 	/* Initialize the console to provide early debug support */
51*717448d6SSheetal Tigadoli 	bcm_console_boot_init();
52*717448d6SSheetal Tigadoli 
53*717448d6SSheetal Tigadoli 	/* Setup the BL2 memory layout */
54*717448d6SSheetal Tigadoli 	bl2_tzram_layout = *mem_layout;
55*717448d6SSheetal Tigadoli 
56*717448d6SSheetal Tigadoli 	/* Initialise the IO layer and register platform IO devices */
57*717448d6SSheetal Tigadoli 	plat_brcm_io_setup();
58*717448d6SSheetal Tigadoli 
59*717448d6SSheetal Tigadoli 	/* Log HW reset event */
60*717448d6SSheetal Tigadoli 	INFO("RESET: 0x%x\n",
61*717448d6SSheetal Tigadoli 		mmio_read_32(CRMU_RESET_EVENT_LOG));
62*717448d6SSheetal Tigadoli }
63*717448d6SSheetal Tigadoli 
bl2_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)64*717448d6SSheetal Tigadoli void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1,
65*717448d6SSheetal Tigadoli 			       u_register_t arg2, u_register_t arg3)
66*717448d6SSheetal Tigadoli {
67*717448d6SSheetal Tigadoli 	/* SoC specific setup */
68*717448d6SSheetal Tigadoli 	plat_bcm_bl2_early_platform_setup();
69*717448d6SSheetal Tigadoli 
70*717448d6SSheetal Tigadoli 	/* Initialize delay timer driver using SP804 dual timer 0 */
71*717448d6SSheetal Tigadoli 	sp804_timer_init(SP804_TIMER0_BASE,
72*717448d6SSheetal Tigadoli 			 SP804_TIMER0_CLKMULT, SP804_TIMER0_CLKDIV);
73*717448d6SSheetal Tigadoli 
74*717448d6SSheetal Tigadoli 	/* BRCM platforms generic setup */
75*717448d6SSheetal Tigadoli 	bcm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1);
76*717448d6SSheetal Tigadoli }
77*717448d6SSheetal Tigadoli 
78*717448d6SSheetal Tigadoli /*
79*717448d6SSheetal Tigadoli  * Perform Broadcom platform setup.
80*717448d6SSheetal Tigadoli  */
bcm_bl2_platform_setup(void)81*717448d6SSheetal Tigadoli void bcm_bl2_platform_setup(void)
82*717448d6SSheetal Tigadoli {
83*717448d6SSheetal Tigadoli 	/* Initialize the secure environment */
84*717448d6SSheetal Tigadoli 	plat_bcm_security_setup();
85*717448d6SSheetal Tigadoli }
86*717448d6SSheetal Tigadoli 
bl2_platform_setup(void)87*717448d6SSheetal Tigadoli void bl2_platform_setup(void)
88*717448d6SSheetal Tigadoli {
89*717448d6SSheetal Tigadoli 	bcm_bl2_platform_setup();
90*717448d6SSheetal Tigadoli 	plat_bcm_bl2_platform_setup();
91*717448d6SSheetal Tigadoli }
92*717448d6SSheetal Tigadoli 
93*717448d6SSheetal Tigadoli /*******************************************************************************
94*717448d6SSheetal Tigadoli  * Perform the very early platform specific architectural setup here. At the
95*717448d6SSheetal Tigadoli  * moment this is only initializes the mmu in a quick and dirty way.
96*717448d6SSheetal Tigadoli  ******************************************************************************/
bcm_bl2_plat_arch_setup(void)97*717448d6SSheetal Tigadoli void bcm_bl2_plat_arch_setup(void)
98*717448d6SSheetal Tigadoli {
99*717448d6SSheetal Tigadoli #ifndef MMU_DISABLED
100*717448d6SSheetal Tigadoli 	if (!(read_sctlr_el1() & SCTLR_M_BIT)) {
101*717448d6SSheetal Tigadoli 		const mmap_region_t bl_regions[] = {
102*717448d6SSheetal Tigadoli 			MAP_REGION_FLAT(bl2_tzram_layout.total_base,
103*717448d6SSheetal Tigadoli 					bl2_tzram_layout.total_size,
104*717448d6SSheetal Tigadoli 					MT_MEMORY | MT_RW | MT_SECURE),
105*717448d6SSheetal Tigadoli 			MAP_REGION_FLAT(BL_CODE_BASE,
106*717448d6SSheetal Tigadoli 					BL_CODE_END - BL_CODE_BASE,
107*717448d6SSheetal Tigadoli 					MT_CODE | MT_SECURE),
108*717448d6SSheetal Tigadoli 			MAP_REGION_FLAT(BL_RO_DATA_BASE,
109*717448d6SSheetal Tigadoli 					BL_RO_DATA_END - BL_RO_DATA_BASE,
110*717448d6SSheetal Tigadoli 					MT_RO_DATA | MT_SECURE),
111*717448d6SSheetal Tigadoli #if USE_COHERENT_MEM
112*717448d6SSheetal Tigadoli 			MAP_REGION_FLAT(BL_COHERENT_RAM_BASE,
113*717448d6SSheetal Tigadoli 					BL_COHERENT_RAM_END -
114*717448d6SSheetal Tigadoli 					BL_COHERENT_RAM_BASE,
115*717448d6SSheetal Tigadoli 					MT_DEVICE | MT_RW | MT_SECURE),
116*717448d6SSheetal Tigadoli #endif
117*717448d6SSheetal Tigadoli 			{0}
118*717448d6SSheetal Tigadoli 		};
119*717448d6SSheetal Tigadoli 
120*717448d6SSheetal Tigadoli 		setup_page_tables(bl_regions, plat_brcm_get_mmap());
121*717448d6SSheetal Tigadoli 		enable_mmu_el1(0);
122*717448d6SSheetal Tigadoli 	}
123*717448d6SSheetal Tigadoli #endif
124*717448d6SSheetal Tigadoli }
125*717448d6SSheetal Tigadoli 
bl2_plat_arch_setup(void)126*717448d6SSheetal Tigadoli void bl2_plat_arch_setup(void)
127*717448d6SSheetal Tigadoli {
128*717448d6SSheetal Tigadoli #ifdef ENA_MMU_BEFORE_DDR_INIT
129*717448d6SSheetal Tigadoli 	/*
130*717448d6SSheetal Tigadoli 	 * Once MMU is enabled before DDR, MEMORY TESTS
131*717448d6SSheetal Tigadoli 	 * get affected as read/write transaction might occures from
132*717448d6SSheetal Tigadoli 	 * caches. So For running memory test, one should not set this
133*717448d6SSheetal Tigadoli 	 * flag.
134*717448d6SSheetal Tigadoli 	 */
135*717448d6SSheetal Tigadoli 	bcm_bl2_plat_arch_setup();
136*717448d6SSheetal Tigadoli 	plat_bcm_bl2_plat_arch_setup();
137*717448d6SSheetal Tigadoli #else
138*717448d6SSheetal Tigadoli 	plat_bcm_bl2_plat_arch_setup();
139*717448d6SSheetal Tigadoli 	bcm_bl2_plat_arch_setup();
140*717448d6SSheetal Tigadoli #endif
141*717448d6SSheetal Tigadoli }
142*717448d6SSheetal Tigadoli 
bcm_bl2_handle_post_image_load(unsigned int image_id)143*717448d6SSheetal Tigadoli int bcm_bl2_handle_post_image_load(unsigned int image_id)
144*717448d6SSheetal Tigadoli {
145*717448d6SSheetal Tigadoli 	int err = 0;
146*717448d6SSheetal Tigadoli 
147*717448d6SSheetal Tigadoli 	bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
148*717448d6SSheetal Tigadoli 
149*717448d6SSheetal Tigadoli 	assert(bl_mem_params);
150*717448d6SSheetal Tigadoli 
151*717448d6SSheetal Tigadoli 	switch (image_id) {
152*717448d6SSheetal Tigadoli 	case BL32_IMAGE_ID:
153*717448d6SSheetal Tigadoli 		bl_mem_params->ep_info.spsr = brcm_get_spsr_for_bl32_entry();
154*717448d6SSheetal Tigadoli 		break;
155*717448d6SSheetal Tigadoli 
156*717448d6SSheetal Tigadoli 	case BL33_IMAGE_ID:
157*717448d6SSheetal Tigadoli 		/* BL33 expects to receive the primary CPU MPID (through r0) */
158*717448d6SSheetal Tigadoli 		bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr();
159*717448d6SSheetal Tigadoli 		bl_mem_params->ep_info.spsr = brcm_get_spsr_for_bl33_entry();
160*717448d6SSheetal Tigadoli 		break;
161*717448d6SSheetal Tigadoli 
162*717448d6SSheetal Tigadoli #ifdef SCP_BL2_BASE
163*717448d6SSheetal Tigadoli 	case SCP_BL2_IMAGE_ID:
164*717448d6SSheetal Tigadoli 		/* The subsequent handling of SCP_BL2 is platform specific */
165*717448d6SSheetal Tigadoli 		err = bcm_bl2_handle_scp_bl2(&bl_mem_params->image_info);
166*717448d6SSheetal Tigadoli 		if (err)
167*717448d6SSheetal Tigadoli 			WARN("Failure in platform-specific handling of SCP_BL2 image.\n");
168*717448d6SSheetal Tigadoli 		break;
169*717448d6SSheetal Tigadoli #endif
170*717448d6SSheetal Tigadoli 	default:
171*717448d6SSheetal Tigadoli 		/* Do nothing in default case */
172*717448d6SSheetal Tigadoli 		break;
173*717448d6SSheetal Tigadoli 	}
174*717448d6SSheetal Tigadoli 
175*717448d6SSheetal Tigadoli 	return err;
176*717448d6SSheetal Tigadoli }
177*717448d6SSheetal Tigadoli 
178*717448d6SSheetal Tigadoli /*******************************************************************************
179*717448d6SSheetal Tigadoli  * This function can be used by the platforms to update/use image
180*717448d6SSheetal Tigadoli  * information for given `image_id`.
181*717448d6SSheetal Tigadoli  ******************************************************************************/
bcm_bl2_plat_handle_post_image_load(unsigned int image_id)182*717448d6SSheetal Tigadoli int bcm_bl2_plat_handle_post_image_load(unsigned int image_id)
183*717448d6SSheetal Tigadoli {
184*717448d6SSheetal Tigadoli 	return bcm_bl2_handle_post_image_load(image_id);
185*717448d6SSheetal Tigadoli }
186*717448d6SSheetal Tigadoli 
bl2_plat_handle_post_image_load(unsigned int image_id)187*717448d6SSheetal Tigadoli int bl2_plat_handle_post_image_load(unsigned int image_id)
188*717448d6SSheetal Tigadoli {
189*717448d6SSheetal Tigadoli 	return bcm_bl2_plat_handle_post_image_load(image_id);
190*717448d6SSheetal Tigadoli }
191*717448d6SSheetal Tigadoli 
192*717448d6SSheetal Tigadoli #ifdef SCP_BL2_BASE
plat_bcm_bl2_plat_handle_scp_bl2(image_info_t * scp_bl2_image_info)193*717448d6SSheetal Tigadoli int plat_bcm_bl2_plat_handle_scp_bl2(image_info_t *scp_bl2_image_info)
194*717448d6SSheetal Tigadoli {
195*717448d6SSheetal Tigadoli 	return 0;
196*717448d6SSheetal Tigadoli }
197*717448d6SSheetal Tigadoli 
bcm_bl2_handle_scp_bl2(image_info_t * scp_bl2_image_info)198*717448d6SSheetal Tigadoli int bcm_bl2_handle_scp_bl2(image_info_t *scp_bl2_image_info)
199*717448d6SSheetal Tigadoli {
200*717448d6SSheetal Tigadoli 	return plat_bcm_bl2_plat_handle_scp_bl2(scp_bl2_image_info);
201*717448d6SSheetal Tigadoli }
202*717448d6SSheetal Tigadoli #endif
203