blob: 033a12f8e94dccb923cac22191cf178ee07b69e9 [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Masahiro Yamada2a4fe4f2018-02-01 18:42:24 +09002 * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta4f6ad662013-10-25 09:08:21 +01005 */
6
7#include <arch.h>
Andrew Thoelke38bde412014-03-18 13:46:55 +00008#include <asm_macros.S>
Julius Werneraae9bb12017-09-18 16:49:48 -07009#include <console.h>
Dan Handleyed6ff952014-05-14 17:44:19 +010010#include <platform_def.h>
Achin Gupta4f6ad662013-10-25 09:08:21 +010011
Achin Gupta4f6ad662013-10-25 09:08:21 +010012 .weak plat_report_exception
Soby Mathew066f7132014-07-14 16:57:23 +010013 .weak plat_crash_console_init
14 .weak plat_crash_console_putc
Antonio Nino Diazd3ec5432017-02-17 17:11:27 +000015 .weak plat_crash_console_flush
Soby Mathewf1785fd2014-08-14 12:22:32 +010016 .weak plat_reset_handler
Soby Mathew8e2f2872014-08-14 12:49:05 +010017 .weak plat_disable_acp
Juan Castillod1413b22015-10-05 16:59:38 +010018 .weak bl1_plat_prepare_exit
Antonio Nino Diaz1f21bcf2016-02-01 13:57:25 +000019 .weak plat_panic_handler
Achin Gupta4f6ad662013-10-25 09:08:21 +010020
Soby Mathew70716d62015-07-13 16:26:11 +010021#if !ENABLE_PLAT_COMPAT
22 .globl platform_get_core_pos
23
24#define MPIDR_RES_BIT_MASK 0xff000000
25
26 /* ------------------------------------------------------------------
27 * int platform_get_core_pos(int mpidr)
28 * Returns the CPU index of the CPU specified by mpidr. This is
29 * defined when platform compatibility is disabled to enable Trusted
30 * Firmware components like SPD using the old platform API to work.
31 * This API is deprecated and it assumes that the mpidr specified is
32 * that of a valid and present CPU. Instead, plat_my_core_pos()
33 * should be used for CPU index of the current CPU and
34 * plat_core_pos_by_mpidr() should be used for CPU index of a
35 * CPU specified by its mpidr.
36 * ------------------------------------------------------------------
37 */
38func_deprecated platform_get_core_pos
39 bic x0, x0, #MPIDR_RES_BIT_MASK
40 mrs x1, mpidr_el1
41 bic x1, x1, #MPIDR_RES_BIT_MASK
42 cmp x0, x1
43 beq plat_my_core_pos
44 b platform_core_pos_helper
45endfunc_deprecated platform_get_core_pos
46#endif
47
Achin Gupta4f6ad662013-10-25 09:08:21 +010048 /* -----------------------------------------------------
Achin Gupta4f6ad662013-10-25 09:08:21 +010049 * Placeholder function which should be redefined by
50 * each platform.
51 * -----------------------------------------------------
52 */
Andrew Thoelke38bde412014-03-18 13:46:55 +000053func plat_report_exception
Achin Gupta4f6ad662013-10-25 09:08:21 +010054 ret
Kévin Petita877c252015-03-24 14:03:57 +000055endfunc plat_report_exception
Soby Mathew066f7132014-07-14 16:57:23 +010056
Julius Werneraae9bb12017-09-18 16:49:48 -070057#if MULTI_CONSOLE_API
Soby Mathew066f7132014-07-14 16:57:23 +010058 /* -----------------------------------------------------
Julius Werneraae9bb12017-09-18 16:49:48 -070059 * int plat_crash_console_init(void)
60 * Use normal console by default. Switch it to crash
61 * mode so serial consoles become active again.
62 * NOTE: This default implementation will only work for
63 * crashes that occur after a normal console (marked
64 * valid for the crash state) has been registered with
65 * the console framework. To debug crashes that occur
66 * earlier, the platform has to override these functions
67 * with an implementation that initializes a console
68 * driver with hardcoded parameters. See
69 * docs/porting-guide.rst for more information.
Soby Mathew066f7132014-07-14 16:57:23 +010070 * -----------------------------------------------------
71 */
72func plat_crash_console_init
Julius Werneraae9bb12017-09-18 16:49:48 -070073#if defined(IMAGE_BL1)
74 /*
75 * BL1 code can possibly crash so early that the data segment is not yet
76 * accessible. Don't risk undefined behavior by trying to run the normal
77 * console framework. Platforms that want to debug BL1 will need to
78 * override this with custom functions that can run from registers only.
79 */
Soby Mathew066f7132014-07-14 16:57:23 +010080 mov x0, #0
81 ret
Julius Werneraae9bb12017-09-18 16:49:48 -070082#else /* IMAGE_BL1 */
83 mov x3, x30
84 mov x0, #CONSOLE_FLAG_CRASH
85 bl console_switch_state
86 mov x0, #1
87 ret x3
88#endif
Kévin Petita877c252015-03-24 14:03:57 +000089endfunc plat_crash_console_init
Soby Mathew066f7132014-07-14 16:57:23 +010090
91 /* -----------------------------------------------------
Julius Werneraae9bb12017-09-18 16:49:48 -070092 * void plat_crash_console_putc(int character)
93 * Output through the normal console by default.
Soby Mathew066f7132014-07-14 16:57:23 +010094 * -----------------------------------------------------
95 */
96func plat_crash_console_putc
Julius Werneraae9bb12017-09-18 16:49:48 -070097 b console_putc
Kévin Petita877c252015-03-24 14:03:57 +000098endfunc plat_crash_console_putc
Soby Mathewf1785fd2014-08-14 12:22:32 +010099
100 /* -----------------------------------------------------
Julius Werneraae9bb12017-09-18 16:49:48 -0700101 * void plat_crash_console_flush(void)
102 * Flush normal console by default.
103 * -----------------------------------------------------
104 */
105func plat_crash_console_flush
106 b console_flush
107endfunc plat_crash_console_flush
108
109#else /* MULTI_CONSOLE_API */
110
111 /* -----------------------------------------------------
112 * In the old API these are all no-op stubs that need to
113 * be overridden by the platform to be useful.
Antonio Nino Diazd3ec5432017-02-17 17:11:27 +0000114 * -----------------------------------------------------
115 */
Julius Werneraae9bb12017-09-18 16:49:48 -0700116func plat_crash_console_init
117 mov x0, #0
118 ret
119endfunc plat_crash_console_init
120
121func plat_crash_console_putc
122 ret
123endfunc plat_crash_console_putc
124
Antonio Nino Diazd3ec5432017-02-17 17:11:27 +0000125func plat_crash_console_flush
126 ret
127endfunc plat_crash_console_flush
Julius Werneraae9bb12017-09-18 16:49:48 -0700128#endif
Antonio Nino Diazd3ec5432017-02-17 17:11:27 +0000129
130 /* -----------------------------------------------------
131 * Placeholder function which should be redefined by
Masahiro Yamada4c165ca2016-09-24 18:07:46 +0900132 * each platform. This function should preserve x19 - x29.
Soby Mathewf1785fd2014-08-14 12:22:32 +0100133 * -----------------------------------------------------
134 */
135func plat_reset_handler
136 ret
Kévin Petita877c252015-03-24 14:03:57 +0000137endfunc plat_reset_handler
Soby Mathew8e2f2872014-08-14 12:49:05 +0100138
139 /* -----------------------------------------------------
140 * Placeholder function which should be redefined by
141 * each platform. This function is allowed to use
142 * registers x0 - x17.
143 * -----------------------------------------------------
144 */
145func plat_disable_acp
146 ret
Kévin Petita877c252015-03-24 14:03:57 +0000147endfunc plat_disable_acp
Juan Castillod1413b22015-10-05 16:59:38 +0100148
149 /* -----------------------------------------------------
Sandrine Bailleux87322b32015-11-10 15:01:57 +0000150 * void bl1_plat_prepare_exit(entry_point_info_t *ep_info);
Juan Castillod1413b22015-10-05 16:59:38 +0100151 * Called before exiting BL1. Default: do nothing
152 * -----------------------------------------------------
153 */
154func bl1_plat_prepare_exit
155 ret
156endfunc bl1_plat_prepare_exit
Juan Castillo26ae5832015-09-25 15:41:14 +0100157
158 /* -----------------------------------------------------
Antonio Nino Diaz1f21bcf2016-02-01 13:57:25 +0000159 * void plat_panic_handler(void) __dead2;
160 * Endless loop by default.
161 * -----------------------------------------------------
162 */
163func plat_panic_handler
Sandrine Bailleux628198b2016-08-18 09:24:40 +0100164 wfi
Antonio Nino Diaz1f21bcf2016-02-01 13:57:25 +0000165 b plat_panic_handler
166endfunc plat_panic_handler