xref: /rk3399_ARM-atf/plat/rpi/common/rpi3_common.c (revision 4f2b984852556afc3543d90150c46be4aaadbc75)
1*4f2b9848SAndre Przywara /*
2*4f2b9848SAndre Przywara  * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
3*4f2b9848SAndre Przywara  *
4*4f2b9848SAndre Przywara  * SPDX-License-Identifier: BSD-3-Clause
5*4f2b9848SAndre Przywara  */
6*4f2b9848SAndre Przywara 
7*4f2b9848SAndre Przywara #include <assert.h>
8*4f2b9848SAndre Przywara 
9*4f2b9848SAndre Przywara #include <platform_def.h>
10*4f2b9848SAndre Przywara 
11*4f2b9848SAndre Przywara #include <arch_helpers.h>
12*4f2b9848SAndre Przywara #include <common/bl_common.h>
13*4f2b9848SAndre Przywara #include <common/debug.h>
14*4f2b9848SAndre Przywara #include <bl31/interrupt_mgmt.h>
15*4f2b9848SAndre Przywara #include <drivers/console.h>
16*4f2b9848SAndre Przywara #include <drivers/ti/uart/uart_16550.h>
17*4f2b9848SAndre Przywara #include <lib/xlat_tables/xlat_tables_v2.h>
18*4f2b9848SAndre Przywara 
19*4f2b9848SAndre Przywara #include <rpi_hw.h>
20*4f2b9848SAndre Przywara #include <rpi_shared.h>
21*4f2b9848SAndre Przywara 
22*4f2b9848SAndre Przywara #define MAP_DEVICE0	MAP_REGION_FLAT(DEVICE0_BASE,			\
23*4f2b9848SAndre Przywara 					DEVICE0_SIZE,			\
24*4f2b9848SAndre Przywara 					MT_DEVICE | MT_RW | MT_SECURE)
25*4f2b9848SAndre Przywara 
26*4f2b9848SAndre Przywara #define MAP_SHARED_RAM	MAP_REGION_FLAT(SHARED_RAM_BASE,		\
27*4f2b9848SAndre Przywara 					SHARED_RAM_SIZE,		\
28*4f2b9848SAndre Przywara 					MT_DEVICE | MT_RW | MT_SECURE)
29*4f2b9848SAndre Przywara 
30*4f2b9848SAndre Przywara #ifdef RPI3_PRELOADED_DTB_BASE
31*4f2b9848SAndre Przywara #define MAP_NS_DTB	MAP_REGION_FLAT(RPI3_PRELOADED_DTB_BASE, 0x10000, \
32*4f2b9848SAndre Przywara 					MT_MEMORY | MT_RW | MT_NS)
33*4f2b9848SAndre Przywara #endif
34*4f2b9848SAndre Przywara 
35*4f2b9848SAndre Przywara #define MAP_NS_DRAM0	MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE,	\
36*4f2b9848SAndre Przywara 					MT_MEMORY | MT_RW | MT_NS)
37*4f2b9848SAndre Przywara 
38*4f2b9848SAndre Przywara #define MAP_FIP		MAP_REGION_FLAT(PLAT_RPI3_FIP_BASE,		\
39*4f2b9848SAndre Przywara 					PLAT_RPI3_FIP_MAX_SIZE,		\
40*4f2b9848SAndre Przywara 					MT_MEMORY | MT_RO | MT_NS)
41*4f2b9848SAndre Przywara 
42*4f2b9848SAndre Przywara #define MAP_BL32_MEM	MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE,	\
43*4f2b9848SAndre Przywara 					MT_MEMORY | MT_RW | MT_SECURE)
44*4f2b9848SAndre Przywara 
45*4f2b9848SAndre Przywara #ifdef SPD_opteed
46*4f2b9848SAndre Przywara #define MAP_OPTEE_PAGEABLE	MAP_REGION_FLAT(		\
47*4f2b9848SAndre Przywara 				RPI3_OPTEE_PAGEABLE_LOAD_BASE,	\
48*4f2b9848SAndre Przywara 				RPI3_OPTEE_PAGEABLE_LOAD_SIZE,	\
49*4f2b9848SAndre Przywara 				MT_MEMORY | MT_RW | MT_SECURE)
50*4f2b9848SAndre Przywara #endif
51*4f2b9848SAndre Przywara 
52*4f2b9848SAndre Przywara /*
53*4f2b9848SAndre Przywara  * Table of regions for various BL stages to map using the MMU.
54*4f2b9848SAndre Przywara  */
55*4f2b9848SAndre Przywara #ifdef IMAGE_BL1
56*4f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = {
57*4f2b9848SAndre Przywara 	MAP_SHARED_RAM,
58*4f2b9848SAndre Przywara 	MAP_DEVICE0,
59*4f2b9848SAndre Przywara 	MAP_FIP,
60*4f2b9848SAndre Przywara #ifdef SPD_opteed
61*4f2b9848SAndre Przywara 	MAP_OPTEE_PAGEABLE,
62*4f2b9848SAndre Przywara #endif
63*4f2b9848SAndre Przywara 	{0}
64*4f2b9848SAndre Przywara };
65*4f2b9848SAndre Przywara #endif
66*4f2b9848SAndre Przywara 
67*4f2b9848SAndre Przywara #ifdef IMAGE_BL2
68*4f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = {
69*4f2b9848SAndre Przywara 	MAP_SHARED_RAM,
70*4f2b9848SAndre Przywara 	MAP_DEVICE0,
71*4f2b9848SAndre Przywara 	MAP_FIP,
72*4f2b9848SAndre Przywara 	MAP_NS_DRAM0,
73*4f2b9848SAndre Przywara #ifdef BL32_BASE
74*4f2b9848SAndre Przywara 	MAP_BL32_MEM,
75*4f2b9848SAndre Przywara #endif
76*4f2b9848SAndre Przywara 	{0}
77*4f2b9848SAndre Przywara };
78*4f2b9848SAndre Przywara #endif
79*4f2b9848SAndre Przywara 
80*4f2b9848SAndre Przywara #ifdef IMAGE_BL31
81*4f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = {
82*4f2b9848SAndre Przywara 	MAP_SHARED_RAM,
83*4f2b9848SAndre Przywara 	MAP_DEVICE0,
84*4f2b9848SAndre Przywara #ifdef RPI3_PRELOADED_DTB_BASE
85*4f2b9848SAndre Przywara 	MAP_NS_DTB,
86*4f2b9848SAndre Przywara #endif
87*4f2b9848SAndre Przywara #ifdef BL32_BASE
88*4f2b9848SAndre Przywara 	MAP_BL32_MEM,
89*4f2b9848SAndre Przywara #endif
90*4f2b9848SAndre Przywara 	{0}
91*4f2b9848SAndre Przywara };
92*4f2b9848SAndre Przywara #endif
93*4f2b9848SAndre Przywara 
94*4f2b9848SAndre Przywara /*******************************************************************************
95*4f2b9848SAndre Przywara  * Function that sets up the console
96*4f2b9848SAndre Przywara  ******************************************************************************/
97*4f2b9848SAndre Przywara static console_16550_t rpi3_console;
98*4f2b9848SAndre Przywara 
99*4f2b9848SAndre Przywara void rpi3_console_init(void)
100*4f2b9848SAndre Przywara {
101*4f2b9848SAndre Przywara 	int console_scope = CONSOLE_FLAG_BOOT;
102*4f2b9848SAndre Przywara #if RPI3_RUNTIME_UART != -1
103*4f2b9848SAndre Przywara 	console_scope |= CONSOLE_FLAG_RUNTIME;
104*4f2b9848SAndre Przywara #endif
105*4f2b9848SAndre Przywara 	int rc = console_16550_register(PLAT_RPI3_UART_BASE,
106*4f2b9848SAndre Przywara 					PLAT_RPI3_UART_CLK_IN_HZ,
107*4f2b9848SAndre Przywara 					PLAT_RPI3_UART_BAUDRATE,
108*4f2b9848SAndre Przywara 					&rpi3_console);
109*4f2b9848SAndre Przywara 	if (rc == 0) {
110*4f2b9848SAndre Przywara 		/*
111*4f2b9848SAndre Przywara 		 * The crash console doesn't use the multi console API, it uses
112*4f2b9848SAndre Przywara 		 * the core console functions directly. It is safe to call panic
113*4f2b9848SAndre Przywara 		 * and let it print debug information.
114*4f2b9848SAndre Przywara 		 */
115*4f2b9848SAndre Przywara 		panic();
116*4f2b9848SAndre Przywara 	}
117*4f2b9848SAndre Przywara 
118*4f2b9848SAndre Przywara 	console_set_scope(&rpi3_console.console, console_scope);
119*4f2b9848SAndre Przywara }
120*4f2b9848SAndre Przywara 
121*4f2b9848SAndre Przywara /*******************************************************************************
122*4f2b9848SAndre Przywara  * Function that sets up the translation tables.
123*4f2b9848SAndre Przywara  ******************************************************************************/
124*4f2b9848SAndre Przywara void rpi3_setup_page_tables(uintptr_t total_base, size_t total_size,
125*4f2b9848SAndre Przywara 			    uintptr_t code_start, uintptr_t code_limit,
126*4f2b9848SAndre Przywara 			    uintptr_t rodata_start, uintptr_t rodata_limit
127*4f2b9848SAndre Przywara #if USE_COHERENT_MEM
128*4f2b9848SAndre Przywara 			    , uintptr_t coh_start, uintptr_t coh_limit
129*4f2b9848SAndre Przywara #endif
130*4f2b9848SAndre Przywara 			    )
131*4f2b9848SAndre Przywara {
132*4f2b9848SAndre Przywara 	/*
133*4f2b9848SAndre Przywara 	 * Map the Trusted SRAM with appropriate memory attributes.
134*4f2b9848SAndre Przywara 	 * Subsequent mappings will adjust the attributes for specific regions.
135*4f2b9848SAndre Przywara 	 */
136*4f2b9848SAndre Przywara 	VERBOSE("Trusted SRAM seen by this BL image: %p - %p\n",
137*4f2b9848SAndre Przywara 		(void *) total_base, (void *) (total_base + total_size));
138*4f2b9848SAndre Przywara 	mmap_add_region(total_base, total_base,
139*4f2b9848SAndre Przywara 			total_size,
140*4f2b9848SAndre Przywara 			MT_MEMORY | MT_RW | MT_SECURE);
141*4f2b9848SAndre Przywara 
142*4f2b9848SAndre Przywara 	/* Re-map the code section */
143*4f2b9848SAndre Przywara 	VERBOSE("Code region: %p - %p\n",
144*4f2b9848SAndre Przywara 		(void *) code_start, (void *) code_limit);
145*4f2b9848SAndre Przywara 	mmap_add_region(code_start, code_start,
146*4f2b9848SAndre Przywara 			code_limit - code_start,
147*4f2b9848SAndre Przywara 			MT_CODE | MT_SECURE);
148*4f2b9848SAndre Przywara 
149*4f2b9848SAndre Przywara 	/* Re-map the read-only data section */
150*4f2b9848SAndre Przywara 	VERBOSE("Read-only data region: %p - %p\n",
151*4f2b9848SAndre Przywara 		(void *) rodata_start, (void *) rodata_limit);
152*4f2b9848SAndre Przywara 	mmap_add_region(rodata_start, rodata_start,
153*4f2b9848SAndre Przywara 			rodata_limit - rodata_start,
154*4f2b9848SAndre Przywara 			MT_RO_DATA | MT_SECURE);
155*4f2b9848SAndre Przywara 
156*4f2b9848SAndre Przywara #if USE_COHERENT_MEM
157*4f2b9848SAndre Przywara 	/* Re-map the coherent memory region */
158*4f2b9848SAndre Przywara 	VERBOSE("Coherent region: %p - %p\n",
159*4f2b9848SAndre Przywara 		(void *) coh_start, (void *) coh_limit);
160*4f2b9848SAndre Przywara 	mmap_add_region(coh_start, coh_start,
161*4f2b9848SAndre Przywara 			coh_limit - coh_start,
162*4f2b9848SAndre Przywara 			MT_DEVICE | MT_RW | MT_SECURE);
163*4f2b9848SAndre Przywara #endif
164*4f2b9848SAndre Przywara 
165*4f2b9848SAndre Przywara 	mmap_add(plat_rpi3_mmap);
166*4f2b9848SAndre Przywara 
167*4f2b9848SAndre Przywara 	init_xlat_tables();
168*4f2b9848SAndre Przywara }
169*4f2b9848SAndre Przywara 
170*4f2b9848SAndre Przywara /*******************************************************************************
171*4f2b9848SAndre Przywara  * Return entrypoint of BL33.
172*4f2b9848SAndre Przywara  ******************************************************************************/
173*4f2b9848SAndre Przywara uintptr_t plat_get_ns_image_entrypoint(void)
174*4f2b9848SAndre Przywara {
175*4f2b9848SAndre Przywara #ifdef PRELOADED_BL33_BASE
176*4f2b9848SAndre Przywara 	return PRELOADED_BL33_BASE;
177*4f2b9848SAndre Przywara #else
178*4f2b9848SAndre Przywara 	return PLAT_RPI3_NS_IMAGE_OFFSET;
179*4f2b9848SAndre Przywara #endif
180*4f2b9848SAndre Przywara }
181*4f2b9848SAndre Przywara 
182*4f2b9848SAndre Przywara /*******************************************************************************
183*4f2b9848SAndre Przywara  * Gets SPSR for BL32 entry
184*4f2b9848SAndre Przywara  ******************************************************************************/
185*4f2b9848SAndre Przywara uint32_t rpi3_get_spsr_for_bl32_entry(void)
186*4f2b9848SAndre Przywara {
187*4f2b9848SAndre Przywara 	/*
188*4f2b9848SAndre Przywara 	 * The Secure Payload Dispatcher service is responsible for
189*4f2b9848SAndre Przywara 	 * setting the SPSR prior to entry into the BL32 image.
190*4f2b9848SAndre Przywara 	 */
191*4f2b9848SAndre Przywara 	return 0;
192*4f2b9848SAndre Przywara }
193*4f2b9848SAndre Przywara 
194*4f2b9848SAndre Przywara /*******************************************************************************
195*4f2b9848SAndre Przywara  * Gets SPSR for BL33 entry
196*4f2b9848SAndre Przywara  ******************************************************************************/
197*4f2b9848SAndre Przywara uint32_t rpi3_get_spsr_for_bl33_entry(void)
198*4f2b9848SAndre Przywara {
199*4f2b9848SAndre Przywara #if RPI3_BL33_IN_AARCH32
200*4f2b9848SAndre Przywara 	INFO("BL33 will boot in Non-secure AArch32 Hypervisor mode\n");
201*4f2b9848SAndre Przywara 	return SPSR_MODE32(MODE32_hyp, SPSR_T_ARM, SPSR_E_LITTLE,
202*4f2b9848SAndre Przywara 			   DISABLE_ALL_EXCEPTIONS);
203*4f2b9848SAndre Przywara #else
204*4f2b9848SAndre Przywara 	return SPSR_64(MODE_EL2, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
205*4f2b9848SAndre Przywara #endif
206*4f2b9848SAndre Przywara }
207*4f2b9848SAndre Przywara 
208*4f2b9848SAndre Przywara unsigned int plat_get_syscnt_freq2(void)
209*4f2b9848SAndre Przywara {
210*4f2b9848SAndre Przywara 	return SYS_COUNTER_FREQ_IN_TICKS;
211*4f2b9848SAndre Przywara }
212*4f2b9848SAndre Przywara 
213*4f2b9848SAndre Przywara uint32_t plat_ic_get_pending_interrupt_type(void)
214*4f2b9848SAndre Przywara {
215*4f2b9848SAndre Przywara 	ERROR("rpi3: Interrupt routed to EL3.\n");
216*4f2b9848SAndre Przywara 	return INTR_TYPE_INVAL;
217*4f2b9848SAndre Przywara }
218*4f2b9848SAndre Przywara 
219*4f2b9848SAndre Przywara uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state)
220*4f2b9848SAndre Przywara {
221*4f2b9848SAndre Przywara 	assert((type == INTR_TYPE_S_EL1) || (type == INTR_TYPE_EL3) ||
222*4f2b9848SAndre Przywara 	       (type == INTR_TYPE_NS));
223*4f2b9848SAndre Przywara 
224*4f2b9848SAndre Przywara 	assert(sec_state_is_valid(security_state));
225*4f2b9848SAndre Przywara 
226*4f2b9848SAndre Przywara 	/* Non-secure interrupts are signalled on the IRQ line always. */
227*4f2b9848SAndre Przywara 	if (type == INTR_TYPE_NS)
228*4f2b9848SAndre Przywara 		return __builtin_ctz(SCR_IRQ_BIT);
229*4f2b9848SAndre Przywara 
230*4f2b9848SAndre Przywara 	/* Secure interrupts are signalled on the FIQ line always. */
231*4f2b9848SAndre Przywara 	return  __builtin_ctz(SCR_FIQ_BIT);
232*4f2b9848SAndre Przywara }
233