14f2b9848SAndre Przywara /* 2*b5029782SMario Bălănică * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. 34f2b9848SAndre Przywara * 44f2b9848SAndre Przywara * SPDX-License-Identifier: BSD-3-Clause 54f2b9848SAndre Przywara */ 64f2b9848SAndre Przywara 74f2b9848SAndre Przywara #include <assert.h> 84f2b9848SAndre Przywara 94f2b9848SAndre Przywara #include <platform_def.h> 104f2b9848SAndre Przywara 114f2b9848SAndre Przywara #include <arch_helpers.h> 124f2b9848SAndre Przywara #include <common/bl_common.h> 134f2b9848SAndre Przywara #include <common/debug.h> 144f2b9848SAndre Przywara #include <bl31/interrupt_mgmt.h> 154f2b9848SAndre Przywara #include <drivers/console.h> 164f2b9848SAndre Przywara #include <lib/xlat_tables/xlat_tables_v2.h> 174f2b9848SAndre Przywara 184f2b9848SAndre Przywara #include <rpi_hw.h> 194f2b9848SAndre Przywara #include <rpi_shared.h> 204f2b9848SAndre Przywara 214f2b9848SAndre Przywara #define MAP_DEVICE0 MAP_REGION_FLAT(DEVICE0_BASE, \ 224f2b9848SAndre Przywara DEVICE0_SIZE, \ 234f2b9848SAndre Przywara MT_DEVICE | MT_RW | MT_SECURE) 244f2b9848SAndre Przywara 25a95e6415SAndre Przywara #ifdef SHARED_RAM_BASE 264f2b9848SAndre Przywara #define MAP_SHARED_RAM MAP_REGION_FLAT(SHARED_RAM_BASE, \ 274f2b9848SAndre Przywara SHARED_RAM_SIZE, \ 284f2b9848SAndre Przywara MT_DEVICE | MT_RW | MT_SECURE) 29a95e6415SAndre Przywara #endif 304f2b9848SAndre Przywara 314f2b9848SAndre Przywara #ifdef RPI3_PRELOADED_DTB_BASE 324f2b9848SAndre Przywara #define MAP_NS_DTB MAP_REGION_FLAT(RPI3_PRELOADED_DTB_BASE, 0x10000, \ 334f2b9848SAndre Przywara MT_MEMORY | MT_RW | MT_NS) 344f2b9848SAndre Przywara #endif 354f2b9848SAndre Przywara 364f2b9848SAndre Przywara #define MAP_NS_DRAM0 MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE, \ 374f2b9848SAndre Przywara MT_MEMORY | MT_RW | MT_NS) 384f2b9848SAndre Przywara 394f2b9848SAndre Przywara #define MAP_FIP MAP_REGION_FLAT(PLAT_RPI3_FIP_BASE, \ 404f2b9848SAndre Przywara PLAT_RPI3_FIP_MAX_SIZE, \ 414f2b9848SAndre Przywara MT_MEMORY | MT_RO | MT_NS) 424f2b9848SAndre Przywara 434f2b9848SAndre Przywara #define MAP_BL32_MEM MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE, \ 444f2b9848SAndre Przywara MT_MEMORY | MT_RW | MT_SECURE) 454f2b9848SAndre Przywara 464f2b9848SAndre Przywara #ifdef SPD_opteed 474f2b9848SAndre Przywara #define MAP_OPTEE_PAGEABLE MAP_REGION_FLAT( \ 484f2b9848SAndre Przywara RPI3_OPTEE_PAGEABLE_LOAD_BASE, \ 494f2b9848SAndre Przywara RPI3_OPTEE_PAGEABLE_LOAD_SIZE, \ 504f2b9848SAndre Przywara MT_MEMORY | MT_RW | MT_SECURE) 514f2b9848SAndre Przywara #endif 524f2b9848SAndre Przywara 534f2b9848SAndre Przywara /* 544f2b9848SAndre Przywara * Table of regions for various BL stages to map using the MMU. 554f2b9848SAndre Przywara */ 564f2b9848SAndre Przywara #ifdef IMAGE_BL1 574f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = { 58a95e6415SAndre Przywara #ifdef MAP_SHARED_RAM 594f2b9848SAndre Przywara MAP_SHARED_RAM, 60a95e6415SAndre Przywara #endif 614f2b9848SAndre Przywara MAP_DEVICE0, 624f2b9848SAndre Przywara MAP_FIP, 634f2b9848SAndre Przywara #ifdef SPD_opteed 644f2b9848SAndre Przywara MAP_OPTEE_PAGEABLE, 654f2b9848SAndre Przywara #endif 664f2b9848SAndre Przywara {0} 674f2b9848SAndre Przywara }; 684f2b9848SAndre Przywara #endif 694f2b9848SAndre Przywara 704f2b9848SAndre Przywara #ifdef IMAGE_BL2 714f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = { 72a95e6415SAndre Przywara #ifdef MAP_SHARED_RAM 734f2b9848SAndre Przywara MAP_SHARED_RAM, 74a95e6415SAndre Przywara #endif 754f2b9848SAndre Przywara MAP_DEVICE0, 764f2b9848SAndre Przywara MAP_FIP, 774f2b9848SAndre Przywara MAP_NS_DRAM0, 784f2b9848SAndre Przywara #ifdef BL32_BASE 794f2b9848SAndre Przywara MAP_BL32_MEM, 804f2b9848SAndre Przywara #endif 814f2b9848SAndre Przywara {0} 824f2b9848SAndre Przywara }; 834f2b9848SAndre Przywara #endif 844f2b9848SAndre Przywara 854f2b9848SAndre Przywara #ifdef IMAGE_BL31 864f2b9848SAndre Przywara static const mmap_region_t plat_rpi3_mmap[] = { 87a95e6415SAndre Przywara #ifdef MAP_SHARED_RAM 884f2b9848SAndre Przywara MAP_SHARED_RAM, 89a95e6415SAndre Przywara #endif 904f2b9848SAndre Przywara MAP_DEVICE0, 914f2b9848SAndre Przywara #ifdef RPI3_PRELOADED_DTB_BASE 924f2b9848SAndre Przywara MAP_NS_DTB, 934f2b9848SAndre Przywara #endif 944f2b9848SAndre Przywara #ifdef BL32_BASE 954f2b9848SAndre Przywara MAP_BL32_MEM, 964f2b9848SAndre Przywara #endif 974f2b9848SAndre Przywara {0} 984f2b9848SAndre Przywara }; 994f2b9848SAndre Przywara #endif 1004f2b9848SAndre Przywara 1014f2b9848SAndre Przywara /******************************************************************************* 1024f2b9848SAndre Przywara * Function that sets up the console 1034f2b9848SAndre Przywara ******************************************************************************/ 10498964f05SAndre Przywara static console_t rpi3_console; 1054f2b9848SAndre Przywara 106795aefe5SAndre Przywara void rpi3_console_init(void) 1074f2b9848SAndre Przywara { 1084f2b9848SAndre Przywara int console_scope = CONSOLE_FLAG_BOOT; 109795aefe5SAndre Przywara int rc; 110795aefe5SAndre Przywara 111795aefe5SAndre Przywara if (RPI3_RUNTIME_UART != -1) 1124f2b9848SAndre Przywara console_scope |= CONSOLE_FLAG_RUNTIME; 113795aefe5SAndre Przywara 114*b5029782SMario Bălănică rc = rpi3_register_used_uart(&rpi3_console); 115795aefe5SAndre Przywara 1164f2b9848SAndre Przywara if (rc == 0) { 1174f2b9848SAndre Przywara /* 1184f2b9848SAndre Przywara * The crash console doesn't use the multi console API, it uses 1194f2b9848SAndre Przywara * the core console functions directly. It is safe to call panic 1204f2b9848SAndre Przywara * and let it print debug information. 1214f2b9848SAndre Przywara */ 1224f2b9848SAndre Przywara panic(); 1234f2b9848SAndre Przywara } 1244f2b9848SAndre Przywara 12598964f05SAndre Przywara console_set_scope(&rpi3_console, console_scope); 1264f2b9848SAndre Przywara } 1274f2b9848SAndre Przywara 1284f2b9848SAndre Przywara /******************************************************************************* 1294f2b9848SAndre Przywara * Function that sets up the translation tables. 1304f2b9848SAndre Przywara ******************************************************************************/ 1314f2b9848SAndre Przywara void rpi3_setup_page_tables(uintptr_t total_base, size_t total_size, 1324f2b9848SAndre Przywara uintptr_t code_start, uintptr_t code_limit, 1334f2b9848SAndre Przywara uintptr_t rodata_start, uintptr_t rodata_limit 1344f2b9848SAndre Przywara #if USE_COHERENT_MEM 1354f2b9848SAndre Przywara , uintptr_t coh_start, uintptr_t coh_limit 1364f2b9848SAndre Przywara #endif 1374f2b9848SAndre Przywara ) 1384f2b9848SAndre Przywara { 1394f2b9848SAndre Przywara /* 1404f2b9848SAndre Przywara * Map the Trusted SRAM with appropriate memory attributes. 1414f2b9848SAndre Przywara * Subsequent mappings will adjust the attributes for specific regions. 1424f2b9848SAndre Przywara */ 1434f2b9848SAndre Przywara VERBOSE("Trusted SRAM seen by this BL image: %p - %p\n", 1444f2b9848SAndre Przywara (void *) total_base, (void *) (total_base + total_size)); 1454f2b9848SAndre Przywara mmap_add_region(total_base, total_base, 1464f2b9848SAndre Przywara total_size, 1474f2b9848SAndre Przywara MT_MEMORY | MT_RW | MT_SECURE); 1484f2b9848SAndre Przywara 1494f2b9848SAndre Przywara /* Re-map the code section */ 1504f2b9848SAndre Przywara VERBOSE("Code region: %p - %p\n", 1514f2b9848SAndre Przywara (void *) code_start, (void *) code_limit); 1524f2b9848SAndre Przywara mmap_add_region(code_start, code_start, 1534f2b9848SAndre Przywara code_limit - code_start, 1544f2b9848SAndre Przywara MT_CODE | MT_SECURE); 1554f2b9848SAndre Przywara 1564f2b9848SAndre Przywara /* Re-map the read-only data section */ 1574f2b9848SAndre Przywara VERBOSE("Read-only data region: %p - %p\n", 1584f2b9848SAndre Przywara (void *) rodata_start, (void *) rodata_limit); 1594f2b9848SAndre Przywara mmap_add_region(rodata_start, rodata_start, 1604f2b9848SAndre Przywara rodata_limit - rodata_start, 1614f2b9848SAndre Przywara MT_RO_DATA | MT_SECURE); 1624f2b9848SAndre Przywara 1634f2b9848SAndre Przywara #if USE_COHERENT_MEM 1644f2b9848SAndre Przywara /* Re-map the coherent memory region */ 1654f2b9848SAndre Przywara VERBOSE("Coherent region: %p - %p\n", 1664f2b9848SAndre Przywara (void *) coh_start, (void *) coh_limit); 1674f2b9848SAndre Przywara mmap_add_region(coh_start, coh_start, 1684f2b9848SAndre Przywara coh_limit - coh_start, 1694f2b9848SAndre Przywara MT_DEVICE | MT_RW | MT_SECURE); 1704f2b9848SAndre Przywara #endif 1714f2b9848SAndre Przywara 1724f2b9848SAndre Przywara mmap_add(plat_rpi3_mmap); 1734f2b9848SAndre Przywara 1744f2b9848SAndre Przywara init_xlat_tables(); 1754f2b9848SAndre Przywara } 1764f2b9848SAndre Przywara 1774f2b9848SAndre Przywara /******************************************************************************* 1784f2b9848SAndre Przywara * Gets SPSR for BL32 entry 1794f2b9848SAndre Przywara ******************************************************************************/ 1804f2b9848SAndre Przywara uint32_t rpi3_get_spsr_for_bl32_entry(void) 1814f2b9848SAndre Przywara { 1824f2b9848SAndre Przywara /* 1834f2b9848SAndre Przywara * The Secure Payload Dispatcher service is responsible for 1844f2b9848SAndre Przywara * setting the SPSR prior to entry into the BL32 image. 1854f2b9848SAndre Przywara */ 1864f2b9848SAndre Przywara return 0; 1874f2b9848SAndre Przywara } 1884f2b9848SAndre Przywara 1894f2b9848SAndre Przywara /******************************************************************************* 1904f2b9848SAndre Przywara * Gets SPSR for BL33 entry 1914f2b9848SAndre Przywara ******************************************************************************/ 1924f2b9848SAndre Przywara uint32_t rpi3_get_spsr_for_bl33_entry(void) 1934f2b9848SAndre Przywara { 1944f2b9848SAndre Przywara #if RPI3_BL33_IN_AARCH32 1954f2b9848SAndre Przywara INFO("BL33 will boot in Non-secure AArch32 Hypervisor mode\n"); 1964f2b9848SAndre Przywara return SPSR_MODE32(MODE32_hyp, SPSR_T_ARM, SPSR_E_LITTLE, 1974f2b9848SAndre Przywara DISABLE_ALL_EXCEPTIONS); 1984f2b9848SAndre Przywara #else 1994f2b9848SAndre Przywara return SPSR_64(MODE_EL2, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 2004f2b9848SAndre Przywara #endif 2014f2b9848SAndre Przywara } 2024f2b9848SAndre Przywara 2034f2b9848SAndre Przywara unsigned int plat_get_syscnt_freq2(void) 2044f2b9848SAndre Przywara { 2054f2b9848SAndre Przywara return SYS_COUNTER_FREQ_IN_TICKS; 2064f2b9848SAndre Przywara } 2074f2b9848SAndre Przywara 2084f2b9848SAndre Przywara uint32_t plat_ic_get_pending_interrupt_type(void) 2094f2b9848SAndre Przywara { 2104f2b9848SAndre Przywara ERROR("rpi3: Interrupt routed to EL3.\n"); 2114f2b9848SAndre Przywara return INTR_TYPE_INVAL; 2124f2b9848SAndre Przywara } 2134f2b9848SAndre Przywara 2144f2b9848SAndre Przywara uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state) 2154f2b9848SAndre Przywara { 2164f2b9848SAndre Przywara assert((type == INTR_TYPE_S_EL1) || (type == INTR_TYPE_EL3) || 2174f2b9848SAndre Przywara (type == INTR_TYPE_NS)); 2184f2b9848SAndre Przywara 2194f2b9848SAndre Przywara assert(sec_state_is_valid(security_state)); 2204f2b9848SAndre Przywara 2214f2b9848SAndre Przywara /* Non-secure interrupts are signalled on the IRQ line always. */ 2224f2b9848SAndre Przywara if (type == INTR_TYPE_NS) 2234f2b9848SAndre Przywara return __builtin_ctz(SCR_IRQ_BIT); 2244f2b9848SAndre Przywara 2254f2b9848SAndre Przywara /* Secure interrupts are signalled on the FIQ line always. */ 2264f2b9848SAndre Przywara return __builtin_ctz(SCR_FIQ_BIT); 2274f2b9848SAndre Przywara } 228