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
bl2_plat_sec_mem_layout(void)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 */
marvell_bl2_early_platform_setup(meminfo_t * mem_layout)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
bl2_early_platform_setup2(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)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
bl2_platform_setup(void)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 */
marvell_bl2_plat_arch_setup(void)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
bl2_plat_arch_setup(void)93a2847172SGrzegorz Jaszczyk void bl2_plat_arch_setup(void)
94a2847172SGrzegorz Jaszczyk {
95a2847172SGrzegorz Jaszczyk marvell_bl2_plat_arch_setup();
96a2847172SGrzegorz Jaszczyk }
97a2847172SGrzegorz Jaszczyk
marvell_bl2_handle_post_image_load(unsigned int image_id)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 ******************************************************************************/
bl2_plat_handle_post_image_load(unsigned int image_id)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