xref: /arm-trusted-firmware/plat/arm/common/aarch32/arm_helpers.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu#include <asm_macros.S>
7*91f16700Schasinglulu#include <platform_def.h>
8*91f16700Schasinglulu
9*91f16700Schasinglulu	.weak	plat_arm_calc_core_pos
10*91f16700Schasinglulu	.weak	plat_my_core_pos
11*91f16700Schasinglulu	.globl	plat_crash_console_init
12*91f16700Schasinglulu	.globl	plat_crash_console_putc
13*91f16700Schasinglulu	.globl	plat_crash_console_flush
14*91f16700Schasinglulu
15*91f16700Schasinglulu	/* -----------------------------------------------------
16*91f16700Schasinglulu	 *  unsigned int plat_my_core_pos(void)
17*91f16700Schasinglulu	 *  This function uses the plat_arm_calc_core_pos()
18*91f16700Schasinglulu	 *  definition to get the index of the calling CPU.
19*91f16700Schasinglulu	 * -----------------------------------------------------
20*91f16700Schasinglulu	 */
21*91f16700Schasinglulufunc plat_my_core_pos
22*91f16700Schasinglulu	ldcopr	r0, MPIDR
23*91f16700Schasinglulu	b	plat_arm_calc_core_pos
24*91f16700Schasingluluendfunc plat_my_core_pos
25*91f16700Schasinglulu
26*91f16700Schasinglulu	/* -----------------------------------------------------
27*91f16700Schasinglulu	 *  unsigned int plat_arm_calc_core_pos(uint64_t mpidr)
28*91f16700Schasinglulu	 *  Helper function to calculate the core position.
29*91f16700Schasinglulu	 *  With this function: CorePos = (ClusterId * 4) +
30*91f16700Schasinglulu	 *  				  CoreId
31*91f16700Schasinglulu	 * -----------------------------------------------------
32*91f16700Schasinglulu	 */
33*91f16700Schasinglulufunc plat_arm_calc_core_pos
34*91f16700Schasinglulu	and	r1, r0, #MPIDR_CPU_MASK
35*91f16700Schasinglulu	and	r0, r0, #MPIDR_CLUSTER_MASK
36*91f16700Schasinglulu	add	r0, r1, r0, LSR #6
37*91f16700Schasinglulu	bx	lr
38*91f16700Schasingluluendfunc plat_arm_calc_core_pos
39*91f16700Schasinglulu
40*91f16700Schasinglulu	/* ---------------------------------------------
41*91f16700Schasinglulu	 * int plat_crash_console_init(void)
42*91f16700Schasinglulu	 * Function to initialize the crash console
43*91f16700Schasinglulu	 * without a C Runtime to print crash report.
44*91f16700Schasinglulu	 * Clobber list : r0 - r3
45*91f16700Schasinglulu	 * ---------------------------------------------
46*91f16700Schasinglulu	 */
47*91f16700Schasinglulufunc plat_crash_console_init
48*91f16700Schasinglulu	ldr	r0, =PLAT_ARM_CRASH_UART_BASE
49*91f16700Schasinglulu	ldr	r1, =PLAT_ARM_CRASH_UART_CLK_IN_HZ
50*91f16700Schasinglulu	ldr	r2, =ARM_CONSOLE_BAUDRATE
51*91f16700Schasinglulu	b	console_pl011_core_init
52*91f16700Schasingluluendfunc plat_crash_console_init
53*91f16700Schasinglulu
54*91f16700Schasinglulu	/* ---------------------------------------------
55*91f16700Schasinglulu	 * int plat_crash_console_putc(int c)
56*91f16700Schasinglulu	 * Function to print a character on the crash
57*91f16700Schasinglulu	 * console without a C Runtime.
58*91f16700Schasinglulu	 * Clobber list : r1 - r2
59*91f16700Schasinglulu	 * ---------------------------------------------
60*91f16700Schasinglulu	 */
61*91f16700Schasinglulufunc plat_crash_console_putc
62*91f16700Schasinglulu	ldr	r1, =PLAT_ARM_CRASH_UART_BASE
63*91f16700Schasinglulu	b	console_pl011_core_putc
64*91f16700Schasingluluendfunc plat_crash_console_putc
65*91f16700Schasinglulu
66*91f16700Schasinglulu	/* ---------------------------------------------
67*91f16700Schasinglulu	 * void plat_crash_console_flush()
68*91f16700Schasinglulu	 * Function to force a write of all buffered
69*91f16700Schasinglulu	 * data that hasn't been output.
70*91f16700Schasinglulu	 * Out : void.
71*91f16700Schasinglulu	 * Clobber list : r0
72*91f16700Schasinglulu	 * ---------------------------------------------
73*91f16700Schasinglulu	 */
74*91f16700Schasinglulufunc plat_crash_console_flush
75*91f16700Schasinglulu	ldr	r0, =PLAT_ARM_CRASH_UART_BASE
76*91f16700Schasinglulu	b	console_pl011_core_flush
77*91f16700Schasingluluendfunc plat_crash_console_flush
78