xref: /rk3399_ARM-atf/plat/common/aarch64/platform_helpers.S (revision 64ee263e20611fae9ddf0ee4a8fcfeb6fbc724ae)
14f6ad66aSAchin Gupta/*
20fc50a86SMasahiro Yamada * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
34f6ad66aSAchin Gupta *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
54f6ad66aSAchin Gupta */
64f6ad66aSAchin Gupta
74f6ad66aSAchin Gupta#include <arch.h>
80a30cf54SAndrew Thoelke#include <asm_macros.S>
917cd67d2SJulius Werner#include <console.h>
105f0cdb05SDan Handley#include <platform_def.h>
114f6ad66aSAchin Gupta
124f6ad66aSAchin Gupta	.weak	plat_report_exception
13c67b09bdSSoby Mathew	.weak	plat_crash_console_init
14c67b09bdSSoby Mathew	.weak	plat_crash_console_putc
15801cf93cSAntonio Nino Diaz	.weak	plat_crash_console_flush
1624fb838fSSoby Mathew	.weak	plat_reset_handler
17add40351SSoby Mathew	.weak	plat_disable_acp
18e3f67124SJuan Castillo	.weak	bl1_plat_prepare_exit
191c3ea103SAntonio Nino Diaz	.weak	plat_panic_handler
20*64ee263eSJeenu Viswambharan	.weak	bl31_plat_enable_mmu
21*64ee263eSJeenu Viswambharan	.weak	bl32_plat_enable_mmu
224f6ad66aSAchin Gupta
235c8babcdSSoby Mathew#if !ENABLE_PLAT_COMPAT
245c8babcdSSoby Mathew	.globl	platform_get_core_pos
255c8babcdSSoby Mathew
265c8babcdSSoby Mathew#define MPIDR_RES_BIT_MASK	0xff000000
275c8babcdSSoby Mathew
285c8babcdSSoby Mathew	/* ------------------------------------------------------------------
295c8babcdSSoby Mathew	 *  int platform_get_core_pos(int mpidr)
305c8babcdSSoby Mathew	 *  Returns the CPU index of the CPU specified by mpidr. This is
315c8babcdSSoby Mathew	 *  defined when platform compatibility is disabled to enable Trusted
325c8babcdSSoby Mathew	 *  Firmware components like SPD using the old  platform API to work.
335c8babcdSSoby Mathew	 *  This API is deprecated and it assumes that the mpidr specified is
345c8babcdSSoby Mathew	 *  that of a valid and present CPU. Instead, plat_my_core_pos()
355c8babcdSSoby Mathew	 *  should be used for CPU index of the current CPU and
365c8babcdSSoby Mathew	 *  plat_core_pos_by_mpidr() should be used for CPU index of a
375c8babcdSSoby Mathew	 *  CPU specified by its mpidr.
385c8babcdSSoby Mathew	 * ------------------------------------------------------------------
395c8babcdSSoby Mathew	 */
405c8babcdSSoby Mathewfunc_deprecated platform_get_core_pos
415c8babcdSSoby Mathew	bic	x0, x0, #MPIDR_RES_BIT_MASK
425c8babcdSSoby Mathew	mrs	x1, mpidr_el1
435c8babcdSSoby Mathew	bic	x1, x1, #MPIDR_RES_BIT_MASK
445c8babcdSSoby Mathew	cmp	x0, x1
455c8babcdSSoby Mathew	beq	plat_my_core_pos
465c8babcdSSoby Mathew	b	platform_core_pos_helper
475c8babcdSSoby Mathewendfunc_deprecated platform_get_core_pos
485c8babcdSSoby Mathew#endif
495c8babcdSSoby Mathew
504f6ad66aSAchin Gupta	/* -----------------------------------------------------
514f6ad66aSAchin Gupta	 * Placeholder function which should be redefined by
524f6ad66aSAchin Gupta	 * each platform.
534f6ad66aSAchin Gupta	 * -----------------------------------------------------
544f6ad66aSAchin Gupta	 */
550a30cf54SAndrew Thoelkefunc plat_report_exception
564f6ad66aSAchin Gupta	ret
578b779620SKévin Petitendfunc plat_report_exception
58c67b09bdSSoby Mathew
5917cd67d2SJulius Werner#if MULTI_CONSOLE_API
60c67b09bdSSoby Mathew	/* -----------------------------------------------------
6117cd67d2SJulius Werner	 * int plat_crash_console_init(void)
6217cd67d2SJulius Werner	 * Use normal console by default. Switch it to crash
6317cd67d2SJulius Werner	 * mode so serial consoles become active again.
6417cd67d2SJulius Werner	 * NOTE: This default implementation will only work for
6517cd67d2SJulius Werner	 * crashes that occur after a normal console (marked
6617cd67d2SJulius Werner	 * valid for the crash state) has been registered with
6717cd67d2SJulius Werner	 * the console framework. To debug crashes that occur
6817cd67d2SJulius Werner	 * earlier, the platform has to override these functions
6917cd67d2SJulius Werner	 * with an implementation that initializes a console
7017cd67d2SJulius Werner	 * driver with hardcoded parameters. See
7117cd67d2SJulius Werner	 * docs/porting-guide.rst for more information.
7217cd67d2SJulius Werner	 * -----------------------------------------------------
7317cd67d2SJulius Werner	 */
7417cd67d2SJulius Wernerfunc plat_crash_console_init
7517cd67d2SJulius Werner#if defined(IMAGE_BL1)
7617cd67d2SJulius Werner	/*
7717cd67d2SJulius Werner	 * BL1 code can possibly crash so early that the data segment is not yet
7817cd67d2SJulius Werner	 * accessible. Don't risk undefined behavior by trying to run the normal
7917cd67d2SJulius Werner	 * console framework. Platforms that want to debug BL1 will need to
8017cd67d2SJulius Werner	 * override this with custom functions that can run from registers only.
8117cd67d2SJulius Werner	 */
8217cd67d2SJulius Werner	mov	x0, #0
8317cd67d2SJulius Werner	ret
8417cd67d2SJulius Werner#else	/* IMAGE_BL1 */
8517cd67d2SJulius Werner	mov	x3, x30
8617cd67d2SJulius Werner	mov	x0, #CONSOLE_FLAG_CRASH
8717cd67d2SJulius Werner	bl	console_switch_state
8817cd67d2SJulius Werner	mov	x0, #1
8917cd67d2SJulius Werner	ret	x3
9017cd67d2SJulius Werner#endif
9117cd67d2SJulius Wernerendfunc plat_crash_console_init
9217cd67d2SJulius Werner
9317cd67d2SJulius Werner	/* -----------------------------------------------------
9417cd67d2SJulius Werner	 * void plat_crash_console_putc(int character)
9517cd67d2SJulius Werner	 * Output through the normal console by default.
9617cd67d2SJulius Werner	 * -----------------------------------------------------
9717cd67d2SJulius Werner	 */
9817cd67d2SJulius Wernerfunc plat_crash_console_putc
9917cd67d2SJulius Werner	b	console_putc
10017cd67d2SJulius Wernerendfunc plat_crash_console_putc
10117cd67d2SJulius Werner
10217cd67d2SJulius Werner	/* -----------------------------------------------------
10317cd67d2SJulius Werner	 * void plat_crash_console_flush(void)
10417cd67d2SJulius Werner	 * Flush normal console by default.
10517cd67d2SJulius Werner	 * -----------------------------------------------------
10617cd67d2SJulius Werner	 */
10717cd67d2SJulius Wernerfunc plat_crash_console_flush
10817cd67d2SJulius Werner	b	console_flush
10917cd67d2SJulius Wernerendfunc plat_crash_console_flush
11017cd67d2SJulius Werner
11117cd67d2SJulius Werner#else	/* MULTI_CONSOLE_API */
11217cd67d2SJulius Werner
11317cd67d2SJulius Werner	/* -----------------------------------------------------
11417cd67d2SJulius Werner	 * In the old API these are all no-op stubs that need to
11517cd67d2SJulius Werner	 * be overridden by the platform to be useful.
116c67b09bdSSoby Mathew	 * -----------------------------------------------------
117c67b09bdSSoby Mathew	 */
118c67b09bdSSoby Mathewfunc plat_crash_console_init
119c67b09bdSSoby Mathew	mov	x0, #0
120c67b09bdSSoby Mathew	ret
1218b779620SKévin Petitendfunc plat_crash_console_init
122c67b09bdSSoby Mathew
123c67b09bdSSoby Mathewfunc plat_crash_console_putc
124c67b09bdSSoby Mathew	ret
1258b779620SKévin Petitendfunc plat_crash_console_putc
12624fb838fSSoby Mathew
127801cf93cSAntonio Nino Diazfunc plat_crash_console_flush
128801cf93cSAntonio Nino Diaz	ret
129801cf93cSAntonio Nino Diazendfunc plat_crash_console_flush
13017cd67d2SJulius Werner#endif
131801cf93cSAntonio Nino Diaz
132801cf93cSAntonio Nino Diaz	/* -----------------------------------------------------
133801cf93cSAntonio Nino Diaz	 * Placeholder function which should be redefined by
134240b3140SMasahiro Yamada	 * each platform. This function should preserve x19 - x29.
13524fb838fSSoby Mathew	 * -----------------------------------------------------
13624fb838fSSoby Mathew	 */
13724fb838fSSoby Mathewfunc plat_reset_handler
13824fb838fSSoby Mathew	ret
1398b779620SKévin Petitendfunc plat_reset_handler
140add40351SSoby Mathew
141add40351SSoby Mathew	/* -----------------------------------------------------
142add40351SSoby Mathew	 * Placeholder function which should be redefined by
143add40351SSoby Mathew	 * each platform. This function is allowed to use
144add40351SSoby Mathew	 * registers x0 - x17.
145add40351SSoby Mathew	 * -----------------------------------------------------
146add40351SSoby Mathew	 */
147add40351SSoby Mathewfunc plat_disable_acp
148add40351SSoby Mathew	ret
1498b779620SKévin Petitendfunc plat_disable_acp
150e3f67124SJuan Castillo
151e3f67124SJuan Castillo	/* -----------------------------------------------------
152862b5dc2SSandrine Bailleux	 * void bl1_plat_prepare_exit(entry_point_info_t *ep_info);
153e3f67124SJuan Castillo	 * Called before exiting BL1. Default: do nothing
154e3f67124SJuan Castillo	 * -----------------------------------------------------
155e3f67124SJuan Castillo	 */
156e3f67124SJuan Castillofunc bl1_plat_prepare_exit
157e3f67124SJuan Castillo	ret
158e3f67124SJuan Castilloendfunc bl1_plat_prepare_exit
15940fc6cd1SJuan Castillo
16040fc6cd1SJuan Castillo	/* -----------------------------------------------------
1611c3ea103SAntonio Nino Diaz	 * void plat_panic_handler(void) __dead2;
1621c3ea103SAntonio Nino Diaz	 * Endless loop by default.
1631c3ea103SAntonio Nino Diaz	 * -----------------------------------------------------
1641c3ea103SAntonio Nino Diaz	 */
1651c3ea103SAntonio Nino Diazfunc plat_panic_handler
1668c9e1af0SSandrine Bailleux	wfi
1671c3ea103SAntonio Nino Diaz	b	plat_panic_handler
1681c3ea103SAntonio Nino Diazendfunc plat_panic_handler
169*64ee263eSJeenu Viswambharan
170*64ee263eSJeenu Viswambharan	/* -----------------------------------------------------
171*64ee263eSJeenu Viswambharan	 * void bl31_plat_enable_mmu(uint32_t flags);
172*64ee263eSJeenu Viswambharan	 *
173*64ee263eSJeenu Viswambharan	 * Enable MMU in BL31.
174*64ee263eSJeenu Viswambharan	 * -----------------------------------------------------
175*64ee263eSJeenu Viswambharan	 */
176*64ee263eSJeenu Viswambharanfunc bl31_plat_enable_mmu
177*64ee263eSJeenu Viswambharan	b	enable_mmu_direct_el3
178*64ee263eSJeenu Viswambharanendfunc bl31_plat_enable_mmu
179*64ee263eSJeenu Viswambharan
180*64ee263eSJeenu Viswambharan	/* -----------------------------------------------------
181*64ee263eSJeenu Viswambharan	 * void bl32_plat_enable_mmu(uint32_t flags);
182*64ee263eSJeenu Viswambharan	 *
183*64ee263eSJeenu Viswambharan	 * Enable MMU in BL32.
184*64ee263eSJeenu Viswambharan	 * -----------------------------------------------------
185*64ee263eSJeenu Viswambharan	 */
186*64ee263eSJeenu Viswambharanfunc bl32_plat_enable_mmu
187*64ee263eSJeenu Viswambharan	b	enable_mmu_direct_el1
188*64ee263eSJeenu Viswambharanendfunc bl32_plat_enable_mmu
189