xref: /rk3399_ARM-atf/plat/common/aarch64/platform_helpers.S (revision 0fc50a86c1faeb8ffd42d6c1a121243595fb9143)
14f6ad66aSAchin Gupta/*
2*0fc50a86SMasahiro 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
204f6ad66aSAchin Gupta
215c8babcdSSoby Mathew#if !ENABLE_PLAT_COMPAT
225c8babcdSSoby Mathew	.globl	platform_get_core_pos
235c8babcdSSoby Mathew
245c8babcdSSoby Mathew#define MPIDR_RES_BIT_MASK	0xff000000
255c8babcdSSoby Mathew
265c8babcdSSoby Mathew	/* ------------------------------------------------------------------
275c8babcdSSoby Mathew	 *  int platform_get_core_pos(int mpidr)
285c8babcdSSoby Mathew	 *  Returns the CPU index of the CPU specified by mpidr. This is
295c8babcdSSoby Mathew	 *  defined when platform compatibility is disabled to enable Trusted
305c8babcdSSoby Mathew	 *  Firmware components like SPD using the old  platform API to work.
315c8babcdSSoby Mathew	 *  This API is deprecated and it assumes that the mpidr specified is
325c8babcdSSoby Mathew	 *  that of a valid and present CPU. Instead, plat_my_core_pos()
335c8babcdSSoby Mathew	 *  should be used for CPU index of the current CPU and
345c8babcdSSoby Mathew	 *  plat_core_pos_by_mpidr() should be used for CPU index of a
355c8babcdSSoby Mathew	 *  CPU specified by its mpidr.
365c8babcdSSoby Mathew	 * ------------------------------------------------------------------
375c8babcdSSoby Mathew	 */
385c8babcdSSoby Mathewfunc_deprecated platform_get_core_pos
395c8babcdSSoby Mathew	bic	x0, x0, #MPIDR_RES_BIT_MASK
405c8babcdSSoby Mathew	mrs	x1, mpidr_el1
415c8babcdSSoby Mathew	bic	x1, x1, #MPIDR_RES_BIT_MASK
425c8babcdSSoby Mathew	cmp	x0, x1
435c8babcdSSoby Mathew	beq	plat_my_core_pos
445c8babcdSSoby Mathew	b	platform_core_pos_helper
455c8babcdSSoby Mathewendfunc_deprecated platform_get_core_pos
465c8babcdSSoby Mathew#endif
475c8babcdSSoby Mathew
484f6ad66aSAchin Gupta	/* -----------------------------------------------------
494f6ad66aSAchin Gupta	 * Placeholder function which should be redefined by
504f6ad66aSAchin Gupta	 * each platform.
514f6ad66aSAchin Gupta	 * -----------------------------------------------------
524f6ad66aSAchin Gupta	 */
530a30cf54SAndrew Thoelkefunc plat_report_exception
544f6ad66aSAchin Gupta	ret
558b779620SKévin Petitendfunc plat_report_exception
56c67b09bdSSoby Mathew
5717cd67d2SJulius Werner#if MULTI_CONSOLE_API
58c67b09bdSSoby Mathew	/* -----------------------------------------------------
5917cd67d2SJulius Werner	 * int plat_crash_console_init(void)
6017cd67d2SJulius Werner	 * Use normal console by default. Switch it to crash
6117cd67d2SJulius Werner	 * mode so serial consoles become active again.
6217cd67d2SJulius Werner	 * NOTE: This default implementation will only work for
6317cd67d2SJulius Werner	 * crashes that occur after a normal console (marked
6417cd67d2SJulius Werner	 * valid for the crash state) has been registered with
6517cd67d2SJulius Werner	 * the console framework. To debug crashes that occur
6617cd67d2SJulius Werner	 * earlier, the platform has to override these functions
6717cd67d2SJulius Werner	 * with an implementation that initializes a console
6817cd67d2SJulius Werner	 * driver with hardcoded parameters. See
6917cd67d2SJulius Werner	 * docs/porting-guide.rst for more information.
7017cd67d2SJulius Werner	 * -----------------------------------------------------
7117cd67d2SJulius Werner	 */
7217cd67d2SJulius Wernerfunc plat_crash_console_init
7317cd67d2SJulius Werner#if defined(IMAGE_BL1)
7417cd67d2SJulius Werner	/*
7517cd67d2SJulius Werner	 * BL1 code can possibly crash so early that the data segment is not yet
7617cd67d2SJulius Werner	 * accessible. Don't risk undefined behavior by trying to run the normal
7717cd67d2SJulius Werner	 * console framework. Platforms that want to debug BL1 will need to
7817cd67d2SJulius Werner	 * override this with custom functions that can run from registers only.
7917cd67d2SJulius Werner	 */
8017cd67d2SJulius Werner	mov	x0, #0
8117cd67d2SJulius Werner	ret
8217cd67d2SJulius Werner#else	/* IMAGE_BL1 */
8317cd67d2SJulius Werner	mov	x3, x30
8417cd67d2SJulius Werner	mov	x0, #CONSOLE_FLAG_CRASH
8517cd67d2SJulius Werner	bl	console_switch_state
8617cd67d2SJulius Werner	mov	x0, #1
8717cd67d2SJulius Werner	ret	x3
8817cd67d2SJulius Werner#endif
8917cd67d2SJulius Wernerendfunc plat_crash_console_init
9017cd67d2SJulius Werner
9117cd67d2SJulius Werner	/* -----------------------------------------------------
9217cd67d2SJulius Werner	 * void plat_crash_console_putc(int character)
9317cd67d2SJulius Werner	 * Output through the normal console by default.
9417cd67d2SJulius Werner	 * -----------------------------------------------------
9517cd67d2SJulius Werner	 */
9617cd67d2SJulius Wernerfunc plat_crash_console_putc
9717cd67d2SJulius Werner	b	console_putc
9817cd67d2SJulius Wernerendfunc plat_crash_console_putc
9917cd67d2SJulius Werner
10017cd67d2SJulius Werner	/* -----------------------------------------------------
10117cd67d2SJulius Werner	 * void plat_crash_console_flush(void)
10217cd67d2SJulius Werner	 * Flush normal console by default.
10317cd67d2SJulius Werner	 * -----------------------------------------------------
10417cd67d2SJulius Werner	 */
10517cd67d2SJulius Wernerfunc plat_crash_console_flush
10617cd67d2SJulius Werner	b	console_flush
10717cd67d2SJulius Wernerendfunc plat_crash_console_flush
10817cd67d2SJulius Werner
10917cd67d2SJulius Werner#else	/* MULTI_CONSOLE_API */
11017cd67d2SJulius Werner
11117cd67d2SJulius Werner	/* -----------------------------------------------------
11217cd67d2SJulius Werner	 * In the old API these are all no-op stubs that need to
11317cd67d2SJulius Werner	 * be overridden by the platform to be useful.
114c67b09bdSSoby Mathew	 * -----------------------------------------------------
115c67b09bdSSoby Mathew	 */
116c67b09bdSSoby Mathewfunc plat_crash_console_init
117c67b09bdSSoby Mathew	mov	x0, #0
118c67b09bdSSoby Mathew	ret
1198b779620SKévin Petitendfunc plat_crash_console_init
120c67b09bdSSoby Mathew
121c67b09bdSSoby Mathewfunc plat_crash_console_putc
122c67b09bdSSoby Mathew	ret
1238b779620SKévin Petitendfunc plat_crash_console_putc
12424fb838fSSoby Mathew
125801cf93cSAntonio Nino Diazfunc plat_crash_console_flush
126801cf93cSAntonio Nino Diaz	ret
127801cf93cSAntonio Nino Diazendfunc plat_crash_console_flush
12817cd67d2SJulius Werner#endif
129801cf93cSAntonio Nino Diaz
130801cf93cSAntonio Nino Diaz	/* -----------------------------------------------------
131801cf93cSAntonio Nino Diaz	 * Placeholder function which should be redefined by
132240b3140SMasahiro Yamada	 * each platform. This function should preserve x19 - x29.
13324fb838fSSoby Mathew	 * -----------------------------------------------------
13424fb838fSSoby Mathew	 */
13524fb838fSSoby Mathewfunc plat_reset_handler
13624fb838fSSoby Mathew	ret
1378b779620SKévin Petitendfunc plat_reset_handler
138add40351SSoby Mathew
139add40351SSoby Mathew	/* -----------------------------------------------------
140add40351SSoby Mathew	 * Placeholder function which should be redefined by
141add40351SSoby Mathew	 * each platform. This function is allowed to use
142add40351SSoby Mathew	 * registers x0 - x17.
143add40351SSoby Mathew	 * -----------------------------------------------------
144add40351SSoby Mathew	 */
145add40351SSoby Mathewfunc plat_disable_acp
146add40351SSoby Mathew	ret
1478b779620SKévin Petitendfunc plat_disable_acp
148e3f67124SJuan Castillo
149e3f67124SJuan Castillo	/* -----------------------------------------------------
150862b5dc2SSandrine Bailleux	 * void bl1_plat_prepare_exit(entry_point_info_t *ep_info);
151e3f67124SJuan Castillo	 * Called before exiting BL1. Default: do nothing
152e3f67124SJuan Castillo	 * -----------------------------------------------------
153e3f67124SJuan Castillo	 */
154e3f67124SJuan Castillofunc bl1_plat_prepare_exit
155e3f67124SJuan Castillo	ret
156e3f67124SJuan Castilloendfunc bl1_plat_prepare_exit
15740fc6cd1SJuan Castillo
15840fc6cd1SJuan Castillo	/* -----------------------------------------------------
1591c3ea103SAntonio Nino Diaz	 * void plat_panic_handler(void) __dead2;
1601c3ea103SAntonio Nino Diaz	 * Endless loop by default.
1611c3ea103SAntonio Nino Diaz	 * -----------------------------------------------------
1621c3ea103SAntonio Nino Diaz	 */
1631c3ea103SAntonio Nino Diazfunc plat_panic_handler
1648c9e1af0SSandrine Bailleux	wfi
1651c3ea103SAntonio Nino Diaz	b	plat_panic_handler
1661c3ea103SAntonio Nino Diazendfunc plat_panic_handler
167