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