1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <cpu_macros.S> 10*91f16700Schasinglulu#include <platform_def.h> 11*91f16700Schasinglulu#include <el3_common_macros.S> 12*91f16700Schasinglulu 13*91f16700Schasinglulu .globl plat_secondary_cold_boot_setup 14*91f16700Schasinglulu .globl platform_is_primary_cpu 15*91f16700Schasinglulu .globl plat_is_my_cpu_primary 16*91f16700Schasinglulu .globl plat_my_core_pos 17*91f16700Schasinglulu .globl plat_crash_console_init 18*91f16700Schasinglulu .globl plat_crash_console_putc 19*91f16700Schasinglulu .globl plat_crash_console_flush 20*91f16700Schasinglulu .globl platform_mem_init 21*91f16700Schasinglulu .globl plat_secondary_cpus_bl31_entry 22*91f16700Schasinglulu 23*91f16700Schasinglulu .globl plat_get_my_entrypoint 24*91f16700Schasinglulu 25*91f16700Schasinglulu /* ----------------------------------------------------- 26*91f16700Schasinglulu * void plat_secondary_cold_boot_setup (void); 27*91f16700Schasinglulu * 28*91f16700Schasinglulu * This function performs any platform specific actions 29*91f16700Schasinglulu * needed for a secondary cpu after a cold reset e.g 30*91f16700Schasinglulu * mark the cpu's presence, mechanism to place it in a 31*91f16700Schasinglulu * holding pen etc. 32*91f16700Schasinglulu * ----------------------------------------------------- 33*91f16700Schasinglulu */ 34*91f16700Schasinglulufunc plat_secondary_cold_boot_setup 35*91f16700Schasinglulu /* Wait until the it gets reset signal from rstmgr gets populated */ 36*91f16700Schasinglulupoll_mailbox: 37*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 38*91f16700Schasinglulu mov_imm x0, PLAT_SEC_ENTRY 39*91f16700Schasinglulu cbz x0, poll_mailbox 40*91f16700Schasinglulu br x0 41*91f16700Schasinglulu#else 42*91f16700Schasinglulu wfi 43*91f16700Schasinglulu mov_imm x0, PLAT_SEC_ENTRY 44*91f16700Schasinglulu ldr x1, [x0] 45*91f16700Schasinglulu mov_imm x2, PLAT_CPUID_RELEASE 46*91f16700Schasinglulu ldr x3, [x2] 47*91f16700Schasinglulu mrs x4, mpidr_el1 48*91f16700Schasinglulu and x4, x4, #0xff 49*91f16700Schasinglulu cmp x3, x4 50*91f16700Schasinglulu b.ne poll_mailbox 51*91f16700Schasinglulu br x1 52*91f16700Schasinglulu#endif 53*91f16700Schasingluluendfunc plat_secondary_cold_boot_setup 54*91f16700Schasinglulu 55*91f16700Schasinglulu#if ((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \ 56*91f16700Schasinglulu (PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \ 57*91f16700Schasinglulu (PLATFORM_MODEL == PLAT_SOCFPGA_N5X)) 58*91f16700Schasinglulu 59*91f16700Schasinglulufunc platform_is_primary_cpu 60*91f16700Schasinglulu and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 61*91f16700Schasinglulu cmp x0, #PLAT_PRIMARY_CPU 62*91f16700Schasinglulu cset x0, eq 63*91f16700Schasinglulu ret 64*91f16700Schasingluluendfunc platform_is_primary_cpu 65*91f16700Schasinglulu 66*91f16700Schasinglulu#else 67*91f16700Schasinglulu 68*91f16700Schasinglulufunc platform_is_primary_cpu 69*91f16700Schasinglulu and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 70*91f16700Schasinglulu cmp x0, #(PLAT_PRIMARY_CPU_A76) 71*91f16700Schasinglulu b.eq primary_cpu 72*91f16700Schasinglulu cmp x0, #(PLAT_PRIMARY_CPU_A55) 73*91f16700Schasinglulu b.eq primary_cpu 74*91f16700Schasingluluprimary_cpu: 75*91f16700Schasinglulu cset x0, eq 76*91f16700Schasinglulu ret 77*91f16700Schasingluluendfunc platform_is_primary_cpu 78*91f16700Schasinglulu 79*91f16700Schasinglulu#endif 80*91f16700Schasinglulu 81*91f16700Schasinglulufunc plat_is_my_cpu_primary 82*91f16700Schasinglulu mrs x0, mpidr_el1 83*91f16700Schasinglulu b platform_is_primary_cpu 84*91f16700Schasingluluendfunc plat_is_my_cpu_primary 85*91f16700Schasinglulu 86*91f16700Schasinglulufunc plat_my_core_pos 87*91f16700Schasinglulu mrs x0, mpidr_el1 88*91f16700Schasinglulu and x1, x0, #MPIDR_CPU_MASK 89*91f16700Schasinglulu and x0, x0, #MPIDR_CLUSTER_MASK 90*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 91*91f16700Schasinglulu add x0, x1, x0, LSR #8 92*91f16700Schasinglulu#else 93*91f16700Schasinglulu add x0, x1, x0, LSR #6 94*91f16700Schasinglulu#endif 95*91f16700Schasinglulu ret 96*91f16700Schasingluluendfunc plat_my_core_pos 97*91f16700Schasinglulu 98*91f16700Schasinglulufunc warm_reset_req 99*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 100*91f16700Schasinglulu bl plat_is_my_cpu_primary 101*91f16700Schasinglulu cbnz x0, warm_reset 102*91f16700Schasingluluwarm_reset: 103*91f16700Schasinglulu mov_imm x1, PLAT_SEC_ENTRY 104*91f16700Schasinglulu str xzr, [x1] 105*91f16700Schasinglulu mrs x1, rmr_el3 106*91f16700Schasinglulu orr x1, x1, #0x02 107*91f16700Schasinglulu msr rmr_el3, x1 108*91f16700Schasinglulu isb 109*91f16700Schasinglulu dsb sy 110*91f16700Schasinglulu#else 111*91f16700Schasinglulu str xzr, [x4] 112*91f16700Schasinglulu bl plat_is_my_cpu_primary 113*91f16700Schasinglulu cbz x0, cpu_in_wfi 114*91f16700Schasinglulu mov_imm x1, PLAT_SEC_ENTRY 115*91f16700Schasinglulu str xzr, [x1] 116*91f16700Schasinglulu mrs x1, rmr_el3 117*91f16700Schasinglulu orr x1, x1, #0x02 118*91f16700Schasinglulu msr rmr_el3, x1 119*91f16700Schasinglulu isb 120*91f16700Schasinglulu dsb sy 121*91f16700Schasinglulucpu_in_wfi: 122*91f16700Schasinglulu wfi 123*91f16700Schasinglulu b cpu_in_wfi 124*91f16700Schasinglulu#endif 125*91f16700Schasingluluendfunc warm_reset_req 126*91f16700Schasinglulu 127*91f16700Schasinglulu/* TODO: Zephyr warm reset test */ 128*91f16700Schasinglulu#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 129*91f16700Schasinglulufunc plat_get_my_entrypoint 130*91f16700Schasinglulu ldr x4, =L2_RESET_DONE_REG 131*91f16700Schasinglulu ldr x5, [x4] 132*91f16700Schasinglulu ldr x1, =PLAT_L2_RESET_REQ 133*91f16700Schasinglulu cmp x1, x5 134*91f16700Schasinglulu b.eq zephyr_reset_req 135*91f16700Schasinglulu mov_imm x1, PLAT_SEC_ENTRY 136*91f16700Schasinglulu ldr x0, [x1] 137*91f16700Schasinglulu ret 138*91f16700Schasingluluzephyr_reset_req: 139*91f16700Schasinglulu ldr x0, =0x00 140*91f16700Schasinglulu ret 141*91f16700Schasingluluendfunc plat_get_my_entrypoint 142*91f16700Schasinglulu#else 143*91f16700Schasinglulufunc plat_get_my_entrypoint 144*91f16700Schasinglulu ldr x4, =L2_RESET_DONE_REG 145*91f16700Schasinglulu ldr x5, [x4] 146*91f16700Schasinglulu ldr x1, =L2_RESET_DONE_STATUS 147*91f16700Schasinglulu cmp x1, x5 148*91f16700Schasinglulu b.eq warm_reset_req 149*91f16700Schasinglulu mov_imm x1, PLAT_SEC_ENTRY 150*91f16700Schasinglulu ldr x0, [x1] 151*91f16700Schasinglulu ret 152*91f16700Schasingluluendfunc plat_get_my_entrypoint 153*91f16700Schasinglulu#endif 154*91f16700Schasinglulu 155*91f16700Schasinglulu /* --------------------------------------------- 156*91f16700Schasinglulu * int plat_crash_console_init(void) 157*91f16700Schasinglulu * Function to initialize the crash console 158*91f16700Schasinglulu * without a C Runtime to print crash report. 159*91f16700Schasinglulu * Clobber list : x0, x1, x2 160*91f16700Schasinglulu * --------------------------------------------- 161*91f16700Schasinglulu */ 162*91f16700Schasinglulufunc plat_crash_console_init 163*91f16700Schasinglulu mov_imm x0, CRASH_CONSOLE_BASE 164*91f16700Schasinglulu mov_imm x1, PLAT_UART_CLOCK 165*91f16700Schasinglulu mov_imm x2, PLAT_BAUDRATE 166*91f16700Schasinglulu b console_16550_core_init 167*91f16700Schasingluluendfunc plat_crash_console_init 168*91f16700Schasinglulu 169*91f16700Schasinglulu /* --------------------------------------------- 170*91f16700Schasinglulu * int plat_crash_console_putc(void) 171*91f16700Schasinglulu * Function to print a character on the crash 172*91f16700Schasinglulu * console without a C Runtime. 173*91f16700Schasinglulu * Clobber list : x1, x2 174*91f16700Schasinglulu * --------------------------------------------- 175*91f16700Schasinglulu */ 176*91f16700Schasinglulufunc plat_crash_console_putc 177*91f16700Schasinglulu mov_imm x1, CRASH_CONSOLE_BASE 178*91f16700Schasinglulu b console_16550_core_putc 179*91f16700Schasingluluendfunc plat_crash_console_putc 180*91f16700Schasinglulu 181*91f16700Schasinglulufunc plat_crash_console_flush 182*91f16700Schasinglulu mov_imm x0, CRASH_CONSOLE_BASE 183*91f16700Schasinglulu b console_16550_core_flush 184*91f16700Schasingluluendfunc plat_crash_console_flush 185*91f16700Schasinglulu 186*91f16700Schasinglulu 187*91f16700Schasinglulu /* -------------------------------------------------------- 188*91f16700Schasinglulu * void platform_mem_init (void); 189*91f16700Schasinglulu * 190*91f16700Schasinglulu * Any memory init, relocation to be done before the 191*91f16700Schasinglulu * platform boots. Called very early in the boot process. 192*91f16700Schasinglulu * -------------------------------------------------------- 193*91f16700Schasinglulu */ 194*91f16700Schasinglulufunc platform_mem_init 195*91f16700Schasinglulu mov x0, #0 196*91f16700Schasinglulu ret 197*91f16700Schasingluluendfunc platform_mem_init 198*91f16700Schasinglulu 199*91f16700Schasinglulu /* -------------------------------------------------------- 200*91f16700Schasinglulu * macro plat_secondary_cpus_bl31_entry; 201*91f16700Schasinglulu * 202*91f16700Schasinglulu * el3_entrypoint_common init param configuration. 203*91f16700Schasinglulu * Called very early in the secondary cores boot process. 204*91f16700Schasinglulu * -------------------------------------------------------- 205*91f16700Schasinglulu */ 206*91f16700Schasinglulufunc plat_secondary_cpus_bl31_entry 207*91f16700Schasinglulu el3_entrypoint_common \ 208*91f16700Schasinglulu _init_sctlr=0 \ 209*91f16700Schasinglulu _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ 210*91f16700Schasinglulu _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ 211*91f16700Schasinglulu _init_memory=1 \ 212*91f16700Schasinglulu _init_c_runtime=1 \ 213*91f16700Schasinglulu _exception_vectors=runtime_exceptions \ 214*91f16700Schasinglulu _pie_fixup_size=BL31_LIMIT - BL31_BASE 215*91f16700Schasingluluendfunc plat_secondary_cpus_bl31_entry 216