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 <platform_def.h> 9*a2847172SGrzegorz Jaszczyk 10*a2847172SGrzegorz Jaszczyk #include <bl1/bl1.h> 11*a2847172SGrzegorz Jaszczyk #include <common/bl_common.h> 12*a2847172SGrzegorz Jaszczyk #include <common/debug.h> 13*a2847172SGrzegorz Jaszczyk #include <drivers/arm/sp805.h> 14*a2847172SGrzegorz Jaszczyk #include <drivers/console.h> 15*a2847172SGrzegorz Jaszczyk #include <plat/common/platform.h> 16*a2847172SGrzegorz Jaszczyk 17*a2847172SGrzegorz Jaszczyk #include <plat_marvell.h> 18*a2847172SGrzegorz Jaszczyk 19*a2847172SGrzegorz Jaszczyk /* Weak definitions may be overridden in specific Marvell standard platform */ 20*a2847172SGrzegorz Jaszczyk #pragma weak bl1_early_platform_setup 21*a2847172SGrzegorz Jaszczyk #pragma weak bl1_plat_arch_setup 22*a2847172SGrzegorz Jaszczyk #pragma weak bl1_platform_setup 23*a2847172SGrzegorz Jaszczyk #pragma weak bl1_plat_sec_mem_layout 24*a2847172SGrzegorz Jaszczyk 25*a2847172SGrzegorz Jaszczyk /* Data structure which holds the extents of the RAM for BL1*/ 26*a2847172SGrzegorz Jaszczyk static meminfo_t bl1_ram_layout; 27*a2847172SGrzegorz Jaszczyk bl1_plat_sec_mem_layout(void)28*a2847172SGrzegorz Jaszczykmeminfo_t *bl1_plat_sec_mem_layout(void) 29*a2847172SGrzegorz Jaszczyk { 30*a2847172SGrzegorz Jaszczyk return &bl1_ram_layout; 31*a2847172SGrzegorz Jaszczyk } 32*a2847172SGrzegorz Jaszczyk 33*a2847172SGrzegorz Jaszczyk /* 34*a2847172SGrzegorz Jaszczyk * BL1 specific platform actions shared between Marvell standard platforms. 35*a2847172SGrzegorz Jaszczyk */ marvell_bl1_early_platform_setup(void)36*a2847172SGrzegorz Jaszczykvoid marvell_bl1_early_platform_setup(void) 37*a2847172SGrzegorz Jaszczyk { 38*a2847172SGrzegorz Jaszczyk /* Initialize the console to provide early debug support */ 39*a2847172SGrzegorz Jaszczyk marvell_console_boot_init(); 40*a2847172SGrzegorz Jaszczyk 41*a2847172SGrzegorz Jaszczyk /* Allow BL1 to see the whole Trusted RAM */ 42*a2847172SGrzegorz Jaszczyk bl1_ram_layout.total_base = MARVELL_BL_RAM_BASE; 43*a2847172SGrzegorz Jaszczyk bl1_ram_layout.total_size = MARVELL_BL_RAM_SIZE; 44*a2847172SGrzegorz Jaszczyk } 45*a2847172SGrzegorz Jaszczyk bl1_early_platform_setup(void)46*a2847172SGrzegorz Jaszczykvoid bl1_early_platform_setup(void) 47*a2847172SGrzegorz Jaszczyk { 48*a2847172SGrzegorz Jaszczyk marvell_bl1_early_platform_setup(); 49*a2847172SGrzegorz Jaszczyk } 50*a2847172SGrzegorz Jaszczyk 51*a2847172SGrzegorz Jaszczyk /* 52*a2847172SGrzegorz Jaszczyk * Perform the very early platform specific architecture setup shared between 53*a2847172SGrzegorz Jaszczyk * MARVELL standard platforms. This only does basic initialization. Later 54*a2847172SGrzegorz Jaszczyk * architectural setup (bl1_arch_setup()) does not do anything platform 55*a2847172SGrzegorz Jaszczyk * specific. 56*a2847172SGrzegorz Jaszczyk */ marvell_bl1_plat_arch_setup(void)57*a2847172SGrzegorz Jaszczykvoid marvell_bl1_plat_arch_setup(void) 58*a2847172SGrzegorz Jaszczyk { 59*a2847172SGrzegorz Jaszczyk marvell_setup_page_tables(bl1_ram_layout.total_base, 60*a2847172SGrzegorz Jaszczyk bl1_ram_layout.total_size, 61*a2847172SGrzegorz Jaszczyk BL1_RO_BASE, 62*a2847172SGrzegorz Jaszczyk BL1_RO_LIMIT, 63*a2847172SGrzegorz Jaszczyk BL1_RO_DATA_BASE, 64*a2847172SGrzegorz Jaszczyk BL1_RO_DATA_END 65*a2847172SGrzegorz Jaszczyk #if USE_COHERENT_MEM 66*a2847172SGrzegorz Jaszczyk , BL_COHERENT_RAM_BASE, 67*a2847172SGrzegorz Jaszczyk BL_COHERENT_RAM_END 68*a2847172SGrzegorz Jaszczyk #endif 69*a2847172SGrzegorz Jaszczyk ); 70*a2847172SGrzegorz Jaszczyk enable_mmu_el3(0); 71*a2847172SGrzegorz Jaszczyk } 72*a2847172SGrzegorz Jaszczyk bl1_plat_arch_setup(void)73*a2847172SGrzegorz Jaszczykvoid bl1_plat_arch_setup(void) 74*a2847172SGrzegorz Jaszczyk { 75*a2847172SGrzegorz Jaszczyk marvell_bl1_plat_arch_setup(); 76*a2847172SGrzegorz Jaszczyk } 77*a2847172SGrzegorz Jaszczyk 78*a2847172SGrzegorz Jaszczyk /* 79*a2847172SGrzegorz Jaszczyk * Perform the platform specific architecture setup shared between 80*a2847172SGrzegorz Jaszczyk * MARVELL standard platforms. 81*a2847172SGrzegorz Jaszczyk */ marvell_bl1_platform_setup(void)82*a2847172SGrzegorz Jaszczykvoid marvell_bl1_platform_setup(void) 83*a2847172SGrzegorz Jaszczyk { 84*a2847172SGrzegorz Jaszczyk /* Initialise the IO layer and register platform IO devices */ 85*a2847172SGrzegorz Jaszczyk plat_marvell_io_setup(); 86*a2847172SGrzegorz Jaszczyk } 87*a2847172SGrzegorz Jaszczyk bl1_platform_setup(void)88*a2847172SGrzegorz Jaszczykvoid bl1_platform_setup(void) 89*a2847172SGrzegorz Jaszczyk { 90*a2847172SGrzegorz Jaszczyk marvell_bl1_platform_setup(); 91*a2847172SGrzegorz Jaszczyk } 92*a2847172SGrzegorz Jaszczyk bl1_plat_prepare_exit(entry_point_info_t * ep_info)93*a2847172SGrzegorz Jaszczykvoid bl1_plat_prepare_exit(entry_point_info_t *ep_info) 94*a2847172SGrzegorz Jaszczyk { 95*a2847172SGrzegorz Jaszczyk #ifdef EL3_PAYLOAD_BASE 96*a2847172SGrzegorz Jaszczyk /* 97*a2847172SGrzegorz Jaszczyk * Program the EL3 payload's entry point address into the CPUs mailbox 98*a2847172SGrzegorz Jaszczyk * in order to release secondary CPUs from their holding pen and make 99*a2847172SGrzegorz Jaszczyk * them jump there. 100*a2847172SGrzegorz Jaszczyk */ 101*a2847172SGrzegorz Jaszczyk marvell_program_trusted_mailbox(ep_info->pc); 102*a2847172SGrzegorz Jaszczyk dsbsy(); 103*a2847172SGrzegorz Jaszczyk sev(); 104*a2847172SGrzegorz Jaszczyk #endif 105*a2847172SGrzegorz Jaszczyk } 106