xref: /rk3399_ARM-atf/plat/common/aarch64/platform_helpers.S (revision d5a23af50fb1ddb1f53a095c0a9d15c295d9bcc3)
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
2064ee263eSJeenu Viswambharan	.weak	bl31_plat_enable_mmu
2164ee263eSJeenu Viswambharan	.weak	bl32_plat_enable_mmu
224f6ad66aSAchin Gupta
23b56dc2a9SJeenu Viswambharan	.weak	plat_handle_uncontainable_ea
24*d5a23af5SJeenu Viswambharan	.weak	plat_handle_double_fault
25b56dc2a9SJeenu Viswambharan
265c8babcdSSoby Mathew#if !ENABLE_PLAT_COMPAT
275c8babcdSSoby Mathew	.globl	platform_get_core_pos
285c8babcdSSoby Mathew
295c8babcdSSoby Mathew#define MPIDR_RES_BIT_MASK	0xff000000
305c8babcdSSoby Mathew
315c8babcdSSoby Mathew	/* ------------------------------------------------------------------
325c8babcdSSoby Mathew	 *  int platform_get_core_pos(int mpidr)
335c8babcdSSoby Mathew	 *  Returns the CPU index of the CPU specified by mpidr. This is
345c8babcdSSoby Mathew	 *  defined when platform compatibility is disabled to enable Trusted
355c8babcdSSoby Mathew	 *  Firmware components like SPD using the old  platform API to work.
365c8babcdSSoby Mathew	 *  This API is deprecated and it assumes that the mpidr specified is
375c8babcdSSoby Mathew	 *  that of a valid and present CPU. Instead, plat_my_core_pos()
385c8babcdSSoby Mathew	 *  should be used for CPU index of the current CPU and
395c8babcdSSoby Mathew	 *  plat_core_pos_by_mpidr() should be used for CPU index of a
405c8babcdSSoby Mathew	 *  CPU specified by its mpidr.
415c8babcdSSoby Mathew	 * ------------------------------------------------------------------
425c8babcdSSoby Mathew	 */
435c8babcdSSoby Mathewfunc_deprecated platform_get_core_pos
445c8babcdSSoby Mathew	bic	x0, x0, #MPIDR_RES_BIT_MASK
455c8babcdSSoby Mathew	mrs	x1, mpidr_el1
465c8babcdSSoby Mathew	bic	x1, x1, #MPIDR_RES_BIT_MASK
475c8babcdSSoby Mathew	cmp	x0, x1
485c8babcdSSoby Mathew	beq	plat_my_core_pos
495c8babcdSSoby Mathew	b	platform_core_pos_helper
505c8babcdSSoby Mathewendfunc_deprecated platform_get_core_pos
515c8babcdSSoby Mathew#endif
525c8babcdSSoby Mathew
534f6ad66aSAchin Gupta	/* -----------------------------------------------------
544f6ad66aSAchin Gupta	 * Placeholder function which should be redefined by
554f6ad66aSAchin Gupta	 * each platform.
564f6ad66aSAchin Gupta	 * -----------------------------------------------------
574f6ad66aSAchin Gupta	 */
580a30cf54SAndrew Thoelkefunc plat_report_exception
594f6ad66aSAchin Gupta	ret
608b779620SKévin Petitendfunc plat_report_exception
61c67b09bdSSoby Mathew
6217cd67d2SJulius Werner#if MULTI_CONSOLE_API
63c67b09bdSSoby Mathew	/* -----------------------------------------------------
6417cd67d2SJulius Werner	 * int plat_crash_console_init(void)
6517cd67d2SJulius Werner	 * Use normal console by default. Switch it to crash
6617cd67d2SJulius Werner	 * mode so serial consoles become active again.
6717cd67d2SJulius Werner	 * NOTE: This default implementation will only work for
6817cd67d2SJulius Werner	 * crashes that occur after a normal console (marked
6917cd67d2SJulius Werner	 * valid for the crash state) has been registered with
7017cd67d2SJulius Werner	 * the console framework. To debug crashes that occur
7117cd67d2SJulius Werner	 * earlier, the platform has to override these functions
7217cd67d2SJulius Werner	 * with an implementation that initializes a console
7317cd67d2SJulius Werner	 * driver with hardcoded parameters. See
7417cd67d2SJulius Werner	 * docs/porting-guide.rst for more information.
7517cd67d2SJulius Werner	 * -----------------------------------------------------
7617cd67d2SJulius Werner	 */
7717cd67d2SJulius Wernerfunc plat_crash_console_init
7817cd67d2SJulius Werner#if defined(IMAGE_BL1)
7917cd67d2SJulius Werner	/*
8017cd67d2SJulius Werner	 * BL1 code can possibly crash so early that the data segment is not yet
8117cd67d2SJulius Werner	 * accessible. Don't risk undefined behavior by trying to run the normal
8217cd67d2SJulius Werner	 * console framework. Platforms that want to debug BL1 will need to
8317cd67d2SJulius Werner	 * override this with custom functions that can run from registers only.
8417cd67d2SJulius Werner	 */
8517cd67d2SJulius Werner	mov	x0, #0
8617cd67d2SJulius Werner	ret
8717cd67d2SJulius Werner#else	/* IMAGE_BL1 */
8817cd67d2SJulius Werner	mov	x3, x30
8917cd67d2SJulius Werner	mov	x0, #CONSOLE_FLAG_CRASH
9017cd67d2SJulius Werner	bl	console_switch_state
9117cd67d2SJulius Werner	mov	x0, #1
9217cd67d2SJulius Werner	ret	x3
9317cd67d2SJulius Werner#endif
9417cd67d2SJulius Wernerendfunc plat_crash_console_init
9517cd67d2SJulius Werner
9617cd67d2SJulius Werner	/* -----------------------------------------------------
9717cd67d2SJulius Werner	 * void plat_crash_console_putc(int character)
9817cd67d2SJulius Werner	 * Output through the normal console by default.
9917cd67d2SJulius Werner	 * -----------------------------------------------------
10017cd67d2SJulius Werner	 */
10117cd67d2SJulius Wernerfunc plat_crash_console_putc
10217cd67d2SJulius Werner	b	console_putc
10317cd67d2SJulius Wernerendfunc plat_crash_console_putc
10417cd67d2SJulius Werner
10517cd67d2SJulius Werner	/* -----------------------------------------------------
10617cd67d2SJulius Werner	 * void plat_crash_console_flush(void)
10717cd67d2SJulius Werner	 * Flush normal console by default.
10817cd67d2SJulius Werner	 * -----------------------------------------------------
10917cd67d2SJulius Werner	 */
11017cd67d2SJulius Wernerfunc plat_crash_console_flush
11117cd67d2SJulius Werner	b	console_flush
11217cd67d2SJulius Wernerendfunc plat_crash_console_flush
11317cd67d2SJulius Werner
11417cd67d2SJulius Werner#else	/* MULTI_CONSOLE_API */
11517cd67d2SJulius Werner
11617cd67d2SJulius Werner	/* -----------------------------------------------------
11717cd67d2SJulius Werner	 * In the old API these are all no-op stubs that need to
11817cd67d2SJulius Werner	 * be overridden by the platform to be useful.
119c67b09bdSSoby Mathew	 * -----------------------------------------------------
120c67b09bdSSoby Mathew	 */
121c67b09bdSSoby Mathewfunc plat_crash_console_init
122c67b09bdSSoby Mathew	mov	x0, #0
123c67b09bdSSoby Mathew	ret
1248b779620SKévin Petitendfunc plat_crash_console_init
125c67b09bdSSoby Mathew
126c67b09bdSSoby Mathewfunc plat_crash_console_putc
127c67b09bdSSoby Mathew	ret
1288b779620SKévin Petitendfunc plat_crash_console_putc
12924fb838fSSoby Mathew
130801cf93cSAntonio Nino Diazfunc plat_crash_console_flush
131801cf93cSAntonio Nino Diaz	ret
132801cf93cSAntonio Nino Diazendfunc plat_crash_console_flush
13317cd67d2SJulius Werner#endif
134801cf93cSAntonio Nino Diaz
135801cf93cSAntonio Nino Diaz	/* -----------------------------------------------------
136801cf93cSAntonio Nino Diaz	 * Placeholder function which should be redefined by
137240b3140SMasahiro Yamada	 * each platform. This function should preserve x19 - x29.
13824fb838fSSoby Mathew	 * -----------------------------------------------------
13924fb838fSSoby Mathew	 */
14024fb838fSSoby Mathewfunc plat_reset_handler
14124fb838fSSoby Mathew	ret
1428b779620SKévin Petitendfunc plat_reset_handler
143add40351SSoby Mathew
144add40351SSoby Mathew	/* -----------------------------------------------------
145add40351SSoby Mathew	 * Placeholder function which should be redefined by
146add40351SSoby Mathew	 * each platform. This function is allowed to use
147add40351SSoby Mathew	 * registers x0 - x17.
148add40351SSoby Mathew	 * -----------------------------------------------------
149add40351SSoby Mathew	 */
150add40351SSoby Mathewfunc plat_disable_acp
151add40351SSoby Mathew	ret
1528b779620SKévin Petitendfunc plat_disable_acp
153e3f67124SJuan Castillo
154e3f67124SJuan Castillo	/* -----------------------------------------------------
155862b5dc2SSandrine Bailleux	 * void bl1_plat_prepare_exit(entry_point_info_t *ep_info);
156e3f67124SJuan Castillo	 * Called before exiting BL1. Default: do nothing
157e3f67124SJuan Castillo	 * -----------------------------------------------------
158e3f67124SJuan Castillo	 */
159e3f67124SJuan Castillofunc bl1_plat_prepare_exit
160e3f67124SJuan Castillo	ret
161e3f67124SJuan Castilloendfunc bl1_plat_prepare_exit
16240fc6cd1SJuan Castillo
16340fc6cd1SJuan Castillo	/* -----------------------------------------------------
1641c3ea103SAntonio Nino Diaz	 * void plat_panic_handler(void) __dead2;
1651c3ea103SAntonio Nino Diaz	 * Endless loop by default.
1661c3ea103SAntonio Nino Diaz	 * -----------------------------------------------------
1671c3ea103SAntonio Nino Diaz	 */
1681c3ea103SAntonio Nino Diazfunc plat_panic_handler
1698c9e1af0SSandrine Bailleux	wfi
1701c3ea103SAntonio Nino Diaz	b	plat_panic_handler
1711c3ea103SAntonio Nino Diazendfunc plat_panic_handler
17264ee263eSJeenu Viswambharan
17364ee263eSJeenu Viswambharan	/* -----------------------------------------------------
17464ee263eSJeenu Viswambharan	 * void bl31_plat_enable_mmu(uint32_t flags);
17564ee263eSJeenu Viswambharan	 *
17664ee263eSJeenu Viswambharan	 * Enable MMU in BL31.
17764ee263eSJeenu Viswambharan	 * -----------------------------------------------------
17864ee263eSJeenu Viswambharan	 */
17964ee263eSJeenu Viswambharanfunc bl31_plat_enable_mmu
18064ee263eSJeenu Viswambharan	b	enable_mmu_direct_el3
18164ee263eSJeenu Viswambharanendfunc bl31_plat_enable_mmu
18264ee263eSJeenu Viswambharan
18364ee263eSJeenu Viswambharan	/* -----------------------------------------------------
18464ee263eSJeenu Viswambharan	 * void bl32_plat_enable_mmu(uint32_t flags);
18564ee263eSJeenu Viswambharan	 *
18664ee263eSJeenu Viswambharan	 * Enable MMU in BL32.
18764ee263eSJeenu Viswambharan	 * -----------------------------------------------------
18864ee263eSJeenu Viswambharan	 */
18964ee263eSJeenu Viswambharanfunc bl32_plat_enable_mmu
19064ee263eSJeenu Viswambharan	b	enable_mmu_direct_el1
19164ee263eSJeenu Viswambharanendfunc bl32_plat_enable_mmu
192b56dc2a9SJeenu Viswambharan
193b56dc2a9SJeenu Viswambharan
194b56dc2a9SJeenu Viswambharan	/* -----------------------------------------------------
195b56dc2a9SJeenu Viswambharan	 * Platform handler for Uncontainable External Abort.
196b56dc2a9SJeenu Viswambharan	 *
197b56dc2a9SJeenu Viswambharan	 * x0: EA reason
198b56dc2a9SJeenu Viswambharan	 * x1: EA syndrome
199b56dc2a9SJeenu Viswambharan	 * -----------------------------------------------------
200b56dc2a9SJeenu Viswambharan	 */
201b56dc2a9SJeenu Viswambharanfunc plat_handle_uncontainable_ea
202b56dc2a9SJeenu Viswambharan	b	report_unhandled_exception
203b56dc2a9SJeenu Viswambharanendfunc plat_handle_uncontainable_ea
204*d5a23af5SJeenu Viswambharan
205*d5a23af5SJeenu Viswambharan	/* -----------------------------------------------------
206*d5a23af5SJeenu Viswambharan	 * Platform handler for Double Fault.
207*d5a23af5SJeenu Viswambharan	 *
208*d5a23af5SJeenu Viswambharan	 * x0: EA reason
209*d5a23af5SJeenu Viswambharan	 * x1: EA syndrome
210*d5a23af5SJeenu Viswambharan	 * -----------------------------------------------------
211*d5a23af5SJeenu Viswambharan	 */
212*d5a23af5SJeenu Viswambharanfunc plat_handle_double_fault
213*d5a23af5SJeenu Viswambharan	b	report_unhandled_exception
214*d5a23af5SJeenu Viswambharanendfunc plat_handle_double_fault
215