xref: /rk3399_ARM-atf/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S (revision 28b02e2348f92cfb702695c970b893768471392d)
12f2abcf4SHaojian Zhuang/*
22f2abcf4SHaojian Zhuang * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
32f2abcf4SHaojian Zhuang *
42f2abcf4SHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause
52f2abcf4SHaojian Zhuang */
62f2abcf4SHaojian Zhuang
72f2abcf4SHaojian Zhuang#include <arch.h>
82f2abcf4SHaojian Zhuang#include <asm_macros.S>
9*28b02e23SHaojian Zhuang#include <cortex_a53.h>
10*28b02e23SHaojian Zhuang#include <cortex_a73.h>
112f2abcf4SHaojian Zhuang#include "../hikey960_def.h"
122f2abcf4SHaojian Zhuang
132f2abcf4SHaojian Zhuang	.globl	plat_my_core_pos
142f2abcf4SHaojian Zhuang	.globl	platform_mem_init
152f2abcf4SHaojian Zhuang	.globl	plat_crash_console_init
162f2abcf4SHaojian Zhuang	.globl	plat_crash_console_putc
172f2abcf4SHaojian Zhuang	.globl	plat_report_exception
182f2abcf4SHaojian Zhuang	.globl	plat_reset_handler
19*28b02e23SHaojian Zhuang	.globl	set_retention_ticks
20*28b02e23SHaojian Zhuang	.globl	clr_retention_ticks
21*28b02e23SHaojian Zhuang	.globl	clr_ex
22*28b02e23SHaojian Zhuang	.globl	nop
232f2abcf4SHaojian Zhuang
242f2abcf4SHaojian Zhuangfunc plat_my_core_pos
252f2abcf4SHaojian Zhuang	mrs	x0, mpidr_el1
262f2abcf4SHaojian Zhuang	and	x1, x0, #MPIDR_CPU_MASK
272f2abcf4SHaojian Zhuang	and	x0, x0, #MPIDR_CLUSTER_MASK
282f2abcf4SHaojian Zhuang	add	x0, x1, x0, LSR #6
292f2abcf4SHaojian Zhuang	ret
302f2abcf4SHaojian Zhuangendfunc plat_my_core_pos
312f2abcf4SHaojian Zhuang
322f2abcf4SHaojian Zhuang	/* -----------------------------------------------------
332f2abcf4SHaojian Zhuang	 * void platform_mem_init(void);
342f2abcf4SHaojian Zhuang	 *
352f2abcf4SHaojian Zhuang	 * We don't need to carry out any memory initialization
362f2abcf4SHaojian Zhuang	 * on HIKEY. The Secure RAM is accessible straight away.
372f2abcf4SHaojian Zhuang	 * -----------------------------------------------------
382f2abcf4SHaojian Zhuang	 */
392f2abcf4SHaojian Zhuangfunc platform_mem_init
402f2abcf4SHaojian Zhuang	ret
412f2abcf4SHaojian Zhuangendfunc platform_mem_init
422f2abcf4SHaojian Zhuang
432f2abcf4SHaojian Zhuang	/* ---------------------------------------------
442f2abcf4SHaojian Zhuang	 * int plat_crash_console_init(void)
452f2abcf4SHaojian Zhuang	 * Function to initialize the crash console
462f2abcf4SHaojian Zhuang	 * without a C Runtime to print crash report.
472f2abcf4SHaojian Zhuang	 * Clobber list : x0, x1, x2
482f2abcf4SHaojian Zhuang	 * ---------------------------------------------
492f2abcf4SHaojian Zhuang	 */
502f2abcf4SHaojian Zhuangfunc plat_crash_console_init
512f2abcf4SHaojian Zhuang	mov_imm	x0, CRASH_CONSOLE_BASE
522f2abcf4SHaojian Zhuang	mov_imm	x1, PL011_UART_CLK_IN_HZ
532f2abcf4SHaojian Zhuang	mov_imm	x2, PL011_BAUDRATE
542f2abcf4SHaojian Zhuang	b	console_core_init
552f2abcf4SHaojian Zhuangendfunc plat_crash_console_init
562f2abcf4SHaojian Zhuang
572f2abcf4SHaojian Zhuang	/* ---------------------------------------------
582f2abcf4SHaojian Zhuang	 * int plat_crash_console_putc(int c)
592f2abcf4SHaojian Zhuang	 * Function to print a character on the crash
602f2abcf4SHaojian Zhuang	 * console without a C Runtime.
612f2abcf4SHaojian Zhuang	 * Clobber list : x1, x2
622f2abcf4SHaojian Zhuang	 * ---------------------------------------------
632f2abcf4SHaojian Zhuang	 */
642f2abcf4SHaojian Zhuangfunc plat_crash_console_putc
652f2abcf4SHaojian Zhuang	mov_imm	x1, CRASH_CONSOLE_BASE
662f2abcf4SHaojian Zhuang	b	console_core_putc
672f2abcf4SHaojian Zhuangendfunc plat_crash_console_putc
682f2abcf4SHaojian Zhuang
692f2abcf4SHaojian Zhuang	/* ---------------------------------------------
702f2abcf4SHaojian Zhuang	 * void plat_report_exception(unsigned int type)
712f2abcf4SHaojian Zhuang	 * Function to report an unhandled exception
722f2abcf4SHaojian Zhuang	 * with platform-specific means.
732f2abcf4SHaojian Zhuang	 * On HIKEY platform, it updates the LEDs
742f2abcf4SHaojian Zhuang	 * to indicate where we are
752f2abcf4SHaojian Zhuang	 * ---------------------------------------------
762f2abcf4SHaojian Zhuang	 */
772f2abcf4SHaojian Zhuangfunc plat_report_exception
782f2abcf4SHaojian Zhuang	mov	x8, x30
792f2abcf4SHaojian Zhuang
802f2abcf4SHaojian Zhuang	/* Turn on LED according to x0 (0 -- f) */
812f2abcf4SHaojian Zhuang	ldr	x2, =0xf7020000
822f2abcf4SHaojian Zhuang	and	x1, x0, #1
832f2abcf4SHaojian Zhuang	str	w1, [x2, #4]
842f2abcf4SHaojian Zhuang	and	x1, x0, #2
852f2abcf4SHaojian Zhuang	str	w1, [x2, #8]
862f2abcf4SHaojian Zhuang	and	x1, x0, #4
872f2abcf4SHaojian Zhuang	str	w1, [x2, #16]
882f2abcf4SHaojian Zhuang	and	x1, x0, #8
892f2abcf4SHaojian Zhuang	str	w1, [x2, #32]
902f2abcf4SHaojian Zhuang
912f2abcf4SHaojian Zhuang	mrs	x2, currentel
922f2abcf4SHaojian Zhuang	and	x2, x2, #0x0c
932f2abcf4SHaojian Zhuang	/* Check EL1 */
942f2abcf4SHaojian Zhuang	cmp	x2, #0x04
952f2abcf4SHaojian Zhuang	beq	plat_report_el1
962f2abcf4SHaojian Zhuang
972f2abcf4SHaojian Zhuang	adr	x4, plat_err_str
982f2abcf4SHaojian Zhuang	bl	asm_print_str
992f2abcf4SHaojian Zhuang
1002f2abcf4SHaojian Zhuang	adr	x4, esr_el3_str
1012f2abcf4SHaojian Zhuang	bl	asm_print_str
1022f2abcf4SHaojian Zhuang
1032f2abcf4SHaojian Zhuang	mrs	x4, esr_el3
1042f2abcf4SHaojian Zhuang	bl	asm_print_hex
1052f2abcf4SHaojian Zhuang
1062f2abcf4SHaojian Zhuang	adr	x4, elr_el3_str
1072f2abcf4SHaojian Zhuang	bl	asm_print_str
1082f2abcf4SHaojian Zhuang
1092f2abcf4SHaojian Zhuang	mrs	x4, elr_el3
1102f2abcf4SHaojian Zhuang	bl	asm_print_hex
1112f2abcf4SHaojian Zhuang	b	plat_report_end
1122f2abcf4SHaojian Zhuang
1132f2abcf4SHaojian Zhuangplat_report_el1:
1142f2abcf4SHaojian Zhuang	adr	x4, plat_err_str
1152f2abcf4SHaojian Zhuang	bl	asm_print_str
1162f2abcf4SHaojian Zhuang
1172f2abcf4SHaojian Zhuang	adr	x4, esr_el1_str
1182f2abcf4SHaojian Zhuang	bl	asm_print_str
1192f2abcf4SHaojian Zhuang
1202f2abcf4SHaojian Zhuang	mrs	x4, esr_el1
1212f2abcf4SHaojian Zhuang	bl	asm_print_hex
1222f2abcf4SHaojian Zhuang
1232f2abcf4SHaojian Zhuang	adr	x4, elr_el1_str
1242f2abcf4SHaojian Zhuang	bl	asm_print_str
1252f2abcf4SHaojian Zhuang
1262f2abcf4SHaojian Zhuang	mrs	x4, elr_el1
1272f2abcf4SHaojian Zhuang	bl	asm_print_hex
1282f2abcf4SHaojian Zhuangplat_report_end:
1292f2abcf4SHaojian Zhuang	mov	x30, x8
1302f2abcf4SHaojian Zhuang	ret
1312f2abcf4SHaojian Zhuangendfunc plat_report_exception
1322f2abcf4SHaojian Zhuang
1332f2abcf4SHaojian Zhuang	/* -----------------------------------------------------
1342f2abcf4SHaojian Zhuang	 * void plat_reset_handler(void);
1352f2abcf4SHaojian Zhuang	 * -----------------------------------------------------
1362f2abcf4SHaojian Zhuang	 */
1372f2abcf4SHaojian Zhuangfunc plat_reset_handler
1382f2abcf4SHaojian Zhuang	ret
1392f2abcf4SHaojian Zhuangendfunc plat_reset_handler
1402f2abcf4SHaojian Zhuang
141*28b02e23SHaojian Zhuang	/* -----------------------------------------------------
142*28b02e23SHaojian Zhuang	 * void set_retention_ticks(unsigned int val);
143*28b02e23SHaojian Zhuang	 * Clobber list : x0
144*28b02e23SHaojian Zhuang	 * -----------------------------------------------------
145*28b02e23SHaojian Zhuang	 */
146*28b02e23SHaojian Zhuangfunc set_retention_ticks
147*28b02e23SHaojian Zhuang	mrs	x0, CPUECTLR_EL1
148*28b02e23SHaojian Zhuang	bic	x0, x0, #CPUECTLR_CPU_RET_CTRL_MASK
149*28b02e23SHaojian Zhuang	orr	x0, x0, #RETENTION_ENTRY_TICKS_8
150*28b02e23SHaojian Zhuang	msr	CPUECTLR_EL1, x0
151*28b02e23SHaojian Zhuang	isb
152*28b02e23SHaojian Zhuang	dsb	sy
153*28b02e23SHaojian Zhuang	ret
154*28b02e23SHaojian Zhuangendfunc set_retention_ticks
155*28b02e23SHaojian Zhuang
156*28b02e23SHaojian Zhuang	/* -----------------------------------------------------
157*28b02e23SHaojian Zhuang	 * void clr_retention_ticks(unsigned int val);
158*28b02e23SHaojian Zhuang	 * Clobber list : x0
159*28b02e23SHaojian Zhuang	 * -----------------------------------------------------
160*28b02e23SHaojian Zhuang	 */
161*28b02e23SHaojian Zhuangfunc clr_retention_ticks
162*28b02e23SHaojian Zhuang	mrs	x0, CPUECTLR_EL1
163*28b02e23SHaojian Zhuang	bic	x0, x0, #CPUECTLR_CPU_RET_CTRL_MASK
164*28b02e23SHaojian Zhuang	msr	CPUECTLR_EL1, x0
165*28b02e23SHaojian Zhuang	isb
166*28b02e23SHaojian Zhuang	dsb	sy
167*28b02e23SHaojian Zhuang	ret
168*28b02e23SHaojian Zhuangendfunc clr_retention_ticks
169*28b02e23SHaojian Zhuang
170*28b02e23SHaojian Zhuang	/* -----------------------------------------------------
171*28b02e23SHaojian Zhuang	 * void clrex(void);
172*28b02e23SHaojian Zhuang	 * -----------------------------------------------------
173*28b02e23SHaojian Zhuang	 */
174*28b02e23SHaojian Zhuangfunc clr_ex
175*28b02e23SHaojian Zhuang	clrex
176*28b02e23SHaojian Zhuang	ret
177*28b02e23SHaojian Zhuangendfunc clr_ex
178*28b02e23SHaojian Zhuang
179*28b02e23SHaojian Zhuang	/* -----------------------------------------------------
180*28b02e23SHaojian Zhuang	 * void nop(void);
181*28b02e23SHaojian Zhuang	 * -----------------------------------------------------
182*28b02e23SHaojian Zhuang	 */
183*28b02e23SHaojian Zhuangfunc nop
184*28b02e23SHaojian Zhuang	nop
185*28b02e23SHaojian Zhuang	ret
186*28b02e23SHaojian Zhuangendfunc nop
187*28b02e23SHaojian Zhuang
1882f2abcf4SHaojian Zhuang.section .rodata.rev_err_str, "aS"
1892f2abcf4SHaojian Zhuangplat_err_str:
1902f2abcf4SHaojian Zhuang	.asciz "\nPlatform exception reporting:"
1912f2abcf4SHaojian Zhuangesr_el3_str:
1922f2abcf4SHaojian Zhuang	.asciz "\nESR_EL3: "
1932f2abcf4SHaojian Zhuangelr_el3_str:
1942f2abcf4SHaojian Zhuang	.asciz "\nELR_EL3: "
1952f2abcf4SHaojian Zhuangesr_el1_str:
1962f2abcf4SHaojian Zhuang	.asciz "\nESR_EL1: "
1972f2abcf4SHaojian Zhuangelr_el1_str:
1982f2abcf4SHaojian Zhuang	.asciz "\nELR_EL1: "
199