13f7b1490SHadi Asyrafi/* 26197dc98SJit Loon Lim * Copyright (c) 2019-2023, ARM Limited and Contributors. All rights reserved. 37ac7dadbSSieu Mun Tang * Copyright (c) 2019-2023, Intel Corporation. All rights reserved. 47ac7dadbSSieu 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 243f7b1490SHadi Asyrafi 253f7b1490SHadi Asyrafi .globl plat_get_my_entrypoint 263f7b1490SHadi Asyrafi 273f7b1490SHadi Asyrafi /* ----------------------------------------------------- 283f7b1490SHadi Asyrafi * void plat_secondary_cold_boot_setup (void); 293f7b1490SHadi Asyrafi * 303f7b1490SHadi Asyrafi * This function performs any platform specific actions 313f7b1490SHadi Asyrafi * needed for a secondary cpu after a cold reset e.g 323f7b1490SHadi Asyrafi * mark the cpu's presence, mechanism to place it in a 333f7b1490SHadi Asyrafi * holding pen etc. 343f7b1490SHadi Asyrafi * ----------------------------------------------------- 353f7b1490SHadi Asyrafi */ 363f7b1490SHadi Asyrafifunc plat_secondary_cold_boot_setup 373f7b1490SHadi Asyrafi /* Wait until the it gets reset signal from rstmgr gets populated */ 383f7b1490SHadi Asyrafipoll_mailbox: 397931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 407931d332SJit Loon Lim mov_imm x0, PLAT_SEC_ENTRY 417931d332SJit Loon Lim cbz x0, poll_mailbox 427931d332SJit Loon Lim br x0 437931d332SJit Loon Lim#else 443f7b1490SHadi Asyrafi wfi 453f7b1490SHadi Asyrafi mov_imm x0, PLAT_SEC_ENTRY 463f7b1490SHadi Asyrafi ldr x1, [x0] 473f7b1490SHadi Asyrafi mov_imm x2, PLAT_CPUID_RELEASE 483f7b1490SHadi Asyrafi ldr x3, [x2] 493f7b1490SHadi Asyrafi mrs x4, mpidr_el1 503f7b1490SHadi Asyrafi and x4, x4, #0xff 513f7b1490SHadi Asyrafi cmp x3, x4 523f7b1490SHadi Asyrafi b.ne poll_mailbox 533f7b1490SHadi Asyrafi br x1 547931d332SJit Loon Lim#endif 553f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup 563f7b1490SHadi Asyrafi 577931d332SJit Loon Lim#if ((PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10) || \ 587931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX) || \ 597931d332SJit Loon Lim (PLATFORM_MODEL == PLAT_SOCFPGA_N5X)) 607931d332SJit Loon Lim 613f7b1490SHadi Asyrafifunc platform_is_primary_cpu 623f7b1490SHadi Asyrafi and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 633f7b1490SHadi Asyrafi cmp x0, #PLAT_PRIMARY_CPU 643f7b1490SHadi Asyrafi cset x0, eq 653f7b1490SHadi Asyrafi ret 663f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu 673f7b1490SHadi Asyrafi 687931d332SJit Loon Lim#else 697931d332SJit Loon Lim 707931d332SJit Loon Limfunc platform_is_primary_cpu 717931d332SJit Loon Lim and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 727931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A76) 737931d332SJit Loon Lim b.eq primary_cpu 747931d332SJit Loon Lim cmp x0, #(PLAT_PRIMARY_CPU_A55) 757931d332SJit Loon Lim b.eq primary_cpu 767931d332SJit Loon Limprimary_cpu: 777931d332SJit Loon Lim cset x0, eq 787931d332SJit Loon Lim ret 797931d332SJit Loon Limendfunc platform_is_primary_cpu 807931d332SJit Loon Lim 817931d332SJit Loon Lim#endif 827931d332SJit Loon Lim 833f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary 843f7b1490SHadi Asyrafi mrs x0, mpidr_el1 853f7b1490SHadi Asyrafi b platform_is_primary_cpu 863f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary 873f7b1490SHadi Asyrafi 883f7b1490SHadi Asyrafifunc plat_my_core_pos 893f7b1490SHadi Asyrafi mrs x0, mpidr_el1 903f7b1490SHadi Asyrafi and x1, x0, #MPIDR_CPU_MASK 913f7b1490SHadi Asyrafi and x0, x0, #MPIDR_CLUSTER_MASK 927931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 937931d332SJit Loon Lim add x0, x1, x0, LSR #8 947931d332SJit Loon Lim#else 953f7b1490SHadi Asyrafi add x0, x1, x0, LSR #6 967931d332SJit Loon Lim#endif 973f7b1490SHadi Asyrafi ret 983f7b1490SHadi Asyrafiendfunc plat_my_core_pos 993f7b1490SHadi Asyrafi 10032cf34acSHadi Asyrafifunc warm_reset_req 10132cf34acSHadi Asyrafi str xzr, [x4] 10232cf34acSHadi Asyrafi bl plat_is_my_cpu_primary 10332cf34acSHadi Asyrafi cbz x0, cpu_in_wfi 10432cf34acSHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 10532cf34acSHadi Asyrafi str xzr, [x1] 10632cf34acSHadi Asyrafi mrs x1, rmr_el3 10732cf34acSHadi Asyrafi orr x1, x1, #0x02 10832cf34acSHadi Asyrafi msr rmr_el3, x1 10932cf34acSHadi Asyrafi isb 11032cf34acSHadi Asyrafi dsb sy 11132cf34acSHadi Asyraficpu_in_wfi: 11232cf34acSHadi Asyrafi wfi 11332cf34acSHadi Asyrafi b cpu_in_wfi 11432cf34acSHadi Asyrafiendfunc warm_reset_req 11532cf34acSHadi Asyrafi 1167931d332SJit Loon Lim#if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5 1177931d332SJit Loon Limfunc plat_get_my_entrypoint 1187931d332SJit Loon Lim ldr x4, =L2_RESET_DONE_REG 1197931d332SJit Loon Lim ldr x5, [x4] 120*c1253b24SSieu Mun Tang 121*c1253b24SSieu Mun Tang /* Check for warm reset request */ 122*c1253b24SSieu Mun Tang ldr x1, =L2_RESET_DONE_STATUS 1237931d332SJit Loon Lim cmp x1, x5 124*c1253b24SSieu Mun Tang b.eq warm_reset_req 125*c1253b24SSieu Mun Tang 126*c1253b24SSieu Mun Tang /* Check for SMP secondary cores boot request */ 127*c1253b24SSieu Mun Tang ldr x1, =SMP_SEC_CORE_BOOT_REQ 128*c1253b24SSieu Mun Tang cmp x1, x5 129*c1253b24SSieu Mun Tang b.eq smp_request 130*c1253b24SSieu Mun Tang 131*c1253b24SSieu Mun Tang /* Otherwise it is cold reset */ 132*c1253b24SSieu Mun Tang mov x0, #0 133*c1253b24SSieu Mun Tang ret 134*c1253b24SSieu Mun Tangsmp_request: 135*c1253b24SSieu Mun Tang /* 136*c1253b24SSieu Mun Tang * Return the address 'bl31_warm_entrypoint', which is passed to 137*c1253b24SSieu Mun Tang * 'psci_setup' routine as part of BL31 initialization. 138*c1253b24SSieu Mun Tang */ 1397931d332SJit Loon Lim mov_imm x1, PLAT_SEC_ENTRY 1407931d332SJit Loon Lim ldr x0, [x1] 141*c1253b24SSieu Mun Tang /* Clear the mark up before return */ 142*c1253b24SSieu Mun Tang str xzr, [x4] 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