blob: a74816b77f19590bde8e8e820042dd6ca63f4007 [file] [log] [blame]
Konstantin Porotchkinf69ec582018-06-07 18:31:14 +03001/*
2 * Copyright (C) 2018 Marvell International Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 * https://spdx.org/licenses
6 */
7
8#include <arch.h>
9#include <assert.h>
10#include <console.h>
11#include <debug.h>
12#include <marvell_def.h>
13#include <marvell_plat_priv.h>
14#include <plat_marvell.h>
15#include <platform.h>
16
17#ifdef USE_CCI
18#include <cci.h>
19#endif
20
21/*
22 * The next 3 constants identify the extents of the code, RO data region and the
23 * limit of the BL31 image. These addresses are used by the MMU setup code and
24 * therefore they must be page-aligned. It is the responsibility of the linker
25 * script to ensure that __RO_START__, __RO_END__ & __BL31_END__ linker symbols
26 * refer to page-aligned addresses.
27 */
28#define BL31_END (unsigned long)(&__BL31_END__)
29
30/*
31 * Placeholder variables for copying the arguments that have been passed to
32 * BL31 from BL2.
33 */
34static entry_point_info_t bl32_image_ep_info;
35static entry_point_info_t bl33_image_ep_info;
36
37/* Weak definitions may be overridden in specific ARM standard platform */
38#pragma weak bl31_early_platform_setup
39#pragma weak bl31_platform_setup
40#pragma weak bl31_plat_arch_setup
41#pragma weak bl31_plat_get_next_image_ep_info
42#pragma weak plat_get_syscnt_freq2
43
44/*****************************************************************************
45 * Return a pointer to the 'entry_point_info' structure of the next image for
46 * the security state specified. BL33 corresponds to the non-secure image type
47 * while BL32 corresponds to the secure image type. A NULL pointer is returned
48 * if the image does not exist.
49 *****************************************************************************
50 */
51entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
52{
53 entry_point_info_t *next_image_info;
54
55 assert(sec_state_is_valid(type));
56 next_image_info = (type == NON_SECURE)
57 ? &bl33_image_ep_info : &bl32_image_ep_info;
58
59 return next_image_info;
60}
61
62/*****************************************************************************
63 * Perform any BL31 early platform setup common to ARM standard platforms.
64 * Here is an opportunity to copy parameters passed by the calling EL (S-EL1
65 * in BL2 & S-EL3 in BL1) before they are lost (potentially). This needs to be
66 * done before the MMU is initialized so that the memory layout can be used
67 * while creating page tables. BL2 has flushed this information to memory, so
68 * we are guaranteed to pick up good data.
69 *****************************************************************************
70 */
71void marvell_bl31_early_platform_setup(bl31_params_t *from_bl2,
72 void *plat_params_from_bl2)
73{
74 /* Initialize the console to provide early debug support */
75 console_init(PLAT_MARVELL_BOOT_UART_BASE,
76 PLAT_MARVELL_BOOT_UART_CLK_IN_HZ,
77 MARVELL_CONSOLE_BAUDRATE);
78
79#if RESET_TO_BL31
80 /* There are no parameters from BL2 if BL31 is a reset vector */
81 assert(from_bl2 == NULL);
82 assert(plat_params_from_bl2 == NULL);
83
84#ifdef BL32_BASE
85 /* Populate entry point information for BL32 */
86 SET_PARAM_HEAD(&bl32_image_ep_info,
87 PARAM_EP,
88 VERSION_1,
89 0);
90 SET_SECURITY_STATE(bl32_image_ep_info.h.attr, SECURE);
91 bl32_image_ep_info.pc = BL32_BASE;
92 bl32_image_ep_info.spsr = marvell_get_spsr_for_bl32_entry();
93#endif /* BL32_BASE */
94
95 /* Populate entry point information for BL33 */
96 SET_PARAM_HEAD(&bl33_image_ep_info,
97 PARAM_EP,
98 VERSION_1,
99 0);
100 /*
101 * Tell BL31 where the non-trusted software image
102 * is located and the entry state information
103 */
104 bl33_image_ep_info.pc = plat_get_ns_image_entrypoint();
105 bl33_image_ep_info.spsr = marvell_get_spsr_for_bl33_entry();
106 SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
107
108#else
109 /*
110 * Check params passed from BL2 should not be NULL,
111 */
112 assert(from_bl2 != NULL);
113 assert(from_bl2->h.type == PARAM_BL31);
114 assert(from_bl2->h.version >= VERSION_1);
115 /*
116 * In debug builds, we pass a special value in 'plat_params_from_bl2'
117 * to verify platform parameters from BL2 to BL31.
118 * In release builds, it's not used.
119 */
120 assert(((unsigned long long)plat_params_from_bl2) ==
121 MARVELL_BL31_PLAT_PARAM_VAL);
122
123 /*
124 * Copy BL32 (if populated by BL2) and BL33 entry point information.
125 * They are stored in Secure RAM, in BL2's address space.
126 */
127 if (from_bl2->bl32_ep_info)
128 bl32_image_ep_info = *from_bl2->bl32_ep_info;
129 bl33_image_ep_info = *from_bl2->bl33_ep_info;
130#endif
131}
132
133void bl31_early_platform_setup(bl31_params_t *from_bl2,
134 void *plat_params_from_bl2)
135{
136 marvell_bl31_early_platform_setup(from_bl2, plat_params_from_bl2);
137
138#ifdef USE_CCI
139 /*
140 * Initialize CCI for this cluster during cold boot.
141 * No need for locks as no other CPU is active.
142 */
143 plat_marvell_interconnect_init();
144
145 /*
146 * Enable CCI coherency for the primary CPU's cluster.
147 * Platform specific PSCI code will enable coherency for other
148 * clusters.
149 */
150 plat_marvell_interconnect_enter_coherency();
151#endif
152}
153
154/*****************************************************************************
155 * Perform any BL31 platform setup common to ARM standard platforms
156 *****************************************************************************
157 */
158void marvell_bl31_platform_setup(void)
159{
160 /* Initialize the GIC driver, cpu and distributor interfaces */
161 plat_marvell_gic_driver_init();
162 plat_marvell_gic_init();
163
164 /* For Armada-8k-plus family, the SoC includes more than
165 * a single AP die, but the default die that boots is AP #0.
166 * For other families there is only one die (#0).
167 * Initialize psci arch from die 0
168 */
169 marvell_psci_arch_init(0);
170}
171
172/*****************************************************************************
173 * Perform any BL31 platform runtime setup prior to BL31 exit common to ARM
174 * standard platforms
175 *****************************************************************************
176 */
177void marvell_bl31_plat_runtime_setup(void)
178{
179 /* Initialize the runtime console */
180 console_init(PLAT_MARVELL_BL31_RUN_UART_BASE,
181 PLAT_MARVELL_BL31_RUN_UART_CLK_IN_HZ,
182 MARVELL_CONSOLE_BAUDRATE);
183}
184
185void bl31_platform_setup(void)
186{
187 marvell_bl31_platform_setup();
188}
189
190void bl31_plat_runtime_setup(void)
191{
192 marvell_bl31_plat_runtime_setup();
193}
194
195/*****************************************************************************
196 * Perform the very early platform specific architectural setup shared between
197 * ARM standard platforms. This only does basic initialization. Later
198 * architectural setup (bl31_arch_setup()) does not do anything platform
199 * specific.
200 *****************************************************************************
201 */
202void marvell_bl31_plat_arch_setup(void)
203{
204 marvell_setup_page_tables(BL31_BASE,
205 BL31_END - BL31_BASE,
206 BL_CODE_BASE,
207 BL_CODE_END,
208 BL_RO_DATA_BASE,
209 BL_RO_DATA_END
210#if USE_COHERENT_MEM
211 , BL_COHERENT_RAM_BASE,
212 BL_COHERENT_RAM_END
213#endif
214 );
215
216#if BL31_CACHE_DISABLE
217 enable_mmu_el3(DISABLE_DCACHE);
218 INFO("Cache is disabled in BL3\n");
219#else
220 enable_mmu_el3(0);
221#endif
222}
223
224void bl31_plat_arch_setup(void)
225{
226 marvell_bl31_plat_arch_setup();
227}
228
229unsigned int plat_get_syscnt_freq2(void)
230{
231 return PLAT_REF_CLK_IN_HZ;
232}