13f7b1490SHadi Asyrafi/* 26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 3*7ac7dadbSSieu Mun Tang * Copyright (c) 2019-2023, Intel Corporation. All rights reserved. 4*7ac7dadbSSieu Mun Tang * Copyright (c) 2024, Altera Corporation. All rights reserved. 53f7b1490SHadi Asyrafi * 63f7b1490SHadi Asyrafi * SPDX-License-Identifier: BSD-3-Clause 73f7b1490SHadi Asyrafi */ 83f7b1490SHadi Asyrafi 93f7b1490SHadi Asyrafi#include <arch.h> 103f7b1490SHadi Asyrafi#include <asm_macros.S> 113f7b1490SHadi Asyrafi#include <cpu_macros.S> 123f7b1490SHadi Asyrafi#include <platform_def.h> 132db1e766SHadi Asyrafi#include <el3_common_macros.S> 143f7b1490SHadi Asyrafi 153f7b1490SHadi Asyrafi .globl plat_secondary_cold_boot_setup 163f7b1490SHadi Asyrafi .globl platform_is_primary_cpu 173f7b1490SHadi Asyrafi .globl plat_is_my_cpu_primary 183f7b1490SHadi Asyrafi .globl plat_my_core_pos 193f7b1490SHadi Asyrafi .globl plat_crash_console_init 203f7b1490SHadi Asyrafi .globl plat_crash_console_putc 213f7b1490SHadi Asyrafi .globl plat_crash_console_flush 223f7b1490SHadi Asyrafi .globl platform_mem_init 232db1e766SHadi Asyrafi .globl plat_secondary_cpus_bl31_entry 24*7ac7dadbSSieu Mun Tang .globl invalidate_cache_low_el 253f7b1490SHadi Asyrafi 263f7b1490SHadi Asyrafi .globl plat_get_my_entrypoint 273f7b1490SHadi Asyrafi 283f7b1490SHadi Asyrafi /* ----------------------------------------------------- 293f7b1490SHadi Asyrafi * void plat_secondary_cold_boot_setup (void); 303f7b1490SHadi Asyrafi * 313f7b1490SHadi Asyrafi * This function performs any platform specific actions 323f7b1490SHadi Asyrafi * needed for a secondary cpu after a cold reset e.g 333f7b1490SHadi Asyrafi * mark the cpu's presence, mechanism to place it in a 343f7b1490SHadi Asyrafi * holding pen etc. 353f7b1490SHadi Asyrafi * ----------------------------------------------------- 363f7b1490SHadi Asyrafi */ 373f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup 383f7b1490SHadi Asyrafi /* Wait until the it gets reset signal from rstmgr gets populated */ 393f7b1490SHadi Asyrafipoll_mailbox: 407931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 417931d332SJit Loon Lim mov_imm x0, PLAT_SEC_ENTRY 427931d332SJit Loon Lim cbz x0, poll_mailbox 437931d332SJit Loon Lim br x0 447931d332SJit Loon Lim#else 453f7b1490SHadi Asyrafi wfi 463f7b1490SHadi Asyrafi mov_imm x0, PLAT_SEC_ENTRY 473f7b1490SHadi Asyrafi ldr x1, [x0] 483f7b1490SHadi Asyrafi mov_imm x2, PLAT_CPUID_RELEASE 493f7b1490SHadi Asyrafi ldr x3, [x2] 503f7b1490SHadi Asyrafi mrs x4, mpidr_el1 513f7b1490SHadi Asyrafi and x4, x4, #0xff 523f7b1490SHadi Asyrafi cmp x3, x4 533f7b1490SHadi Asyrafi b.ne poll_mailbox 543f7b1490SHadi Asyrafi br x1 557931d332SJit Loon Lim#endif 563f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup 573f7b1490SHadi Asyrafi 587931d332SJit Loon Lim#if ((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \ 597931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \ 607931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_N5X)) 617931d332SJit Loon Lim 623f7b1490SHadi Asyrafifunc platform_is_primary_cpu 633f7b1490SHadi Asyrafi and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 643f7b1490SHadi Asyrafi cmp x0, #PLAT_PRIMARY_CPU 653f7b1490SHadi Asyrafi cset x0, eq 663f7b1490SHadi Asyrafi ret 673f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu 683f7b1490SHadi Asyrafi 697931d332SJit Loon Lim#else 707931d332SJit Loon Lim 717931d332SJit Loon Limfunc platform_is_primary_cpu 727931d332SJit Loon Lim and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 737931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A76) 747931d332SJit Loon Lim b.eq primary_cpu 757931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A55) 767931d332SJit Loon Lim b.eq primary_cpu 777931d332SJit Loon Limprimary_cpu: 787931d332SJit Loon Lim cset x0, eq 797931d332SJit Loon Lim ret 807931d332SJit Loon Limendfunc platform_is_primary_cpu 817931d332SJit Loon Lim 827931d332SJit Loon Lim#endif 837931d332SJit Loon Lim 843f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary 853f7b1490SHadi Asyrafi mrs x0, mpidr_el1 863f7b1490SHadi Asyrafi b platform_is_primary_cpu 873f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary 883f7b1490SHadi Asyrafi 893f7b1490SHadi Asyrafifunc plat_my_core_pos 903f7b1490SHadi Asyrafi mrs x0, mpidr_el1 913f7b1490SHadi Asyrafi and x1, x0, #MPIDR_CPU_MASK 923f7b1490SHadi Asyrafi and x0, x0, #MPIDR_CLUSTER_MASK 937931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 947931d332SJit Loon Lim add x0, x1, x0, LSR #8 957931d332SJit Loon Lim#else 963f7b1490SHadi Asyrafi add x0, x1, x0, LSR #6 977931d332SJit Loon Lim#endif 983f7b1490SHadi Asyrafi ret 993f7b1490SHadi Asyrafiendfunc plat_my_core_pos 1003f7b1490SHadi Asyrafi 10132cf34acSHadi Asyrafifunc warm_reset_req 1027931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 1037931d332SJit Loon Lim bl plat_is_my_cpu_primary 1047931d332SJit Loon Lim cbnz x0, warm_reset 1057931d332SJit Loon Limwarm_reset: 1067931d332SJit Loon Lim mov_imm x1, PLAT_SEC_ENTRY 1077931d332SJit Loon Lim str xzr, [x1] 1087931d332SJit Loon Lim mrs x1, rmr_el3 1097931d332SJit Loon Lim orr x1, x1, #0x02 1107931d332SJit Loon Lim msr rmr_el3, x1 1117931d332SJit Loon Lim isb 1127931d332SJit Loon Lim dsb sy 1137931d332SJit Loon Lim#else 11432cf34acSHadi Asyrafi str xzr, [x4] 11532cf34acSHadi Asyrafi bl plat_is_my_cpu_primary 11632cf34acSHadi Asyrafi cbz x0, cpu_in_wfi 11732cf34acSHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 11832cf34acSHadi Asyrafi str xzr, [x1] 11932cf34acSHadi Asyrafi mrs x1, rmr_el3 12032cf34acSHadi Asyrafi orr x1, x1, #0x02 12132cf34acSHadi Asyrafi msr rmr_el3, x1 12232cf34acSHadi Asyrafi isb 12332cf34acSHadi Asyrafi dsb sy 12432cf34acSHadi Asyraficpu_in_wfi: 12532cf34acSHadi Asyrafi wfi 12632cf34acSHadi Asyrafi b cpu_in_wfi 1277931d332SJit Loon Lim#endif 12832cf34acSHadi Asyrafiendfunc warm_reset_req 12932cf34acSHadi Asyrafi 1307931d332SJit Loon Lim/* TODO: Zephyr warm reset test */ 1317931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 1327931d332SJit Loon Limfunc plat_get_my_entrypoint 1337931d332SJit Loon Lim ldr x4, =L2_RESET_DONE_REG 1347931d332SJit Loon Lim ldr x5, [x4] 1357931d332SJit Loon Lim ldr x1, =PLAT_L2_RESET_REQ 1367931d332SJit Loon Lim cmp x1, x5 1377931d332SJit Loon Lim b.eq zephyr_reset_req 1387931d332SJit Loon Lim mov_imm x1, PLAT_SEC_ENTRY 1397931d332SJit Loon Lim ldr x0, [x1] 1407931d332SJit Loon Lim ret 1417931d332SJit Loon Limzephyr_reset_req: 1427931d332SJit Loon Lim ldr x0, =0x00 1437931d332SJit Loon Lim ret 1447931d332SJit Loon Limendfunc plat_get_my_entrypoint 1457931d332SJit Loon Lim#else 1463f7b1490SHadi Asyrafifunc plat_get_my_entrypoint 14732cf34acSHadi Asyrafi ldr x4, =L2_RESET_DONE_REG 14832cf34acSHadi Asyrafi ldr x5, [x4] 14932cf34acSHadi Asyrafi ldr x1, =L2_RESET_DONE_STATUS 15032cf34acSHadi Asyrafi cmp x1, x5 15132cf34acSHadi Asyrafi b.eq warm_reset_req 1523f7b1490SHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 1533f7b1490SHadi Asyrafi ldr x0, [x1] 1543f7b1490SHadi Asyrafi ret 1553f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint 1567931d332SJit Loon Lim#endif 15732cf34acSHadi Asyrafi 1583f7b1490SHadi Asyrafi /* --------------------------------------------- 1593f7b1490SHadi Asyrafi * int plat_crash_console_init(void) 1603f7b1490SHadi Asyrafi * Function to initialize the crash console 1613f7b1490SHadi Asyrafi * without a C Runtime to print crash report. 1623f7b1490SHadi Asyrafi * Clobber list : x0, x1, x2 1633f7b1490SHadi Asyrafi * --------------------------------------------- 1643f7b1490SHadi Asyrafi */ 1653f7b1490SHadi Asyrafifunc plat_crash_console_init 166447e699fSBoon Khai Ng mov_imm x0, CRASH_CONSOLE_BASE 1673f7b1490SHadi Asyrafi mov_imm x1, PLAT_UART_CLOCK 1683f7b1490SHadi Asyrafi mov_imm x2, PLAT_BAUDRATE 1693f7b1490SHadi Asyrafi b console_16550_core_init 1703f7b1490SHadi Asyrafiendfunc plat_crash_console_init 1713f7b1490SHadi Asyrafi 1723f7b1490SHadi Asyrafi /* --------------------------------------------- 1733f7b1490SHadi Asyrafi * int plat_crash_console_putc(void) 1743f7b1490SHadi Asyrafi * Function to print a character on the crash 1753f7b1490SHadi Asyrafi * console without a C Runtime. 1763f7b1490SHadi Asyrafi * Clobber list : x1, x2 1773f7b1490SHadi Asyrafi * --------------------------------------------- 1783f7b1490SHadi Asyrafi */ 1793f7b1490SHadi Asyrafifunc plat_crash_console_putc 180447e699fSBoon Khai Ng mov_imm x1, CRASH_CONSOLE_BASE 1813f7b1490SHadi Asyrafi b console_16550_core_putc 1823f7b1490SHadi Asyrafiendfunc plat_crash_console_putc 1833f7b1490SHadi Asyrafi 1843f7b1490SHadi Asyrafifunc plat_crash_console_flush 1853f7b1490SHadi Asyrafi mov_imm x0, CRASH_CONSOLE_BASE 1863f7b1490SHadi Asyrafi b console_16550_core_flush 1873f7b1490SHadi Asyrafiendfunc plat_crash_console_flush 1883f7b1490SHadi Asyrafi 1893f7b1490SHadi Asyrafi 1903f7b1490SHadi Asyrafi /* -------------------------------------------------------- 1913f7b1490SHadi Asyrafi * void platform_mem_init (void); 1923f7b1490SHadi Asyrafi * 1933f7b1490SHadi Asyrafi * Any memory init, relocation to be done before the 1943f7b1490SHadi Asyrafi * platform boots. Called very early in the boot process. 1953f7b1490SHadi Asyrafi * -------------------------------------------------------- 1963f7b1490SHadi Asyrafi */ 1973f7b1490SHadi Asyrafifunc platform_mem_init 1983f7b1490SHadi Asyrafi mov x0, #0 1993f7b1490SHadi Asyrafi ret 2003f7b1490SHadi Asyrafiendfunc platform_mem_init 2012db1e766SHadi Asyrafi 2027931d332SJit Loon Lim /* -------------------------------------------------------- 2037931d332SJit Loon Lim * macro plat_secondary_cpus_bl31_entry; 2047931d332SJit Loon Lim * 2057931d332SJit Loon Lim * el3_entrypoint_common init param configuration. 2067931d332SJit Loon Lim * Called very early in the secondary cores boot process. 2077931d332SJit Loon Lim * -------------------------------------------------------- 2087931d332SJit Loon Lim */ 2092db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry 2102db1e766SHadi Asyrafi el3_entrypoint_common \ 2112db1e766SHadi Asyrafi _init_sctlr=0 \ 2122db1e766SHadi Asyrafi _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ 2132db1e766SHadi Asyrafi _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ 2142db1e766SHadi Asyrafi _init_memory=1 \ 2152db1e766SHadi Asyrafi _init_c_runtime=1 \ 2162db1e766SHadi Asyrafi _exception_vectors=runtime_exceptions \ 2172db1e766SHadi Asyrafi _pie_fixup_size=BL31_LIMIT - BL31_BASE 2182db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry 219*7ac7dadbSSieu Mun Tang 220*7ac7dadbSSieu Mun Tang/* -------------------------------------------------------- 221*7ac7dadbSSieu Mun Tang * Invalidate for NS EL2 and EL1 222*7ac7dadbSSieu Mun Tang * -------------------------------------------------------- 223*7ac7dadbSSieu Mun Tang */ 224*7ac7dadbSSieu Mun Tangfunc invalidate_cache_low_el 225*7ac7dadbSSieu Mun Tang mrs x0,SCR_EL3 226*7ac7dadbSSieu Mun Tang orr x1,x0,#SCR_NS_BIT 227*7ac7dadbSSieu Mun Tang msr SCR_EL3, x1 228*7ac7dadbSSieu Mun Tang isb 229*7ac7dadbSSieu Mun Tang tlbi ALLE2 230*7ac7dadbSSieu Mun Tang dsb sy 231*7ac7dadbSSieu Mun Tang tlbi ALLE1 232*7ac7dadbSSieu Mun Tang dsb sy 233*7ac7dadbSSieu Mun Tangendfunc invalidate_cache_low_el 234