13f7b1490SHadi Asyrafi/* 26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 33f7b1490SHadi Asyrafi * 43f7b1490SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause 53f7b1490SHadi Asyrafi */ 63f7b1490SHadi Asyrafi 73f7b1490SHadi Asyrafi#include <arch.h> 83f7b1490SHadi Asyrafi#include <asm_macros.S> 93f7b1490SHadi Asyrafi#include <cpu_macros.S> 103f7b1490SHadi Asyrafi#include <platform_def.h> 112db1e766SHadi Asyrafi#include <el3_common_macros.S> 123f7b1490SHadi Asyrafi 133f7b1490SHadi Asyrafi .globl plat_secondary_cold_boot_setup 143f7b1490SHadi Asyrafi .globl platform_is_primary_cpu 153f7b1490SHadi Asyrafi .globl plat_is_my_cpu_primary 163f7b1490SHadi Asyrafi .globl plat_my_core_pos 173f7b1490SHadi Asyrafi .globl plat_crash_console_init 183f7b1490SHadi Asyrafi .globl plat_crash_console_putc 193f7b1490SHadi Asyrafi .globl plat_crash_console_flush 203f7b1490SHadi Asyrafi .globl platform_mem_init 212db1e766SHadi Asyrafi .globl plat_secondary_cpus_bl31_entry 223f7b1490SHadi Asyrafi 233f7b1490SHadi Asyrafi .globl plat_get_my_entrypoint 243f7b1490SHadi Asyrafi 253f7b1490SHadi Asyrafi /* ----------------------------------------------------- 263f7b1490SHadi Asyrafi * void plat_secondary_cold_boot_setup (void); 273f7b1490SHadi Asyrafi * 283f7b1490SHadi Asyrafi * This function performs any platform specific actions 293f7b1490SHadi Asyrafi * needed for a secondary cpu after a cold reset e.g 303f7b1490SHadi Asyrafi * mark the cpu's presence, mechanism to place it in a 313f7b1490SHadi Asyrafi * holding pen etc. 323f7b1490SHadi Asyrafi * ----------------------------------------------------- 333f7b1490SHadi Asyrafi */ 343f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup 353f7b1490SHadi Asyrafi /* Wait until the it gets reset signal from rstmgr gets populated */ 363f7b1490SHadi Asyrafipoll_mailbox: 37*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 38*7931d332SJit Loon Lim mov_imm x0, PLAT_SEC_ENTRY 39*7931d332SJit Loon Lim cbz x0, poll_mailbox 40*7931d332SJit Loon Lim br x0 41*7931d332SJit Loon Lim#else 423f7b1490SHadi Asyrafi wfi 433f7b1490SHadi Asyrafi mov_imm x0, PLAT_SEC_ENTRY 443f7b1490SHadi Asyrafi ldr x1, [x0] 453f7b1490SHadi Asyrafi mov_imm x2, PLAT_CPUID_RELEASE 463f7b1490SHadi Asyrafi ldr x3, [x2] 473f7b1490SHadi Asyrafi mrs x4, mpidr_el1 483f7b1490SHadi Asyrafi and x4, x4, #0xff 493f7b1490SHadi Asyrafi cmp x3, x4 503f7b1490SHadi Asyrafi b.ne poll_mailbox 513f7b1490SHadi Asyrafi br x1 52*7931d332SJit Loon Lim#endif 533f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup 543f7b1490SHadi Asyrafi 55*7931d332SJit Loon Lim#if ((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \ 56*7931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \ 57*7931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_N5X)) 58*7931d332SJit Loon Lim 593f7b1490SHadi Asyrafifunc platform_is_primary_cpu 603f7b1490SHadi Asyrafi and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 613f7b1490SHadi Asyrafi cmp x0, #PLAT_PRIMARY_CPU 623f7b1490SHadi Asyrafi cset x0, eq 633f7b1490SHadi Asyrafi ret 643f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu 653f7b1490SHadi Asyrafi 66*7931d332SJit Loon Lim#else 67*7931d332SJit Loon Lim 68*7931d332SJit Loon Limfunc platform_is_primary_cpu 69*7931d332SJit Loon Lim and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 70*7931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A76) 71*7931d332SJit Loon Lim b.eq primary_cpu 72*7931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A55) 73*7931d332SJit Loon Lim b.eq primary_cpu 74*7931d332SJit Loon Limprimary_cpu: 75*7931d332SJit Loon Lim cset x0, eq 76*7931d332SJit Loon Lim ret 77*7931d332SJit Loon Limendfunc platform_is_primary_cpu 78*7931d332SJit Loon Lim 79*7931d332SJit Loon Lim#endif 80*7931d332SJit Loon Lim 813f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary 823f7b1490SHadi Asyrafi mrs x0, mpidr_el1 833f7b1490SHadi Asyrafi b platform_is_primary_cpu 843f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary 853f7b1490SHadi Asyrafi 863f7b1490SHadi Asyrafifunc plat_my_core_pos 873f7b1490SHadi Asyrafi mrs x0, mpidr_el1 883f7b1490SHadi Asyrafi and x1, x0, #MPIDR_CPU_MASK 893f7b1490SHadi Asyrafi and x0, x0, #MPIDR_CLUSTER_MASK 90*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 91*7931d332SJit Loon Lim add x0, x1, x0, LSR #8 92*7931d332SJit Loon Lim#else 933f7b1490SHadi Asyrafi add x0, x1, x0, LSR #6 94*7931d332SJit Loon Lim#endif 953f7b1490SHadi Asyrafi ret 963f7b1490SHadi Asyrafiendfunc plat_my_core_pos 973f7b1490SHadi Asyrafi 9832cf34acSHadi Asyrafifunc warm_reset_req 99*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 100*7931d332SJit Loon Lim bl plat_is_my_cpu_primary 101*7931d332SJit Loon Lim cbnz x0, warm_reset 102*7931d332SJit Loon Limwarm_reset: 103*7931d332SJit Loon Lim mov_imm x1, PLAT_SEC_ENTRY 104*7931d332SJit Loon Lim str xzr, [x1] 105*7931d332SJit Loon Lim mrs x1, rmr_el3 106*7931d332SJit Loon Lim orr x1, x1, #0x02 107*7931d332SJit Loon Lim msr rmr_el3, x1 108*7931d332SJit Loon Lim isb 109*7931d332SJit Loon Lim dsb sy 110*7931d332SJit Loon Lim#else 11132cf34acSHadi Asyrafi str xzr, [x4] 11232cf34acSHadi Asyrafi bl plat_is_my_cpu_primary 11332cf34acSHadi Asyrafi cbz x0, cpu_in_wfi 11432cf34acSHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 11532cf34acSHadi Asyrafi str xzr, [x1] 11632cf34acSHadi Asyrafi mrs x1, rmr_el3 11732cf34acSHadi Asyrafi orr x1, x1, #0x02 11832cf34acSHadi Asyrafi msr rmr_el3, x1 11932cf34acSHadi Asyrafi isb 12032cf34acSHadi Asyrafi dsb sy 12132cf34acSHadi Asyraficpu_in_wfi: 12232cf34acSHadi Asyrafi wfi 12332cf34acSHadi Asyrafi b cpu_in_wfi 124*7931d332SJit Loon Lim#endif 12532cf34acSHadi Asyrafiendfunc warm_reset_req 12632cf34acSHadi Asyrafi 127*7931d332SJit Loon Lim/* TODO: Zephyr warm reset test */ 128*7931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 129*7931d332SJit Loon Limfunc plat_get_my_entrypoint 130*7931d332SJit Loon Lim ldr x4, =L2_RESET_DONE_REG 131*7931d332SJit Loon Lim ldr x5, [x4] 132*7931d332SJit Loon Lim ldr x1, =PLAT_L2_RESET_REQ 133*7931d332SJit Loon Lim cmp x1, x5 134*7931d332SJit Loon Lim b.eq zephyr_reset_req 135*7931d332SJit Loon Lim mov_imm x1, PLAT_SEC_ENTRY 136*7931d332SJit Loon Lim ldr x0, [x1] 137*7931d332SJit Loon Lim ret 138*7931d332SJit Loon Limzephyr_reset_req: 139*7931d332SJit Loon Lim ldr x0, =0x00 140*7931d332SJit Loon Lim ret 141*7931d332SJit Loon Limendfunc plat_get_my_entrypoint 142*7931d332SJit Loon Lim#else 1433f7b1490SHadi Asyrafifunc plat_get_my_entrypoint 14432cf34acSHadi Asyrafi ldr x4, =L2_RESET_DONE_REG 14532cf34acSHadi Asyrafi ldr x5, [x4] 14632cf34acSHadi Asyrafi ldr x1, =L2_RESET_DONE_STATUS 14732cf34acSHadi Asyrafi cmp x1, x5 14832cf34acSHadi Asyrafi b.eq warm_reset_req 1493f7b1490SHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 1503f7b1490SHadi Asyrafi ldr x0, [x1] 1513f7b1490SHadi Asyrafi ret 1523f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint 153*7931d332SJit Loon Lim#endif 15432cf34acSHadi Asyrafi 1553f7b1490SHadi Asyrafi /* --------------------------------------------- 1563f7b1490SHadi Asyrafi * int plat_crash_console_init(void) 1573f7b1490SHadi Asyrafi * Function to initialize the crash console 1583f7b1490SHadi Asyrafi * without a C Runtime to print crash report. 1593f7b1490SHadi Asyrafi * Clobber list : x0, x1, x2 1603f7b1490SHadi Asyrafi * --------------------------------------------- 1613f7b1490SHadi Asyrafi */ 1623f7b1490SHadi Asyrafifunc plat_crash_console_init 163447e699fSBoon Khai Ng mov_imm x0, CRASH_CONSOLE_BASE 1643f7b1490SHadi Asyrafi mov_imm x1, PLAT_UART_CLOCK 1653f7b1490SHadi Asyrafi mov_imm x2, PLAT_BAUDRATE 1663f7b1490SHadi Asyrafi b console_16550_core_init 1673f7b1490SHadi Asyrafiendfunc plat_crash_console_init 1683f7b1490SHadi Asyrafi 1693f7b1490SHadi Asyrafi /* --------------------------------------------- 1703f7b1490SHadi Asyrafi * int plat_crash_console_putc(void) 1713f7b1490SHadi Asyrafi * Function to print a character on the crash 1723f7b1490SHadi Asyrafi * console without a C Runtime. 1733f7b1490SHadi Asyrafi * Clobber list : x1, x2 1743f7b1490SHadi Asyrafi * --------------------------------------------- 1753f7b1490SHadi Asyrafi */ 1763f7b1490SHadi Asyrafifunc plat_crash_console_putc 177447e699fSBoon Khai Ng mov_imm x1, CRASH_CONSOLE_BASE 1783f7b1490SHadi Asyrafi b console_16550_core_putc 1793f7b1490SHadi Asyrafiendfunc plat_crash_console_putc 1803f7b1490SHadi Asyrafi 1813f7b1490SHadi Asyrafifunc plat_crash_console_flush 1823f7b1490SHadi Asyrafi mov_imm x0, CRASH_CONSOLE_BASE 1833f7b1490SHadi Asyrafi b console_16550_core_flush 1843f7b1490SHadi Asyrafiendfunc plat_crash_console_flush 1853f7b1490SHadi Asyrafi 1863f7b1490SHadi Asyrafi 1873f7b1490SHadi Asyrafi /* -------------------------------------------------------- 1883f7b1490SHadi Asyrafi * void platform_mem_init (void); 1893f7b1490SHadi Asyrafi * 1903f7b1490SHadi Asyrafi * Any memory init, relocation to be done before the 1913f7b1490SHadi Asyrafi * platform boots. Called very early in the boot process. 1923f7b1490SHadi Asyrafi * -------------------------------------------------------- 1933f7b1490SHadi Asyrafi */ 1943f7b1490SHadi Asyrafifunc platform_mem_init 1953f7b1490SHadi Asyrafi mov x0, #0 1963f7b1490SHadi Asyrafi ret 1973f7b1490SHadi Asyrafiendfunc platform_mem_init 1982db1e766SHadi Asyrafi 199*7931d332SJit Loon Lim /* -------------------------------------------------------- 200*7931d332SJit Loon Lim * macro plat_secondary_cpus_bl31_entry; 201*7931d332SJit Loon Lim * 202*7931d332SJit Loon Lim * el3_entrypoint_common init param configuration. 203*7931d332SJit Loon Lim * Called very early in the secondary cores boot process. 204*7931d332SJit Loon Lim * -------------------------------------------------------- 205*7931d332SJit Loon Lim */ 2062db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry 2072db1e766SHadi Asyrafi el3_entrypoint_common \ 2082db1e766SHadi Asyrafi _init_sctlr=0 \ 2092db1e766SHadi Asyrafi _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ 2102db1e766SHadi Asyrafi _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ 2112db1e766SHadi Asyrafi _init_memory=1 \ 2122db1e766SHadi Asyrafi _init_c_runtime=1 \ 2132db1e766SHadi Asyrafi _exception_vectors=runtime_exceptions \ 2142db1e766SHadi Asyrafi _pie_fixup_size=BL31_LIMIT - BL31_BASE 2152db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry 216