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