1*a2847172SGrzegorz Jaszczyk /* 2*a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd. 3*a2847172SGrzegorz Jaszczyk * 4*a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier: BSD-3-Clause 5*a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses 6*a2847172SGrzegorz Jaszczyk */ 7*a2847172SGrzegorz Jaszczyk 8*a2847172SGrzegorz Jaszczyk #include <assert.h> 9*a2847172SGrzegorz Jaszczyk #include <string.h> 10*a2847172SGrzegorz Jaszczyk 11*a2847172SGrzegorz Jaszczyk #include <platform_def.h> 12*a2847172SGrzegorz Jaszczyk 13*a2847172SGrzegorz Jaszczyk #include <arch_helpers.h> 14*a2847172SGrzegorz Jaszczyk #include <common/bl_common.h> 15*a2847172SGrzegorz Jaszczyk #include <common/debug.h> 16*a2847172SGrzegorz Jaszczyk #include <common/desc_image_load.h> 17*a2847172SGrzegorz Jaszczyk #include <drivers/console.h> 18*a2847172SGrzegorz Jaszczyk #include <lib/utils.h> 19*a2847172SGrzegorz Jaszczyk 20*a2847172SGrzegorz Jaszczyk #include <marvell_def.h> 21*a2847172SGrzegorz Jaszczyk #include <plat_marvell.h> 22*a2847172SGrzegorz Jaszczyk 23*a2847172SGrzegorz Jaszczyk /* Data structure which holds the extents of the trusted SRAM for BL2 */ 24*a2847172SGrzegorz Jaszczyk static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 25*a2847172SGrzegorz Jaszczyk 26*a2847172SGrzegorz Jaszczyk /* Weak definitions may be overridden in specific MARVELL standard platform */ 27*a2847172SGrzegorz Jaszczyk #pragma weak bl2_early_platform_setup2 28*a2847172SGrzegorz Jaszczyk #pragma weak bl2_platform_setup 29*a2847172SGrzegorz Jaszczyk #pragma weak bl2_plat_arch_setup 30*a2847172SGrzegorz Jaszczyk #pragma weak bl2_plat_sec_mem_layout 31*a2847172SGrzegorz Jaszczyk 32*a2847172SGrzegorz Jaszczyk meminfo_t *bl2_plat_sec_mem_layout(void) 33*a2847172SGrzegorz Jaszczyk { 34*a2847172SGrzegorz Jaszczyk return &bl2_tzram_layout; 35*a2847172SGrzegorz Jaszczyk } 36*a2847172SGrzegorz Jaszczyk 37*a2847172SGrzegorz Jaszczyk /***************************************************************************** 38*a2847172SGrzegorz Jaszczyk * BL1 has passed the extents of the trusted SRAM that should be visible to BL2 39*a2847172SGrzegorz Jaszczyk * in x0. This memory layout is sitting at the base of the free trusted SRAM. 40*a2847172SGrzegorz Jaszczyk * Copy it to a safe location before its reclaimed by later BL2 functionality. 41*a2847172SGrzegorz Jaszczyk ***************************************************************************** 42*a2847172SGrzegorz Jaszczyk */ 43*a2847172SGrzegorz Jaszczyk void marvell_bl2_early_platform_setup(meminfo_t *mem_layout) 44*a2847172SGrzegorz Jaszczyk { 45*a2847172SGrzegorz Jaszczyk /* Initialize the console to provide early debug support */ 46*a2847172SGrzegorz Jaszczyk marvell_console_boot_init(); 47*a2847172SGrzegorz Jaszczyk 48*a2847172SGrzegorz Jaszczyk /* Setup the BL2 memory layout */ 49*a2847172SGrzegorz Jaszczyk bl2_tzram_layout = *mem_layout; 50*a2847172SGrzegorz Jaszczyk 51*a2847172SGrzegorz Jaszczyk /* Initialise the IO layer and register platform IO devices */ 52*a2847172SGrzegorz Jaszczyk plat_marvell_io_setup(); 53*a2847172SGrzegorz Jaszczyk } 54*a2847172SGrzegorz Jaszczyk 55*a2847172SGrzegorz Jaszczyk 56*a2847172SGrzegorz Jaszczyk void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, 57*a2847172SGrzegorz Jaszczyk u_register_t arg2, u_register_t arg3) 58*a2847172SGrzegorz Jaszczyk { 59*a2847172SGrzegorz Jaszczyk struct meminfo *mem_layout = (struct meminfo *)arg1; 60*a2847172SGrzegorz Jaszczyk 61*a2847172SGrzegorz Jaszczyk marvell_bl2_early_platform_setup(mem_layout); 62*a2847172SGrzegorz Jaszczyk } 63*a2847172SGrzegorz Jaszczyk 64*a2847172SGrzegorz Jaszczyk void bl2_platform_setup(void) 65*a2847172SGrzegorz Jaszczyk { 66*a2847172SGrzegorz Jaszczyk /* Nothing to do */ 67*a2847172SGrzegorz Jaszczyk } 68*a2847172SGrzegorz Jaszczyk 69*a2847172SGrzegorz Jaszczyk /***************************************************************************** 70*a2847172SGrzegorz Jaszczyk * Perform the very early platform specific architectural setup here. At the 71*a2847172SGrzegorz Jaszczyk * moment this is only initializes the mmu in a quick and dirty way. 72*a2847172SGrzegorz Jaszczyk ***************************************************************************** 73*a2847172SGrzegorz Jaszczyk */ 74*a2847172SGrzegorz Jaszczyk void marvell_bl2_plat_arch_setup(void) 75*a2847172SGrzegorz Jaszczyk { 76*a2847172SGrzegorz Jaszczyk marvell_setup_page_tables(bl2_tzram_layout.total_base, 77*a2847172SGrzegorz Jaszczyk bl2_tzram_layout.total_size, 78*a2847172SGrzegorz Jaszczyk BL_CODE_BASE, 79*a2847172SGrzegorz Jaszczyk BL_CODE_END, 80*a2847172SGrzegorz Jaszczyk BL_RO_DATA_BASE, 81*a2847172SGrzegorz Jaszczyk BL_RO_DATA_END 82*a2847172SGrzegorz Jaszczyk #if USE_COHERENT_MEM 83*a2847172SGrzegorz Jaszczyk , BL_COHERENT_RAM_BASE, 84*a2847172SGrzegorz Jaszczyk BL_COHERENT_RAM_END 85*a2847172SGrzegorz Jaszczyk #endif 86*a2847172SGrzegorz Jaszczyk ); 87*a2847172SGrzegorz Jaszczyk enable_mmu_el1(0); 88*a2847172SGrzegorz Jaszczyk } 89*a2847172SGrzegorz Jaszczyk 90*a2847172SGrzegorz Jaszczyk void bl2_plat_arch_setup(void) 91*a2847172SGrzegorz Jaszczyk { 92*a2847172SGrzegorz Jaszczyk marvell_bl2_plat_arch_setup(); 93*a2847172SGrzegorz Jaszczyk } 94*a2847172SGrzegorz Jaszczyk 95*a2847172SGrzegorz Jaszczyk int marvell_bl2_handle_post_image_load(unsigned int image_id) 96*a2847172SGrzegorz Jaszczyk { 97*a2847172SGrzegorz Jaszczyk int err = 0; 98*a2847172SGrzegorz Jaszczyk bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); 99*a2847172SGrzegorz Jaszczyk 100*a2847172SGrzegorz Jaszczyk assert(bl_mem_params); 101*a2847172SGrzegorz Jaszczyk 102*a2847172SGrzegorz Jaszczyk switch (image_id) { 103*a2847172SGrzegorz Jaszczyk 104*a2847172SGrzegorz Jaszczyk case BL33_IMAGE_ID: 105*a2847172SGrzegorz Jaszczyk /* BL33 expects to receive the primary CPU MPID (through r0) */ 106*a2847172SGrzegorz Jaszczyk bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); 107*a2847172SGrzegorz Jaszczyk bl_mem_params->ep_info.spsr = marvell_get_spsr_for_bl33_entry(); 108*a2847172SGrzegorz Jaszczyk break; 109*a2847172SGrzegorz Jaszczyk #ifdef SCP_BL2_BASE 110*a2847172SGrzegorz Jaszczyk case SCP_BL2_IMAGE_ID: 111*a2847172SGrzegorz Jaszczyk /* The subsequent handling of SCP_BL2 is platform specific */ 112*a2847172SGrzegorz Jaszczyk err = bl2_plat_handle_scp_bl2(&bl_mem_params->image_info); 113*a2847172SGrzegorz Jaszczyk if (err) { 114*a2847172SGrzegorz Jaszczyk WARN("Failure in platform-specific handling of SCP_BL2 image.\n"); 115*a2847172SGrzegorz Jaszczyk } 116*a2847172SGrzegorz Jaszczyk break; 117*a2847172SGrzegorz Jaszczyk #endif 118*a2847172SGrzegorz Jaszczyk default: 119*a2847172SGrzegorz Jaszczyk /* Do nothing in default case */ 120*a2847172SGrzegorz Jaszczyk break; 121*a2847172SGrzegorz Jaszczyk } 122*a2847172SGrzegorz Jaszczyk 123*a2847172SGrzegorz Jaszczyk return err; 124*a2847172SGrzegorz Jaszczyk 125*a2847172SGrzegorz Jaszczyk } 126*a2847172SGrzegorz Jaszczyk 127*a2847172SGrzegorz Jaszczyk /******************************************************************************* 128*a2847172SGrzegorz Jaszczyk * This function can be used by the platforms to update/use image 129*a2847172SGrzegorz Jaszczyk * information for given `image_id`. 130*a2847172SGrzegorz Jaszczyk ******************************************************************************/ 131*a2847172SGrzegorz Jaszczyk int bl2_plat_handle_post_image_load(unsigned int image_id) 132*a2847172SGrzegorz Jaszczyk { 133*a2847172SGrzegorz Jaszczyk return marvell_bl2_handle_post_image_load(image_id); 134*a2847172SGrzegorz Jaszczyk } 135*a2847172SGrzegorz Jaszczyk 136