1dddba19aSStephan Gerhold/* 2*7e002c8aSStephan 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> 9dddba19aSStephan Gerhold 10dddba19aSStephan Gerhold#include <msm8916_mmap.h> 11dddba19aSStephan Gerhold 12dddba19aSStephan Gerhold#define APCS_TCM_START_ADDR 0x10 13dddba19aSStephan Gerhold#define APCS_TCM_REDIRECT_EN_0 BIT_32(0) 14dddba19aSStephan Gerhold 15dddba19aSStephan Gerhold .globl plat_crash_console_init 16dddba19aSStephan Gerhold .globl plat_crash_console_putc 17dddba19aSStephan Gerhold .globl plat_crash_console_flush 18dddba19aSStephan Gerhold .globl plat_panic_handler 19dddba19aSStephan Gerhold .globl plat_my_core_pos 20dddba19aSStephan Gerhold .globl plat_get_my_entrypoint 21dddba19aSStephan Gerhold .globl plat_reset_handler 22dddba19aSStephan Gerhold .globl platform_mem_init 23dddba19aSStephan Gerhold .globl msm8916_entry_point 24dddba19aSStephan Gerhold 25dddba19aSStephan Gerhold /* ------------------------------------------------- 26dddba19aSStephan Gerhold * int plat_crash_console_init(void) 27dddba19aSStephan Gerhold * Initialize the crash console. 28dddba19aSStephan Gerhold * Out: x0 - 1 on success, 0 on error 29dddba19aSStephan Gerhold * Clobber list : x0 - x4 30dddba19aSStephan Gerhold * ------------------------------------------------- 31dddba19aSStephan Gerhold */ 32dddba19aSStephan Gerholdfunc plat_crash_console_init 33dddba19aSStephan Gerhold mov x1, #BLSP_UART2_BASE 34dddba19aSStephan Gerhold mov x0, #1 35dddba19aSStephan Gerhold b console_uartdm_core_init 36dddba19aSStephan Gerholdendfunc plat_crash_console_init 37dddba19aSStephan Gerhold 38dddba19aSStephan Gerhold /* ------------------------------------------------- 39dddba19aSStephan Gerhold * int plat_crash_console_putc(int c) 40dddba19aSStephan Gerhold * Print a character on the crash console. 41dddba19aSStephan Gerhold * In : w0 - character to be printed 42dddba19aSStephan Gerhold * Out: w0 - printed character on success 43dddba19aSStephan Gerhold * Clobber list : x1, x2 44dddba19aSStephan Gerhold * ------------------------------------------------- 45dddba19aSStephan Gerhold */ 46dddba19aSStephan Gerholdfunc plat_crash_console_putc 47dddba19aSStephan Gerhold mov x1, #BLSP_UART2_BASE 48dddba19aSStephan Gerhold b console_uartdm_core_putc 49dddba19aSStephan Gerholdendfunc plat_crash_console_putc 50dddba19aSStephan Gerhold 51dddba19aSStephan Gerhold /* ------------------------------------------------- 52dddba19aSStephan Gerhold * void plat_crash_console_flush(void) 53dddba19aSStephan Gerhold * Force a write of all buffered data that has not 54dddba19aSStephan Gerhold * been output. 55dddba19aSStephan Gerhold * Clobber list : x1, x2 56dddba19aSStephan Gerhold * ------------------------------------------------- 57dddba19aSStephan Gerhold */ 58dddba19aSStephan Gerholdfunc plat_crash_console_flush 59dddba19aSStephan Gerhold mov x1, #BLSP_UART2_BASE 60dddba19aSStephan Gerhold b console_uartdm_core_flush 61dddba19aSStephan Gerholdendfunc plat_crash_console_flush 62dddba19aSStephan Gerhold 63dddba19aSStephan Gerhold /* ------------------------------------------------- 64dddba19aSStephan Gerhold * void plat_panic_handler(void) __dead 65dddba19aSStephan Gerhold * Called when an unrecoverable error occurs. 66dddba19aSStephan Gerhold * ------------------------------------------------- 67dddba19aSStephan Gerhold */ 68dddba19aSStephan Gerholdfunc plat_panic_handler 69dddba19aSStephan Gerhold /* Try to shutdown/reset */ 70dddba19aSStephan Gerhold mov_imm x0, MPM_PS_HOLD 71dddba19aSStephan Gerhold str wzr, [x0] 72dddba19aSStephan Gerhold1: b 1b 73dddba19aSStephan Gerholdendfunc plat_panic_handler 74dddba19aSStephan Gerhold 75dddba19aSStephan Gerhold /* ------------------------------------------------- 76dddba19aSStephan Gerhold * unsigned int plat_my_core_pos(void) 77dddba19aSStephan Gerhold * Out: x0 - index of the calling CPU 78dddba19aSStephan Gerhold * ------------------------------------------------- 79dddba19aSStephan Gerhold */ 80dddba19aSStephan Gerholdfunc plat_my_core_pos 81dddba19aSStephan Gerhold /* There is just a single cluster so this is very simple */ 82dddba19aSStephan Gerhold mrs x0, mpidr_el1 83dddba19aSStephan Gerhold and x0, x0, #MPIDR_CPU_MASK 84dddba19aSStephan Gerhold ret 85dddba19aSStephan Gerholdendfunc plat_my_core_pos 86dddba19aSStephan Gerhold 87dddba19aSStephan Gerhold /* ------------------------------------------------- 88dddba19aSStephan Gerhold * uintptr_t plat_get_my_entrypoint(void) 89dddba19aSStephan Gerhold * Distinguish cold and warm boot and return warm boot 90dddba19aSStephan Gerhold * entry address if available. 91dddba19aSStephan Gerhold * Out: x0 - warm boot entry point or 0 on cold boot 92dddba19aSStephan Gerhold * ------------------------------------------------- 93dddba19aSStephan Gerhold */ 94dddba19aSStephan Gerholdfunc plat_get_my_entrypoint 95dddba19aSStephan Gerhold ldr x0, msm8916_entry_point 96dddba19aSStephan Gerhold ret 97dddba19aSStephan Gerholdendfunc plat_get_my_entrypoint 98dddba19aSStephan Gerhold 99dddba19aSStephan Gerhold /* ------------------------------------------------- 100dddba19aSStephan Gerhold * void plat_reset_handler(void) 101dddba19aSStephan Gerhold * Perform additional initialization after reset. 102dddba19aSStephan Gerhold * Clobber list : x0 - x18, x30 103dddba19aSStephan Gerhold * ------------------------------------------------- 104dddba19aSStephan Gerhold */ 105dddba19aSStephan Gerholdfunc plat_reset_handler 106dddba19aSStephan Gerhold /* 107dddba19aSStephan Gerhold * Check if the CPU is running at the correct address. 108dddba19aSStephan Gerhold * During cold boot the CPU enters here at the wrong address 109dddba19aSStephan Gerhold * using the "boot remapper". (It remaps the BL31_BASE to 110dddba19aSStephan Gerhold * the CPU reset address 0x0). 111dddba19aSStephan Gerhold */ 112dddba19aSStephan Gerhold mov x0, #BL31_BASE 113dddba19aSStephan Gerhold adr x1, bl31_entrypoint 114dddba19aSStephan Gerhold cmp x0, x1 115dddba19aSStephan Gerhold b.ne _remapped_cold_boot 116dddba19aSStephan Gerhold /* Already running at correct address, just return directly */ 117dddba19aSStephan Gerhold ret 118dddba19aSStephan Gerhold 119dddba19aSStephan Gerhold_remapped_cold_boot: 120dddba19aSStephan Gerhold /* 121dddba19aSStephan Gerhold * The previous boot stage seems to use the L2 cache as TCM. 122dddba19aSStephan Gerhold * Disable the TCM redirect before enabling caches to avoid 123dddba19aSStephan Gerhold * strange crashes. 124dddba19aSStephan Gerhold */ 125dddba19aSStephan Gerhold mov x2, #APCS_CFG 126dddba19aSStephan Gerhold ldr w3, [x2, #APCS_TCM_START_ADDR] 127dddba19aSStephan Gerhold and w3, w3, #~APCS_TCM_REDIRECT_EN_0 128dddba19aSStephan Gerhold str w3, [x2, #APCS_TCM_START_ADDR] 129dddba19aSStephan Gerhold 130dddba19aSStephan Gerhold /* Enter BL31 again at the real address */ 131dddba19aSStephan Gerhold br x0 132dddba19aSStephan Gerholdendfunc plat_reset_handler 133dddba19aSStephan Gerhold 134dddba19aSStephan Gerhold /* ------------------------------------------------- 135dddba19aSStephan Gerhold * void platform_mem_init(void) 136dddba19aSStephan Gerhold * Performs additional memory initialization early 137dddba19aSStephan Gerhold * in the boot process. 138dddba19aSStephan Gerhold * ------------------------------------------------- 139dddba19aSStephan Gerhold */ 140dddba19aSStephan Gerholdfunc platform_mem_init 141dddba19aSStephan Gerhold /* Nothing to do here, all memory is already initialized */ 142dddba19aSStephan Gerhold ret 143dddba19aSStephan Gerholdendfunc platform_mem_init 144dddba19aSStephan Gerhold 145dddba19aSStephan Gerhold .data 146dddba19aSStephan Gerhold .align 3 147dddba19aSStephan Gerhold 148dddba19aSStephan Gerhold /* ------------------------------------------------- 149dddba19aSStephan Gerhold * Warm boot entry point for CPU. Set by PSCI code. 150dddba19aSStephan Gerhold * ------------------------------------------------- 151dddba19aSStephan Gerhold */ 152dddba19aSStephan Gerholdmsm8916_entry_point: 153dddba19aSStephan Gerhold .quad 0 154