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