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