2 * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
9 #include <platform_def.h>
11 #include <arch_helpers.h>
12 #include <common/bl_common.h>
13 #include <common/debug.h>
14 #include <bl31/interrupt_mgmt.h>
15 #include <drivers/console.h>
16 #include <drivers/ti/uart/uart_16550.h>
17 #include <lib/xlat_tables/xlat_tables_v2.h>
20 #include <rpi_shared.h>
22 #define MAP_DEVICE0 MAP_REGION_FLAT(DEVICE0_BASE, \
24 MT_DEVICE | MT_RW | MT_SECURE)
26 #ifdef SHARED_RAM_BASE
27 #define MAP_SHARED_RAM MAP_REGION_FLAT(SHARED_RAM_BASE, \
29 MT_DEVICE | MT_RW | MT_SECURE)
32 #ifdef RPI3_PRELOADED_DTB_BASE
33 #define MAP_NS_DTB MAP_REGION_FLAT(RPI3_PRELOADED_DTB_BASE, 0x10000, \
34 MT_MEMORY | MT_RW | MT_NS)
37 #define MAP_NS_DRAM0 MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE, \
38 MT_MEMORY | MT_RW | MT_NS)
40 #define MAP_FIP MAP_REGION_FLAT(PLAT_RPI3_FIP_BASE, \
41 PLAT_RPI3_FIP_MAX_SIZE, \
42 MT_MEMORY | MT_RO | MT_NS)
44 #define MAP_BL32_MEM MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE, \
45 MT_MEMORY | MT_RW | MT_SECURE)
48 #define MAP_OPTEE_PAGEABLE MAP_REGION_FLAT( \
49 RPI3_OPTEE_PAGEABLE_LOAD_BASE, \
50 RPI3_OPTEE_PAGEABLE_LOAD_SIZE, \
51 MT_MEMORY | MT_RW | MT_SECURE)
55 * Table of regions for various BL stages to map using the MMU.
58 static const mmap_region_t plat_rpi3_mmap
[] = {
72 static const mmap_region_t plat_rpi3_mmap
[] = {
87 static const mmap_region_t plat_rpi3_mmap
[] = {
92 #ifdef RPI3_PRELOADED_DTB_BASE
102 /*******************************************************************************
103 * Function that sets up the console
104 ******************************************************************************/
105 static console_16550_t rpi3_console
;
107 void rpi3_console_init(unsigned int base_clk_rate
)
109 int console_scope
= CONSOLE_FLAG_BOOT
;
110 #if RPI3_RUNTIME_UART != -1
111 console_scope
|= CONSOLE_FLAG_RUNTIME
;
113 int rc
= console_16550_register(PLAT_RPI3_UART_BASE
,
115 PLAT_RPI3_UART_BAUDRATE
,
119 * The crash console doesn't use the multi console API, it uses
120 * the core console functions directly. It is safe to call panic
121 * and let it print debug information.
126 console_set_scope(&rpi3_console
.console
, console_scope
);
129 /*******************************************************************************
130 * Function that sets up the translation tables.
131 ******************************************************************************/
132 void rpi3_setup_page_tables(uintptr_t total_base
, size_t total_size
,
133 uintptr_t code_start
, uintptr_t code_limit
,
134 uintptr_t rodata_start
, uintptr_t rodata_limit
136 , uintptr_t coh_start
, uintptr_t coh_limit
141 * Map the Trusted SRAM with appropriate memory attributes.
142 * Subsequent mappings will adjust the attributes for specific regions.
144 VERBOSE("Trusted SRAM seen by this BL image: %p - %p\n",
145 (void *) total_base
, (void *) (total_base
+ total_size
));
146 mmap_add_region(total_base
, total_base
,
148 MT_MEMORY
| MT_RW
| MT_SECURE
);
150 /* Re-map the code section */
151 VERBOSE("Code region: %p - %p\n",
152 (void *) code_start
, (void *) code_limit
);
153 mmap_add_region(code_start
, code_start
,
154 code_limit
- code_start
,
155 MT_CODE
| MT_SECURE
);
157 /* Re-map the read-only data section */
158 VERBOSE("Read-only data region: %p - %p\n",
159 (void *) rodata_start
, (void *) rodata_limit
);
160 mmap_add_region(rodata_start
, rodata_start
,
161 rodata_limit
- rodata_start
,
162 MT_RO_DATA
| MT_SECURE
);
165 /* Re-map the coherent memory region */
166 VERBOSE("Coherent region: %p - %p\n",
167 (void *) coh_start
, (void *) coh_limit
);
168 mmap_add_region(coh_start
, coh_start
,
169 coh_limit
- coh_start
,
170 MT_DEVICE
| MT_RW
| MT_SECURE
);
173 mmap_add(plat_rpi3_mmap
);
178 /*******************************************************************************
179 * Gets SPSR for BL32 entry
180 ******************************************************************************/
181 uint32_t rpi3_get_spsr_for_bl32_entry(void)
184 * The Secure Payload Dispatcher service is responsible for
185 * setting the SPSR prior to entry into the BL32 image.
190 /*******************************************************************************
191 * Gets SPSR for BL33 entry
192 ******************************************************************************/
193 uint32_t rpi3_get_spsr_for_bl33_entry(void)
195 #if RPI3_BL33_IN_AARCH32
196 INFO("BL33 will boot in Non-secure AArch32 Hypervisor mode\n");
197 return SPSR_MODE32(MODE32_hyp
, SPSR_T_ARM
, SPSR_E_LITTLE
,
198 DISABLE_ALL_EXCEPTIONS
);
200 return SPSR_64(MODE_EL2
, MODE_SP_ELX
, DISABLE_ALL_EXCEPTIONS
);
204 unsigned int plat_get_syscnt_freq2(void)
206 return SYS_COUNTER_FREQ_IN_TICKS
;
209 uint32_t plat_ic_get_pending_interrupt_type(void)
211 ERROR("rpi3: Interrupt routed to EL3.\n");
212 return INTR_TYPE_INVAL
;
215 uint32_t plat_interrupt_type_to_line(uint32_t type
, uint32_t security_state
)
217 assert((type
== INTR_TYPE_S_EL1
) || (type
== INTR_TYPE_EL3
) ||
218 (type
== INTR_TYPE_NS
));
220 assert(sec_state_is_valid(security_state
));
222 /* Non-secure interrupts are signalled on the IRQ line always. */
223 if (type
== INTR_TYPE_NS
)
224 return __builtin_ctz(SCR_IRQ_BIT
);
226 /* Secure interrupts are signalled on the FIQ line always. */
227 return __builtin_ctz(SCR_FIQ_BIT
);