1 /* 2 * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <arch_helpers.h> 8 #include <assert.h> 9 #include <console.h> 10 #include <platform.h> 11 #if RAS_EXTENSION 12 #include <ras.h> 13 #endif 14 #include <xlat_mmu_helpers.h> 15 16 /* 17 * The following platform setup functions are weakly defined. They 18 * provide typical implementations that may be re-used by multiple 19 * platforms but may also be overridden by a platform if required. 20 */ 21 #pragma weak bl31_plat_runtime_setup 22 #if !ERROR_DEPRECATED 23 #pragma weak plat_get_syscnt_freq2 24 #pragma weak bl31_early_platform_setup2 25 #endif /* ERROR_DEPRECATED */ 26 27 #if SDEI_SUPPORT 28 #pragma weak plat_sdei_handle_masked_trigger 29 #pragma weak plat_sdei_validate_entry_point 30 #endif 31 32 #pragma weak plat_ea_handler 33 34 void bl31_plat_runtime_setup(void) 35 { 36 #if MULTI_CONSOLE_API 37 console_switch_state(CONSOLE_FLAG_RUNTIME); 38 #else 39 console_uninit(); 40 #endif 41 } 42 43 /* 44 * Helper function for platform_get_pos() when platform compatibility is 45 * disabled. This is to enable SPDs using the older platform API to continue 46 * to work. 47 */ 48 unsigned int platform_core_pos_helper(unsigned long mpidr) 49 { 50 int idx = plat_core_pos_by_mpidr(mpidr); 51 assert(idx >= 0); 52 return idx; 53 } 54 55 #if !ERROR_DEPRECATED 56 unsigned int plat_get_syscnt_freq2(void) 57 { 58 WARN("plat_get_syscnt_freq() is deprecated\n"); 59 WARN("Please define plat_get_syscnt_freq2()\n"); 60 /* 61 * Suppress deprecated declaration warning in compatibility function 62 */ 63 #pragma GCC diagnostic push 64 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 65 unsigned long long freq = plat_get_syscnt_freq(); 66 #pragma GCC diagnostic pop 67 68 assert(freq >> 32 == 0); 69 70 return (unsigned int)freq; 71 } 72 73 void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 74 u_register_t arg2, u_register_t arg3) 75 { 76 bl31_early_platform_setup((void *) arg0, (void *)arg1); 77 } 78 #endif /* ERROR_DEPRECATED */ 79 80 #if SDEI_SUPPORT 81 /* 82 * Function that handles spurious SDEI interrupts while events are masked. 83 */ 84 void plat_sdei_handle_masked_trigger(uint64_t mpidr, unsigned int intr) 85 { 86 WARN("Spurious SDEI interrupt %u on masked PE %llx\n", intr, mpidr); 87 } 88 89 /* 90 * Default Function to validate SDEI entry point, which returns success. 91 * Platforms may override this with their own validation mechanism. 92 */ 93 int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode) 94 { 95 return 0; 96 } 97 #endif 98 99 /* RAS functions common to AArch64 ARM platforms */ 100 void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie, 101 void *handle, uint64_t flags) 102 { 103 #if RAS_EXTENSION 104 /* Call RAS EA handler */ 105 int handled = ras_ea_handler(ea_reason, syndrome, cookie, handle, flags); 106 if (handled != 0) 107 return; 108 #endif 109 110 ERROR("Unhandled External Abort received on 0x%lx at EL3!\n", 111 read_mpidr_el1()); 112 ERROR(" exception reason=%u syndrome=0x%llx\n", ea_reason, syndrome); 113 panic(); 114 } 115