xref: /rk3399_ARM-atf/plat/hisilicon/poplar/bl2_plat_setup.c (revision e35d0edbbf5f55f2da5fa54ab5518149c18de622)
1*e35d0edbSJorge Ramirez-Ortiz /*
2*e35d0edbSJorge Ramirez-Ortiz  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*e35d0edbSJorge Ramirez-Ortiz  *
4*e35d0edbSJorge Ramirez-Ortiz  * SPDX-License-Identifier: BSD-3-Clause
5*e35d0edbSJorge Ramirez-Ortiz  */
6*e35d0edbSJorge Ramirez-Ortiz 
7*e35d0edbSJorge Ramirez-Ortiz #include <arch_helpers.h>
8*e35d0edbSJorge Ramirez-Ortiz #include <assert.h>
9*e35d0edbSJorge Ramirez-Ortiz #include <bl_common.h>
10*e35d0edbSJorge Ramirez-Ortiz #include <console.h>
11*e35d0edbSJorge Ramirez-Ortiz #include <debug.h>
12*e35d0edbSJorge Ramirez-Ortiz #include <errno.h>
13*e35d0edbSJorge Ramirez-Ortiz #include <generic_delay_timer.h>
14*e35d0edbSJorge Ramirez-Ortiz #include <mmio.h>
15*e35d0edbSJorge Ramirez-Ortiz #include <partition/partition.h>
16*e35d0edbSJorge Ramirez-Ortiz #include <platform.h>
17*e35d0edbSJorge Ramirez-Ortiz #include <string.h>
18*e35d0edbSJorge Ramirez-Ortiz #include "hi3798cv200.h"
19*e35d0edbSJorge Ramirez-Ortiz #include "plat_private.h"
20*e35d0edbSJorge Ramirez-Ortiz 
21*e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for code and read only data sections */
22*e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_BASE	(unsigned long)(&__RO_START__)
23*e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_LIMIT	(unsigned long)(&__RO_END__)
24*e35d0edbSJorge Ramirez-Ortiz 
25*e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for coherent memory section */
26*e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_BASE	(unsigned long)(&__COHERENT_RAM_START__)
27*e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_LIMIT	(unsigned long)(&__COHERENT_RAM_END__)
28*e35d0edbSJorge Ramirez-Ortiz 
29*e35d0edbSJorge Ramirez-Ortiz typedef struct bl2_to_bl31_params_mem {
30*e35d0edbSJorge Ramirez-Ortiz 	bl31_params_t		bl31_params;
31*e35d0edbSJorge Ramirez-Ortiz 	image_info_t		bl31_image_info;
32*e35d0edbSJorge Ramirez-Ortiz 	image_info_t		bl33_image_info;
33*e35d0edbSJorge Ramirez-Ortiz 	entry_point_info_t	bl33_ep_info;
34*e35d0edbSJorge Ramirez-Ortiz 	entry_point_info_t	bl31_ep_info;
35*e35d0edbSJorge Ramirez-Ortiz } bl2_to_bl31_params_mem_t;
36*e35d0edbSJorge Ramirez-Ortiz 
37*e35d0edbSJorge Ramirez-Ortiz static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE);
38*e35d0edbSJorge Ramirez-Ortiz static bl2_to_bl31_params_mem_t bl31_params_mem;
39*e35d0edbSJorge Ramirez-Ortiz 
40*e35d0edbSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void)
41*e35d0edbSJorge Ramirez-Ortiz {
42*e35d0edbSJorge Ramirez-Ortiz 	return &bl2_tzram_layout;
43*e35d0edbSJorge Ramirez-Ortiz }
44*e35d0edbSJorge Ramirez-Ortiz 
45*e35d0edbSJorge Ramirez-Ortiz bl31_params_t *bl2_plat_get_bl31_params(void)
46*e35d0edbSJorge Ramirez-Ortiz {
47*e35d0edbSJorge Ramirez-Ortiz 	bl31_params_t *bl2_to_bl31_params = NULL;
48*e35d0edbSJorge Ramirez-Ortiz 
49*e35d0edbSJorge Ramirez-Ortiz 	/*
50*e35d0edbSJorge Ramirez-Ortiz 	 * Initialise the memory for all the arguments that needs to
51*e35d0edbSJorge Ramirez-Ortiz 	 * be passed to BL3-1
52*e35d0edbSJorge Ramirez-Ortiz 	 */
53*e35d0edbSJorge Ramirez-Ortiz 	memset(&bl31_params_mem, 0, sizeof(bl2_to_bl31_params_mem_t));
54*e35d0edbSJorge Ramirez-Ortiz 
55*e35d0edbSJorge Ramirez-Ortiz 	/* Assign memory for TF related information */
56*e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params = &bl31_params_mem.bl31_params;
57*e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0);
58*e35d0edbSJorge Ramirez-Ortiz 
59*e35d0edbSJorge Ramirez-Ortiz 	/* Fill BL3-1 related information */
60*e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info;
61*e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info,
62*e35d0edbSJorge Ramirez-Ortiz 		       PARAM_IMAGE_BINARY, VERSION_1, 0);
63*e35d0edbSJorge Ramirez-Ortiz 
64*e35d0edbSJorge Ramirez-Ortiz 	/* Fill BL3-3 related information */
65*e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info;
66*e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info,
67*e35d0edbSJorge Ramirez-Ortiz 		       PARAM_EP, VERSION_1, 0);
68*e35d0edbSJorge Ramirez-Ortiz 
69*e35d0edbSJorge Ramirez-Ortiz 	/* BL3-3 expects to receive the primary CPU MPID (through x0) */
70*e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_ep_info->args.arg0 = 0xffff & read_mpidr();
71*e35d0edbSJorge Ramirez-Ortiz 
72*e35d0edbSJorge Ramirez-Ortiz 	bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info;
73*e35d0edbSJorge Ramirez-Ortiz 	SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info,
74*e35d0edbSJorge Ramirez-Ortiz 		       PARAM_IMAGE_BINARY, VERSION_1, 0);
75*e35d0edbSJorge Ramirez-Ortiz 
76*e35d0edbSJorge Ramirez-Ortiz 	return bl2_to_bl31_params;
77*e35d0edbSJorge Ramirez-Ortiz }
78*e35d0edbSJorge Ramirez-Ortiz 
79*e35d0edbSJorge Ramirez-Ortiz struct entry_point_info *bl2_plat_get_bl31_ep_info(void)
80*e35d0edbSJorge Ramirez-Ortiz {
81*e35d0edbSJorge Ramirez-Ortiz 	return &bl31_params_mem.bl31_ep_info;
82*e35d0edbSJorge Ramirez-Ortiz }
83*e35d0edbSJorge Ramirez-Ortiz 
84*e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl31_ep_info(image_info_t *image,
85*e35d0edbSJorge Ramirez-Ortiz 			       entry_point_info_t *bl31_ep_info)
86*e35d0edbSJorge Ramirez-Ortiz {
87*e35d0edbSJorge Ramirez-Ortiz 	SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE);
88*e35d0edbSJorge Ramirez-Ortiz 	bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
89*e35d0edbSJorge Ramirez-Ortiz 				     DISABLE_ALL_EXCEPTIONS);
90*e35d0edbSJorge Ramirez-Ortiz }
91*e35d0edbSJorge Ramirez-Ortiz 
92*e35d0edbSJorge Ramirez-Ortiz static uint32_t hisi_get_spsr_for_bl33_entry(void)
93*e35d0edbSJorge Ramirez-Ortiz {
94*e35d0edbSJorge Ramirez-Ortiz 	unsigned long el_status;
95*e35d0edbSJorge Ramirez-Ortiz 	unsigned int mode;
96*e35d0edbSJorge Ramirez-Ortiz 	uint32_t spsr;
97*e35d0edbSJorge Ramirez-Ortiz 
98*e35d0edbSJorge Ramirez-Ortiz 	/* Figure out what mode we enter the non-secure world in */
99*e35d0edbSJorge Ramirez-Ortiz 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
100*e35d0edbSJorge Ramirez-Ortiz 	el_status &= ID_AA64PFR0_ELX_MASK;
101*e35d0edbSJorge Ramirez-Ortiz 
102*e35d0edbSJorge Ramirez-Ortiz 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
103*e35d0edbSJorge Ramirez-Ortiz 
104*e35d0edbSJorge Ramirez-Ortiz 	/*
105*e35d0edbSJorge Ramirez-Ortiz 	 * TODO: Consider the possibility of specifying the SPSR in
106*e35d0edbSJorge Ramirez-Ortiz 	 * the FIP ToC and allowing the platform to have a say as
107*e35d0edbSJorge Ramirez-Ortiz 	 * well.
108*e35d0edbSJorge Ramirez-Ortiz 	 */
109*e35d0edbSJorge Ramirez-Ortiz 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
110*e35d0edbSJorge Ramirez-Ortiz 	return spsr;
111*e35d0edbSJorge Ramirez-Ortiz }
112*e35d0edbSJorge Ramirez-Ortiz 
113*e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl33_ep_info(image_info_t *image,
114*e35d0edbSJorge Ramirez-Ortiz 			       entry_point_info_t *bl33_ep_info)
115*e35d0edbSJorge Ramirez-Ortiz {
116*e35d0edbSJorge Ramirez-Ortiz 	SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE);
117*e35d0edbSJorge Ramirez-Ortiz 	bl33_ep_info->spsr = hisi_get_spsr_for_bl33_entry();
118*e35d0edbSJorge Ramirez-Ortiz 	bl33_ep_info->args.arg2 = image->image_size;
119*e35d0edbSJorge Ramirez-Ortiz }
120*e35d0edbSJorge Ramirez-Ortiz 
121*e35d0edbSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void)
122*e35d0edbSJorge Ramirez-Ortiz {
123*e35d0edbSJorge Ramirez-Ortiz 	flush_dcache_range((unsigned long)&bl31_params_mem,
124*e35d0edbSJorge Ramirez-Ortiz 			   sizeof(bl2_to_bl31_params_mem_t));
125*e35d0edbSJorge Ramirez-Ortiz }
126*e35d0edbSJorge Ramirez-Ortiz 
127*e35d0edbSJorge Ramirez-Ortiz void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo)
128*e35d0edbSJorge Ramirez-Ortiz {
129*e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->total_base = DDR_BASE;
130*e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->total_size = DDR_SIZE;
131*e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->free_base  = DDR_BASE;
132*e35d0edbSJorge Ramirez-Ortiz 	bl33_meminfo->free_size  = DDR_SIZE;
133*e35d0edbSJorge Ramirez-Ortiz }
134*e35d0edbSJorge Ramirez-Ortiz 
135*e35d0edbSJorge Ramirez-Ortiz void bl2_early_platform_setup(meminfo_t *mem_layout)
136*e35d0edbSJorge Ramirez-Ortiz {
137*e35d0edbSJorge Ramirez-Ortiz 	console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE);
138*e35d0edbSJorge Ramirez-Ortiz 
139*e35d0edbSJorge Ramirez-Ortiz 	/* Enable arch timer */
140*e35d0edbSJorge Ramirez-Ortiz 	generic_delay_timer_init();
141*e35d0edbSJorge Ramirez-Ortiz 
142*e35d0edbSJorge Ramirez-Ortiz 	bl2_tzram_layout = *mem_layout;
143*e35d0edbSJorge Ramirez-Ortiz }
144*e35d0edbSJorge Ramirez-Ortiz 
145*e35d0edbSJorge Ramirez-Ortiz void bl2_plat_arch_setup(void)
146*e35d0edbSJorge Ramirez-Ortiz {
147*e35d0edbSJorge Ramirez-Ortiz 	plat_configure_mmu_el1(bl2_tzram_layout.total_base,
148*e35d0edbSJorge Ramirez-Ortiz 			       bl2_tzram_layout.total_size,
149*e35d0edbSJorge Ramirez-Ortiz 			       BL2_RO_BASE,
150*e35d0edbSJorge Ramirez-Ortiz 			       BL2_RO_LIMIT,
151*e35d0edbSJorge Ramirez-Ortiz 			       BL2_COHERENT_RAM_BASE,
152*e35d0edbSJorge Ramirez-Ortiz 			       BL2_COHERENT_RAM_LIMIT);
153*e35d0edbSJorge Ramirez-Ortiz }
154*e35d0edbSJorge Ramirez-Ortiz 
155*e35d0edbSJorge Ramirez-Ortiz void bl2_platform_setup(void)
156*e35d0edbSJorge Ramirez-Ortiz {
157*e35d0edbSJorge Ramirez-Ortiz 	plat_io_setup();
158*e35d0edbSJorge Ramirez-Ortiz }
159*e35d0edbSJorge Ramirez-Ortiz 
160*e35d0edbSJorge Ramirez-Ortiz unsigned long plat_get_ns_image_entrypoint(void)
161*e35d0edbSJorge Ramirez-Ortiz {
162*e35d0edbSJorge Ramirez-Ortiz 	return PLAT_ARM_NS_IMAGE_OFFSET;
163*e35d0edbSJorge Ramirez-Ortiz }
164