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