xref: /rk3399_ARM-atf/plat/marvell/armada/common/marvell_bl1_setup.c (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
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 Jaszczyk meminfo_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 Jaszczyk void 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 Jaszczyk void 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 Jaszczyk void 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 Jaszczyk void 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 Jaszczyk void 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 Jaszczyk void 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 Jaszczyk void 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