mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 02:24:18 +00:00

And from crash_console_flush. We ignore the error information return by console_flush in _every_ place where we call it, and casting the return type to void does not work around the MISRA violation that this causes. Instead, we collect the error information from the driver (to avoid changing that API), and don't return it to the caller. Change-Id: I1e35afe01764d5c8f0efd04f8949d333ffb688c1 Signed-off-by: Jimmy Brisson <jimmy.brisson@arm.com>
155 lines
4.7 KiB
ArmAsm
155 lines
4.7 KiB
ArmAsm
/*
|
|
* Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <arch.h>
|
|
#include <asm_macros.S>
|
|
#include <cortex_a72.h>
|
|
#include <cpu_macros.S>
|
|
#include <platform_def.h>
|
|
|
|
#define K3_BOOT_REASON_COLD_RESET 0x1
|
|
|
|
/* ------------------------------------------------------------------
|
|
* uintptr_t plat_get_my_entrypoint(void)
|
|
* ------------------------------------------------------------------
|
|
*
|
|
* This function is called with the called with the MMU and caches
|
|
* disabled (SCTLR_EL3.M = 0 and SCTLR_EL3.C = 0). The function is
|
|
* responsible for distinguishing between a warm and cold reset for the
|
|
* current CPU using platform-specific means. If it's a warm reset,
|
|
* then it returns the warm reset entrypoint point provided to
|
|
* plat_setup_psci_ops() during BL31 initialization. If it's a cold
|
|
* reset then this function must return zero.
|
|
*
|
|
* This function does not follow the Procedure Call Standard used by
|
|
* the Application Binary Interface for the ARM 64-bit architecture.
|
|
* The caller should not assume that callee saved registers are
|
|
* preserved across a call to this function.
|
|
*/
|
|
.globl plat_get_my_entrypoint
|
|
func plat_get_my_entrypoint
|
|
ldr x0, k3_boot_reason_data_store
|
|
cmp x0, #K3_BOOT_REASON_COLD_RESET
|
|
|
|
/* We ONLY support cold boot at this point */
|
|
bne plat_unsupported_boot
|
|
mov x0, #0
|
|
ret
|
|
|
|
/*
|
|
* We self manage our boot reason.
|
|
* At load time, we have just a default reason - which is cold reset
|
|
*/
|
|
k3_boot_reason_data_store:
|
|
.word K3_BOOT_REASON_COLD_RESET
|
|
|
|
plat_unsupported_boot:
|
|
b plat_unsupported_boot
|
|
|
|
endfunc plat_get_my_entrypoint
|
|
|
|
/* ------------------------------------------------------------------
|
|
* unsigned int plat_my_core_pos(void)
|
|
* ------------------------------------------------------------------
|
|
*
|
|
* This function returns the index of the calling CPU which is used as a
|
|
* CPU-specific linear index into blocks of memory (for example while
|
|
* allocating per-CPU stacks). This function will be invoked very early
|
|
* in the initialization sequence which mandates that this function
|
|
* should be implemented in assembly and should not rely on the
|
|
* avalability of a C runtime environment. This function can clobber x0
|
|
* - x8 and must preserve x9 - x29.
|
|
*
|
|
* This function plays a crucial role in the power domain topology
|
|
* framework in PSCI and details of this can be found in Power Domain
|
|
* Topology Design.
|
|
*/
|
|
.globl plat_my_core_pos
|
|
func plat_my_core_pos
|
|
mrs x0, MPIDR_EL1
|
|
|
|
and x1, x0, #MPIDR_CLUSTER_MASK
|
|
lsr x1, x1, #MPIDR_AFF1_SHIFT
|
|
and x0, x0, #MPIDR_CPU_MASK
|
|
|
|
cmp x1, 0
|
|
b.eq out
|
|
add x0, x0, #K3_CLUSTER0_CORE_COUNT
|
|
|
|
cmp x1, 1
|
|
b.eq out
|
|
add x0, x0, #K3_CLUSTER1_CORE_COUNT
|
|
|
|
cmp x1, 2
|
|
b.eq out
|
|
add x0, x0, #K3_CLUSTER2_CORE_COUNT
|
|
|
|
out:
|
|
ret
|
|
endfunc plat_my_core_pos
|
|
|
|
/* --------------------------------------------------------------------
|
|
* This handler does the following:
|
|
* - Set the L2 Data RAM latency to 2 (i.e. 3 cycles) for Cortex-A72
|
|
* --------------------------------------------------------------------
|
|
*/
|
|
.globl plat_reset_handler
|
|
func plat_reset_handler
|
|
/* Only on Cortex-A72 */
|
|
jump_if_cpu_midr CORTEX_A72_MIDR, a72
|
|
ret
|
|
|
|
/* Cortex-A72 specific settings */
|
|
a72:
|
|
mrs x0, CORTEX_A72_L2CTLR_EL1
|
|
orr x0, x0, #(CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT)
|
|
msr CORTEX_A72_L2CTLR_EL1, x0
|
|
isb
|
|
ret
|
|
endfunc plat_reset_handler
|
|
|
|
/* ---------------------------------------------
|
|
* int plat_crash_console_init(void)
|
|
* Function to initialize the crash console
|
|
* without a C Runtime to print crash report.
|
|
* Clobber list : x0 - x4
|
|
* ---------------------------------------------
|
|
*/
|
|
.globl plat_crash_console_init
|
|
func plat_crash_console_init
|
|
mov_imm x0, CRASH_CONSOLE_BASE
|
|
mov_imm x1, CRASH_CONSOLE_CLK
|
|
mov_imm x2, CRASH_CONSOLE_BAUD_RATE
|
|
mov w3, #0x0
|
|
b console_16550_core_init
|
|
endfunc plat_crash_console_init
|
|
|
|
/* ---------------------------------------------
|
|
* int plat_crash_console_putc(void)
|
|
* Function to print a character on the crash
|
|
* console without a C Runtime.
|
|
* Clobber list : x1, x2
|
|
* ---------------------------------------------
|
|
*/
|
|
.globl plat_crash_console_putc
|
|
func plat_crash_console_putc
|
|
mov_imm x1, CRASH_CONSOLE_BASE
|
|
b console_16550_core_putc
|
|
endfunc plat_crash_console_putc
|
|
|
|
/* ---------------------------------------------
|
|
* void plat_crash_console_flush()
|
|
* Function to force a write of all buffered
|
|
* data that hasn't been output.
|
|
* Out : void.
|
|
* Clobber list : x0, x1
|
|
* ---------------------------------------------
|
|
*/
|
|
.globl plat_crash_console_flush
|
|
func plat_crash_console_flush
|
|
mov_imm x0, CRASH_CONSOLE_BASE
|
|
b console_16550_core_flush
|
|
endfunc plat_crash_console_flush
|