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