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 31*717448d6SSheetal Tigadoli void plat_bcm_bl2_early_platform_setup(void) 32*717448d6SSheetal Tigadoli { 33*717448d6SSheetal Tigadoli } 34*717448d6SSheetal Tigadoli 35*717448d6SSheetal Tigadoli void plat_bcm_bl2_platform_setup(void) 36*717448d6SSheetal Tigadoli { 37*717448d6SSheetal Tigadoli } 38*717448d6SSheetal Tigadoli 39*717448d6SSheetal Tigadoli void plat_bcm_bl2_plat_arch_setup(void) 40*717448d6SSheetal Tigadoli { 41*717448d6SSheetal Tigadoli } 42*717448d6SSheetal Tigadoli 43*717448d6SSheetal Tigadoli void plat_bcm_security_setup(void) 44*717448d6SSheetal Tigadoli { 45*717448d6SSheetal Tigadoli } 46*717448d6SSheetal Tigadoli 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 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 */ 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 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 ******************************************************************************/ 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 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 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 ******************************************************************************/ 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 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 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 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