xref: /rk3399_ARM-atf/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S (revision dfe577a817d8384c313f0a184be75efeb3cd8445)
12f2abcf4SHaojian Zhuang/*
2*831b0e98SJimmy Brisson * Copyright (c) 2017-2020, 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>
928b02e23SHaojian Zhuang#include <cortex_a53.h>
1028b02e23SHaojian 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
179c675b37SAntonio Nino Diaz	.globl	plat_crash_console_flush
182f2abcf4SHaojian Zhuang	.globl	plat_report_exception
192f2abcf4SHaojian Zhuang	.globl	plat_reset_handler
2028b02e23SHaojian Zhuang	.globl	clr_ex
2128b02e23SHaojian Zhuang	.globl	nop
222f2abcf4SHaojian Zhuang
232f2abcf4SHaojian Zhuangfunc plat_my_core_pos
242f2abcf4SHaojian Zhuang	mrs	x0, mpidr_el1
252f2abcf4SHaojian Zhuang	and	x1, x0, #MPIDR_CPU_MASK
262f2abcf4SHaojian Zhuang	and	x0, x0, #MPIDR_CLUSTER_MASK
272f2abcf4SHaojian Zhuang	add	x0, x1, x0, LSR #6
282f2abcf4SHaojian Zhuang	ret
292f2abcf4SHaojian Zhuangendfunc plat_my_core_pos
302f2abcf4SHaojian Zhuang
312f2abcf4SHaojian Zhuang	/* -----------------------------------------------------
322f2abcf4SHaojian Zhuang	 * void platform_mem_init(void);
332f2abcf4SHaojian Zhuang	 *
342f2abcf4SHaojian Zhuang	 * We don't need to carry out any memory initialization
352f2abcf4SHaojian Zhuang	 * on HIKEY. The Secure RAM is accessible straight away.
362f2abcf4SHaojian Zhuang	 * -----------------------------------------------------
372f2abcf4SHaojian Zhuang	 */
382f2abcf4SHaojian Zhuangfunc platform_mem_init
392f2abcf4SHaojian Zhuang	ret
402f2abcf4SHaojian Zhuangendfunc platform_mem_init
412f2abcf4SHaojian Zhuang
422f2abcf4SHaojian Zhuang	/* ---------------------------------------------
432f2abcf4SHaojian Zhuang	 * int plat_crash_console_init(void)
442f2abcf4SHaojian Zhuang	 * Function to initialize the crash console
452f2abcf4SHaojian Zhuang	 * without a C Runtime to print crash report.
462f2abcf4SHaojian Zhuang	 * Clobber list : x0, x1, x2
472f2abcf4SHaojian Zhuang	 * ---------------------------------------------
482f2abcf4SHaojian Zhuang	 */
492f2abcf4SHaojian Zhuangfunc plat_crash_console_init
502f2abcf4SHaojian Zhuang	mov_imm	x0, CRASH_CONSOLE_BASE
512f2abcf4SHaojian Zhuang	mov_imm	x1, PL011_UART_CLK_IN_HZ
522f2abcf4SHaojian Zhuang	mov_imm	x2, PL011_BAUDRATE
535189ea27SJerome Forissier	b	console_pl011_core_init
542f2abcf4SHaojian Zhuangendfunc plat_crash_console_init
552f2abcf4SHaojian Zhuang
562f2abcf4SHaojian Zhuang	/* ---------------------------------------------
572f2abcf4SHaojian Zhuang	 * int plat_crash_console_putc(int c)
582f2abcf4SHaojian Zhuang	 * Function to print a character on the crash
592f2abcf4SHaojian Zhuang	 * console without a C Runtime.
602f2abcf4SHaojian Zhuang	 * Clobber list : x1, x2
612f2abcf4SHaojian Zhuang	 * ---------------------------------------------
622f2abcf4SHaojian Zhuang	 */
632f2abcf4SHaojian Zhuangfunc plat_crash_console_putc
642f2abcf4SHaojian Zhuang	mov_imm	x1, CRASH_CONSOLE_BASE
655189ea27SJerome Forissier	b	console_pl011_core_putc
662f2abcf4SHaojian Zhuangendfunc plat_crash_console_putc
672f2abcf4SHaojian Zhuang
682f2abcf4SHaojian Zhuang	/* ---------------------------------------------
69*831b0e98SJimmy Brisson	 * void plat_crash_console_flush()
709c675b37SAntonio Nino Diaz	 * Function to force a write of all buffered
719c675b37SAntonio Nino Diaz	 * data that hasn't been output.
72*831b0e98SJimmy Brisson	 * Out : void.
739c675b37SAntonio Nino Diaz	 * Clobber list : x0, x1
749c675b37SAntonio Nino Diaz	 * ---------------------------------------------
759c675b37SAntonio Nino Diaz	 */
769c675b37SAntonio Nino Diazfunc plat_crash_console_flush
779c675b37SAntonio Nino Diaz	mov_imm	x0, CRASH_CONSOLE_BASE
785189ea27SJerome Forissier	b	console_pl011_core_flush
799c675b37SAntonio Nino Diazendfunc plat_crash_console_flush
809c675b37SAntonio Nino Diaz
819c675b37SAntonio Nino Diaz	/* ---------------------------------------------
822f2abcf4SHaojian Zhuang	 * void plat_report_exception(unsigned int type)
832f2abcf4SHaojian Zhuang	 * Function to report an unhandled exception
842f2abcf4SHaojian Zhuang	 * with platform-specific means.
852f2abcf4SHaojian Zhuang	 * On HIKEY platform, it updates the LEDs
862f2abcf4SHaojian Zhuang	 * to indicate where we are
872f2abcf4SHaojian Zhuang	 * ---------------------------------------------
882f2abcf4SHaojian Zhuang	 */
892f2abcf4SHaojian Zhuangfunc plat_report_exception
902f2abcf4SHaojian Zhuang	mov	x8, x30
912f2abcf4SHaojian Zhuang
922f2abcf4SHaojian Zhuang	/* Turn on LED according to x0 (0 -- f) */
932f2abcf4SHaojian Zhuang	ldr	x2, =0xf7020000
942f2abcf4SHaojian Zhuang	and	x1, x0, #1
952f2abcf4SHaojian Zhuang	str	w1, [x2, #4]
962f2abcf4SHaojian Zhuang	and	x1, x0, #2
972f2abcf4SHaojian Zhuang	str	w1, [x2, #8]
982f2abcf4SHaojian Zhuang	and	x1, x0, #4
992f2abcf4SHaojian Zhuang	str	w1, [x2, #16]
1002f2abcf4SHaojian Zhuang	and	x1, x0, #8
1012f2abcf4SHaojian Zhuang	str	w1, [x2, #32]
1022f2abcf4SHaojian Zhuang
1032f2abcf4SHaojian Zhuang	mrs	x2, currentel
1042f2abcf4SHaojian Zhuang	and	x2, x2, #0x0c
1052f2abcf4SHaojian Zhuang	/* Check EL1 */
1062f2abcf4SHaojian Zhuang	cmp	x2, #0x04
1072f2abcf4SHaojian Zhuang	beq	plat_report_el1
1082f2abcf4SHaojian Zhuang
1092f2abcf4SHaojian Zhuang	adr	x4, plat_err_str
1102f2abcf4SHaojian Zhuang	bl	asm_print_str
1112f2abcf4SHaojian Zhuang
1122f2abcf4SHaojian Zhuang	adr	x4, esr_el3_str
1132f2abcf4SHaojian Zhuang	bl	asm_print_str
1142f2abcf4SHaojian Zhuang
1152f2abcf4SHaojian Zhuang	mrs	x4, esr_el3
1162f2abcf4SHaojian Zhuang	bl	asm_print_hex
1172f2abcf4SHaojian Zhuang
1182f2abcf4SHaojian Zhuang	adr	x4, elr_el3_str
1192f2abcf4SHaojian Zhuang	bl	asm_print_str
1202f2abcf4SHaojian Zhuang
1212f2abcf4SHaojian Zhuang	mrs	x4, elr_el3
1222f2abcf4SHaojian Zhuang	bl	asm_print_hex
1232f2abcf4SHaojian Zhuang	b	plat_report_end
1242f2abcf4SHaojian Zhuang
1252f2abcf4SHaojian Zhuangplat_report_el1:
1262f2abcf4SHaojian Zhuang	adr	x4, plat_err_str
1272f2abcf4SHaojian Zhuang	bl	asm_print_str
1282f2abcf4SHaojian Zhuang
1292f2abcf4SHaojian Zhuang	adr	x4, esr_el1_str
1302f2abcf4SHaojian Zhuang	bl	asm_print_str
1312f2abcf4SHaojian Zhuang
1322f2abcf4SHaojian Zhuang	mrs	x4, esr_el1
1332f2abcf4SHaojian Zhuang	bl	asm_print_hex
1342f2abcf4SHaojian Zhuang
1352f2abcf4SHaojian Zhuang	adr	x4, elr_el1_str
1362f2abcf4SHaojian Zhuang	bl	asm_print_str
1372f2abcf4SHaojian Zhuang
1382f2abcf4SHaojian Zhuang	mrs	x4, elr_el1
1392f2abcf4SHaojian Zhuang	bl	asm_print_hex
1402f2abcf4SHaojian Zhuangplat_report_end:
1412f2abcf4SHaojian Zhuang	mov	x30, x8
1422f2abcf4SHaojian Zhuang	ret
1432f2abcf4SHaojian Zhuangendfunc plat_report_exception
1442f2abcf4SHaojian Zhuang
1452f2abcf4SHaojian Zhuang	/* -----------------------------------------------------
1462f2abcf4SHaojian Zhuang	 * void plat_reset_handler(void);
1472f2abcf4SHaojian Zhuang	 * -----------------------------------------------------
1482f2abcf4SHaojian Zhuang	 */
1492f2abcf4SHaojian Zhuangfunc plat_reset_handler
1502f2abcf4SHaojian Zhuang	ret
1512f2abcf4SHaojian Zhuangendfunc plat_reset_handler
1522f2abcf4SHaojian Zhuang
15328b02e23SHaojian Zhuang	/* -----------------------------------------------------
15428b02e23SHaojian Zhuang	 * void clrex(void);
15528b02e23SHaojian Zhuang	 * -----------------------------------------------------
15628b02e23SHaojian Zhuang	 */
15728b02e23SHaojian Zhuangfunc clr_ex
15828b02e23SHaojian Zhuang	clrex
15928b02e23SHaojian Zhuang	ret
16028b02e23SHaojian Zhuangendfunc clr_ex
16128b02e23SHaojian Zhuang
16228b02e23SHaojian Zhuang	/* -----------------------------------------------------
16328b02e23SHaojian Zhuang	 * void nop(void);
16428b02e23SHaojian Zhuang	 * -----------------------------------------------------
16528b02e23SHaojian Zhuang	 */
16628b02e23SHaojian Zhuangfunc nop
16728b02e23SHaojian Zhuang	nop
16828b02e23SHaojian Zhuang	ret
16928b02e23SHaojian Zhuangendfunc nop
17028b02e23SHaojian Zhuang
1712f2abcf4SHaojian Zhuang.section .rodata.rev_err_str, "aS"
1722f2abcf4SHaojian Zhuangplat_err_str:
1732f2abcf4SHaojian Zhuang	.asciz "\nPlatform exception reporting:"
1742f2abcf4SHaojian Zhuangesr_el3_str:
1752f2abcf4SHaojian Zhuang	.asciz "\nESR_EL3: "
1762f2abcf4SHaojian Zhuangelr_el3_str:
1772f2abcf4SHaojian Zhuang	.asciz "\nELR_EL3: "
1782f2abcf4SHaojian Zhuangesr_el1_str:
1792f2abcf4SHaojian Zhuang	.asciz "\nESR_EL1: "
1802f2abcf4SHaojian Zhuangelr_el1_str:
1812f2abcf4SHaojian Zhuang	.asciz "\nELR_EL1: "
182