1dddba19aSStephan Gerhold/* 27e002c8aSStephan Gerhold * Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net> 3dddba19aSStephan Gerhold * 4dddba19aSStephan Gerhold * SPDX-License-Identifier: BSD-3-Clause 5dddba19aSStephan Gerhold */ 6dddba19aSStephan Gerhold 7dddba19aSStephan Gerhold#include <arch.h> 8dddba19aSStephan Gerhold#include <asm_macros.S> 91d7ed58fSStephan Gerhold#include <platform_def.h> 10dddba19aSStephan Gerhold 11dddba19aSStephan Gerhold#include <msm8916_mmap.h> 12dddba19aSStephan Gerhold 13*d9e565eaSStephan Gerhold#if PLATFORM_CORE_COUNT > 1 14dddba19aSStephan Gerhold#define APCS_TCM_START_ADDR 0x10 15*d9e565eaSStephan Gerhold#else 16*d9e565eaSStephan Gerhold#define APCS_TCM_START_ADDR 0x34 17*d9e565eaSStephan Gerhold#endif 18dddba19aSStephan Gerhold#define APCS_TCM_REDIRECT_EN_0 BIT_32(0) 19dddba19aSStephan Gerhold 20dddba19aSStephan Gerhold .globl plat_crash_console_init 21dddba19aSStephan Gerhold .globl plat_crash_console_putc 22dddba19aSStephan Gerhold .globl plat_crash_console_flush 23dddba19aSStephan Gerhold .globl plat_panic_handler 24dddba19aSStephan Gerhold .globl plat_my_core_pos 25dddba19aSStephan Gerhold .globl plat_get_my_entrypoint 26dddba19aSStephan Gerhold .globl plat_reset_handler 27dddba19aSStephan Gerhold .globl platform_mem_init 28dddba19aSStephan Gerhold .globl msm8916_entry_point 29dddba19aSStephan Gerhold 30dddba19aSStephan Gerhold /* ------------------------------------------------- 31dddba19aSStephan Gerhold * int plat_crash_console_init(void) 32dddba19aSStephan Gerhold * Initialize the crash console. 33dddba19aSStephan Gerhold * Out: x0 - 1 on success, 0 on error 34dddba19aSStephan Gerhold * Clobber list : x0 - x4 35dddba19aSStephan Gerhold * ------------------------------------------------- 36dddba19aSStephan Gerhold */ 37dddba19aSStephan Gerholdfunc plat_crash_console_init 38aad23f1aSStephan Gerhold mov_imm x1, BLSP_UART_BASE 39dddba19aSStephan Gerhold mov x0, #1 40dddba19aSStephan Gerhold b console_uartdm_core_init 41dddba19aSStephan Gerholdendfunc plat_crash_console_init 42dddba19aSStephan Gerhold 43dddba19aSStephan Gerhold /* ------------------------------------------------- 44dddba19aSStephan Gerhold * int plat_crash_console_putc(int c) 45dddba19aSStephan Gerhold * Print a character on the crash console. 46dddba19aSStephan Gerhold * In : w0 - character to be printed 47dddba19aSStephan Gerhold * Out: w0 - printed character on success 48dddba19aSStephan Gerhold * Clobber list : x1, x2 49dddba19aSStephan Gerhold * ------------------------------------------------- 50dddba19aSStephan Gerhold */ 51dddba19aSStephan Gerholdfunc plat_crash_console_putc 52aad23f1aSStephan Gerhold mov_imm x1, BLSP_UART_BASE 53dddba19aSStephan Gerhold b console_uartdm_core_putc 54dddba19aSStephan Gerholdendfunc plat_crash_console_putc 55dddba19aSStephan Gerhold 56dddba19aSStephan Gerhold /* ------------------------------------------------- 57dddba19aSStephan Gerhold * void plat_crash_console_flush(void) 58dddba19aSStephan Gerhold * Force a write of all buffered data that has not 59dddba19aSStephan Gerhold * been output. 60dddba19aSStephan Gerhold * Clobber list : x1, x2 61dddba19aSStephan Gerhold * ------------------------------------------------- 62dddba19aSStephan Gerhold */ 63dddba19aSStephan Gerholdfunc plat_crash_console_flush 64aad23f1aSStephan Gerhold mov_imm x1, BLSP_UART_BASE 65dddba19aSStephan Gerhold b console_uartdm_core_flush 66dddba19aSStephan Gerholdendfunc plat_crash_console_flush 67dddba19aSStephan Gerhold 68dddba19aSStephan Gerhold /* ------------------------------------------------- 69dddba19aSStephan Gerhold * void plat_panic_handler(void) __dead 70dddba19aSStephan Gerhold * Called when an unrecoverable error occurs. 71dddba19aSStephan Gerhold * ------------------------------------------------- 72dddba19aSStephan Gerhold */ 73dddba19aSStephan Gerholdfunc plat_panic_handler 74dddba19aSStephan Gerhold /* Try to shutdown/reset */ 75dddba19aSStephan Gerhold mov_imm x0, MPM_PS_HOLD 76dddba19aSStephan Gerhold str wzr, [x0] 77dddba19aSStephan Gerhold1: b 1b 78dddba19aSStephan Gerholdendfunc plat_panic_handler 79dddba19aSStephan Gerhold 80dddba19aSStephan Gerhold /* ------------------------------------------------- 81dddba19aSStephan Gerhold * unsigned int plat_my_core_pos(void) 82dddba19aSStephan Gerhold * Out: x0 - index of the calling CPU 83dddba19aSStephan Gerhold * ------------------------------------------------- 84dddba19aSStephan Gerhold */ 85dddba19aSStephan Gerholdfunc plat_my_core_pos 86*d9e565eaSStephan Gerhold .if PLATFORM_CORE_COUNT > 1 871d7ed58fSStephan Gerhold mrs x1, mpidr_el1 881d7ed58fSStephan Gerhold and x0, x1, #MPIDR_CPU_MASK 891d7ed58fSStephan Gerhold .if PLATFORM_CLUSTER_COUNT > 1 901d7ed58fSStephan Gerhold and x1, x1, #MPIDR_CLUSTER_MASK 911d7ed58fSStephan Gerhold orr x0, x0, x1, LSR #(MPIDR_AFFINITY_BITS - \ 921d7ed58fSStephan Gerhold PLATFORM_CPU_PER_CLUSTER_SHIFT) 931d7ed58fSStephan Gerhold .endif 94*d9e565eaSStephan Gerhold .else 95*d9e565eaSStephan Gerhold /* There is just a single core so always 0 */ 96*d9e565eaSStephan Gerhold mov x0, #0 97*d9e565eaSStephan Gerhold .endif 98dddba19aSStephan Gerhold ret 99dddba19aSStephan Gerholdendfunc plat_my_core_pos 100dddba19aSStephan Gerhold 101dddba19aSStephan Gerhold /* ------------------------------------------------- 102dddba19aSStephan Gerhold * uintptr_t plat_get_my_entrypoint(void) 103dddba19aSStephan Gerhold * Distinguish cold and warm boot and return warm boot 104dddba19aSStephan Gerhold * entry address if available. 105dddba19aSStephan Gerhold * Out: x0 - warm boot entry point or 0 on cold boot 106dddba19aSStephan Gerhold * ------------------------------------------------- 107dddba19aSStephan Gerhold */ 108dddba19aSStephan Gerholdfunc plat_get_my_entrypoint 109dddba19aSStephan Gerhold ldr x0, msm8916_entry_point 11025132f78SStephan Gerhold cbz x0, 1f 11125132f78SStephan Gerhold ret 11225132f78SStephan Gerhold1: 11325132f78SStephan Gerhold /* 11425132f78SStephan Gerhold * Cold boot: Disable TCM redirect to L2 cache as early as 11525132f78SStephan Gerhold * possible to avoid crashes when making use of the cache. 11625132f78SStephan Gerhold */ 1171d7ed58fSStephan Gerhold mov_imm x1, APCS_CFG(0) 11825132f78SStephan Gerhold ldr w2, [x1, #APCS_TCM_START_ADDR] 11925132f78SStephan Gerhold and w2, w2, #~APCS_TCM_REDIRECT_EN_0 12025132f78SStephan Gerhold str w2, [x1, #APCS_TCM_START_ADDR] 12125132f78SStephan Gerhold 12225132f78SStephan Gerhold /* 12325132f78SStephan Gerhold * After reset the CPU always starts executing at the fixed reset 12425132f78SStephan Gerhold * address (0x0), which does not match the link address of BL31. 12525132f78SStephan Gerhold * The "boot remapper" redirects all memory accesses to the real 12625132f78SStephan Gerhold * physical address in DRAM. 12725132f78SStephan Gerhold * 12825132f78SStephan Gerhold * For warm boots, this is already handled by loading the real 12925132f78SStephan Gerhold * entry point address above. 13025132f78SStephan Gerhold * 13125132f78SStephan Gerhold * For cold boots, check if the CPU is using the boot remapper, 13225132f78SStephan Gerhold * i.e. if bl31_entrypoint appears to be at the reset address (0x0). 13325132f78SStephan Gerhold */ 13425132f78SStephan Gerhold adr x1, bl31_entrypoint 13525132f78SStephan Gerhold cbnz x1, 2f 13625132f78SStephan Gerhold 13725132f78SStephan Gerhold /* 13825132f78SStephan Gerhold * Add the real BL31_BASE offset to the return address in the link 13925132f78SStephan Gerhold * register so the CPU will continue at the real address after return. 14025132f78SStephan Gerhold */ 14125132f78SStephan Gerhold mov_imm x1, BL31_BASE 14225132f78SStephan Gerhold add lr, lr, x1 14325132f78SStephan Gerhold2: 144dddba19aSStephan Gerhold ret 145dddba19aSStephan Gerholdendfunc plat_get_my_entrypoint 146dddba19aSStephan Gerhold 147dddba19aSStephan Gerhold /* ------------------------------------------------- 148dddba19aSStephan Gerhold * void platform_mem_init(void) 149dddba19aSStephan Gerhold * Performs additional memory initialization early 150dddba19aSStephan Gerhold * in the boot process. 151dddba19aSStephan Gerhold * ------------------------------------------------- 152dddba19aSStephan Gerhold */ 153dddba19aSStephan Gerholdfunc platform_mem_init 154dddba19aSStephan Gerhold /* Nothing to do here, all memory is already initialized */ 155dddba19aSStephan Gerhold ret 156dddba19aSStephan Gerholdendfunc platform_mem_init 157dddba19aSStephan Gerhold 158dddba19aSStephan Gerhold .data 159dddba19aSStephan Gerhold .align 3 160dddba19aSStephan Gerhold 161dddba19aSStephan Gerhold /* ------------------------------------------------- 162dddba19aSStephan Gerhold * Warm boot entry point for CPU. Set by PSCI code. 163dddba19aSStephan Gerhold * ------------------------------------------------- 164dddba19aSStephan Gerhold */ 165dddba19aSStephan Gerholdmsm8916_entry_point: 166dddba19aSStephan Gerhold .quad 0 167