1/* 2 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#include <arch.h> 8#include <asm_macros.S> 9#include <console.h> 10#include <platform_def.h> 11 12 .weak plat_report_exception 13 .weak plat_crash_console_init 14 .weak plat_crash_console_putc 15 .weak plat_crash_console_flush 16 .weak plat_reset_handler 17 .weak plat_disable_acp 18 .weak bl1_plat_prepare_exit 19 .weak plat_panic_handler 20 .weak bl31_plat_enable_mmu 21 .weak bl32_plat_enable_mmu 22 23 .weak plat_handle_uncontainable_ea 24 25#if !ENABLE_PLAT_COMPAT 26 .globl platform_get_core_pos 27 28#define MPIDR_RES_BIT_MASK 0xff000000 29 30 /* ------------------------------------------------------------------ 31 * int platform_get_core_pos(int mpidr) 32 * Returns the CPU index of the CPU specified by mpidr. This is 33 * defined when platform compatibility is disabled to enable Trusted 34 * Firmware components like SPD using the old platform API to work. 35 * This API is deprecated and it assumes that the mpidr specified is 36 * that of a valid and present CPU. Instead, plat_my_core_pos() 37 * should be used for CPU index of the current CPU and 38 * plat_core_pos_by_mpidr() should be used for CPU index of a 39 * CPU specified by its mpidr. 40 * ------------------------------------------------------------------ 41 */ 42func_deprecated platform_get_core_pos 43 bic x0, x0, #MPIDR_RES_BIT_MASK 44 mrs x1, mpidr_el1 45 bic x1, x1, #MPIDR_RES_BIT_MASK 46 cmp x0, x1 47 beq plat_my_core_pos 48 b platform_core_pos_helper 49endfunc_deprecated platform_get_core_pos 50#endif 51 52 /* ----------------------------------------------------- 53 * Placeholder function which should be redefined by 54 * each platform. 55 * ----------------------------------------------------- 56 */ 57func plat_report_exception 58 ret 59endfunc plat_report_exception 60 61#if MULTI_CONSOLE_API 62 /* ----------------------------------------------------- 63 * int plat_crash_console_init(void) 64 * Use normal console by default. Switch it to crash 65 * mode so serial consoles become active again. 66 * NOTE: This default implementation will only work for 67 * crashes that occur after a normal console (marked 68 * valid for the crash state) has been registered with 69 * the console framework. To debug crashes that occur 70 * earlier, the platform has to override these functions 71 * with an implementation that initializes a console 72 * driver with hardcoded parameters. See 73 * docs/porting-guide.rst for more information. 74 * ----------------------------------------------------- 75 */ 76func plat_crash_console_init 77#if defined(IMAGE_BL1) 78 /* 79 * BL1 code can possibly crash so early that the data segment is not yet 80 * accessible. Don't risk undefined behavior by trying to run the normal 81 * console framework. Platforms that want to debug BL1 will need to 82 * override this with custom functions that can run from registers only. 83 */ 84 mov x0, #0 85 ret 86#else /* IMAGE_BL1 */ 87 mov x3, x30 88 mov x0, #CONSOLE_FLAG_CRASH 89 bl console_switch_state 90 mov x0, #1 91 ret x3 92#endif 93endfunc plat_crash_console_init 94 95 /* ----------------------------------------------------- 96 * void plat_crash_console_putc(int character) 97 * Output through the normal console by default. 98 * ----------------------------------------------------- 99 */ 100func plat_crash_console_putc 101 b console_putc 102endfunc plat_crash_console_putc 103 104 /* ----------------------------------------------------- 105 * void plat_crash_console_flush(void) 106 * Flush normal console by default. 107 * ----------------------------------------------------- 108 */ 109func plat_crash_console_flush 110 b console_flush 111endfunc plat_crash_console_flush 112 113#else /* MULTI_CONSOLE_API */ 114 115 /* ----------------------------------------------------- 116 * In the old API these are all no-op stubs that need to 117 * be overridden by the platform to be useful. 118 * ----------------------------------------------------- 119 */ 120func plat_crash_console_init 121 mov x0, #0 122 ret 123endfunc plat_crash_console_init 124 125func plat_crash_console_putc 126 ret 127endfunc plat_crash_console_putc 128 129func plat_crash_console_flush 130 ret 131endfunc plat_crash_console_flush 132#endif 133 134 /* ----------------------------------------------------- 135 * Placeholder function which should be redefined by 136 * each platform. This function should preserve x19 - x29. 137 * ----------------------------------------------------- 138 */ 139func plat_reset_handler 140 ret 141endfunc plat_reset_handler 142 143 /* ----------------------------------------------------- 144 * Placeholder function which should be redefined by 145 * each platform. This function is allowed to use 146 * registers x0 - x17. 147 * ----------------------------------------------------- 148 */ 149func plat_disable_acp 150 ret 151endfunc plat_disable_acp 152 153 /* ----------------------------------------------------- 154 * void bl1_plat_prepare_exit(entry_point_info_t *ep_info); 155 * Called before exiting BL1. Default: do nothing 156 * ----------------------------------------------------- 157 */ 158func bl1_plat_prepare_exit 159 ret 160endfunc bl1_plat_prepare_exit 161 162 /* ----------------------------------------------------- 163 * void plat_panic_handler(void) __dead2; 164 * Endless loop by default. 165 * ----------------------------------------------------- 166 */ 167func plat_panic_handler 168 wfi 169 b plat_panic_handler 170endfunc plat_panic_handler 171 172 /* ----------------------------------------------------- 173 * void bl31_plat_enable_mmu(uint32_t flags); 174 * 175 * Enable MMU in BL31. 176 * ----------------------------------------------------- 177 */ 178func bl31_plat_enable_mmu 179 b enable_mmu_direct_el3 180endfunc bl31_plat_enable_mmu 181 182 /* ----------------------------------------------------- 183 * void bl32_plat_enable_mmu(uint32_t flags); 184 * 185 * Enable MMU in BL32. 186 * ----------------------------------------------------- 187 */ 188func bl32_plat_enable_mmu 189 b enable_mmu_direct_el1 190endfunc bl32_plat_enable_mmu 191 192 193 /* ----------------------------------------------------- 194 * Platform handler for Uncontainable External Abort. 195 * 196 * x0: EA reason 197 * x1: EA syndrome 198 * ----------------------------------------------------- 199 */ 200func plat_handle_uncontainable_ea 201 b report_unhandled_exception 202endfunc plat_handle_uncontainable_ea 203