13f7b1490SHadi Asyrafi/* 23f7b1490SHadi Asyrafi * Copyright (c) 2019, 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: 373f7b1490SHadi Asyrafi wfi 383f7b1490SHadi Asyrafi mov_imm x0, PLAT_SEC_ENTRY 393f7b1490SHadi Asyrafi ldr x1, [x0] 403f7b1490SHadi Asyrafi mov_imm x2, PLAT_CPUID_RELEASE 413f7b1490SHadi Asyrafi ldr x3, [x2] 423f7b1490SHadi Asyrafi mrs x4, mpidr_el1 433f7b1490SHadi Asyrafi and x4, x4, #0xff 443f7b1490SHadi Asyrafi cmp x3, x4 453f7b1490SHadi Asyrafi b.ne poll_mailbox 463f7b1490SHadi Asyrafi br x1 473f7b1490SHadi Asyrafiendfunc plat_secondary_cold_boot_setup 483f7b1490SHadi Asyrafi 493f7b1490SHadi Asyrafifunc platform_is_primary_cpu 503f7b1490SHadi Asyrafi and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 513f7b1490SHadi Asyrafi cmp x0, #PLAT_PRIMARY_CPU 523f7b1490SHadi Asyrafi cset x0, eq 533f7b1490SHadi Asyrafi ret 543f7b1490SHadi Asyrafiendfunc platform_is_primary_cpu 553f7b1490SHadi Asyrafi 563f7b1490SHadi Asyrafifunc plat_is_my_cpu_primary 573f7b1490SHadi Asyrafi mrs x0, mpidr_el1 583f7b1490SHadi Asyrafi b platform_is_primary_cpu 593f7b1490SHadi Asyrafiendfunc plat_is_my_cpu_primary 603f7b1490SHadi Asyrafi 613f7b1490SHadi Asyrafifunc plat_my_core_pos 623f7b1490SHadi Asyrafi mrs x0, mpidr_el1 633f7b1490SHadi Asyrafi and x1, x0, #MPIDR_CPU_MASK 643f7b1490SHadi Asyrafi and x0, x0, #MPIDR_CLUSTER_MASK 653f7b1490SHadi Asyrafi add x0, x1, x0, LSR #6 663f7b1490SHadi Asyrafi ret 673f7b1490SHadi Asyrafiendfunc plat_my_core_pos 683f7b1490SHadi Asyrafi 69*32cf34acSHadi Asyrafifunc warm_reset_req 70*32cf34acSHadi Asyrafi str xzr, [x4] 71*32cf34acSHadi Asyrafi bl plat_is_my_cpu_primary 72*32cf34acSHadi Asyrafi cbz x0, cpu_in_wfi 73*32cf34acSHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 74*32cf34acSHadi Asyrafi str xzr, [x1] 75*32cf34acSHadi Asyrafi mrs x1, rmr_el3 76*32cf34acSHadi Asyrafi orr x1, x1, #0x02 77*32cf34acSHadi Asyrafi msr rmr_el3, x1 78*32cf34acSHadi Asyrafi isb 79*32cf34acSHadi Asyrafi dsb sy 80*32cf34acSHadi Asyraficpu_in_wfi: 81*32cf34acSHadi Asyrafi wfi 82*32cf34acSHadi Asyrafi b cpu_in_wfi 83*32cf34acSHadi Asyrafiendfunc warm_reset_req 84*32cf34acSHadi Asyrafi 853f7b1490SHadi Asyrafifunc plat_get_my_entrypoint 86*32cf34acSHadi Asyrafi ldr x4, =L2_RESET_DONE_REG 87*32cf34acSHadi Asyrafi ldr x5, [x4] 88*32cf34acSHadi Asyrafi ldr x1, =L2_RESET_DONE_STATUS 89*32cf34acSHadi Asyrafi cmp x1, x5 90*32cf34acSHadi Asyrafi b.eq warm_reset_req 913f7b1490SHadi Asyrafi mov_imm x1, PLAT_SEC_ENTRY 923f7b1490SHadi Asyrafi ldr x0, [x1] 933f7b1490SHadi Asyrafi ret 943f7b1490SHadi Asyrafiendfunc plat_get_my_entrypoint 953f7b1490SHadi Asyrafi 96*32cf34acSHadi Asyrafi 973f7b1490SHadi Asyrafi /* --------------------------------------------- 983f7b1490SHadi Asyrafi * int plat_crash_console_init(void) 993f7b1490SHadi Asyrafi * Function to initialize the crash console 1003f7b1490SHadi Asyrafi * without a C Runtime to print crash report. 1013f7b1490SHadi Asyrafi * Clobber list : x0, x1, x2 1023f7b1490SHadi Asyrafi * --------------------------------------------- 1033f7b1490SHadi Asyrafi */ 1043f7b1490SHadi Asyrafifunc plat_crash_console_init 1053f7b1490SHadi Asyrafi mov_imm x0, PLAT_UART0_BASE 1063f7b1490SHadi Asyrafi mov_imm x1, PLAT_UART_CLOCK 1073f7b1490SHadi Asyrafi mov_imm x2, PLAT_BAUDRATE 1083f7b1490SHadi Asyrafi b console_16550_core_init 1093f7b1490SHadi Asyrafiendfunc plat_crash_console_init 1103f7b1490SHadi Asyrafi 1113f7b1490SHadi Asyrafi /* --------------------------------------------- 1123f7b1490SHadi Asyrafi * int plat_crash_console_putc(void) 1133f7b1490SHadi Asyrafi * Function to print a character on the crash 1143f7b1490SHadi Asyrafi * console without a C Runtime. 1153f7b1490SHadi Asyrafi * Clobber list : x1, x2 1163f7b1490SHadi Asyrafi * --------------------------------------------- 1173f7b1490SHadi Asyrafi */ 1183f7b1490SHadi Asyrafifunc plat_crash_console_putc 1193f7b1490SHadi Asyrafi mov_imm x1, PLAT_UART0_BASE 1203f7b1490SHadi Asyrafi b console_16550_core_putc 1213f7b1490SHadi Asyrafiendfunc plat_crash_console_putc 1223f7b1490SHadi Asyrafi 1233f7b1490SHadi Asyrafifunc plat_crash_console_flush 1243f7b1490SHadi Asyrafi mov_imm x0, CRASH_CONSOLE_BASE 1253f7b1490SHadi Asyrafi b console_16550_core_flush 1263f7b1490SHadi Asyrafiendfunc plat_crash_console_flush 1273f7b1490SHadi Asyrafi 1283f7b1490SHadi Asyrafi 1293f7b1490SHadi Asyrafi /* -------------------------------------------------------- 1303f7b1490SHadi Asyrafi * void platform_mem_init (void); 1313f7b1490SHadi Asyrafi * 1323f7b1490SHadi Asyrafi * Any memory init, relocation to be done before the 1333f7b1490SHadi Asyrafi * platform boots. Called very early in the boot process. 1343f7b1490SHadi Asyrafi * -------------------------------------------------------- 1353f7b1490SHadi Asyrafi */ 1363f7b1490SHadi Asyrafifunc platform_mem_init 1373f7b1490SHadi Asyrafi mov x0, #0 1383f7b1490SHadi Asyrafi ret 1393f7b1490SHadi Asyrafiendfunc platform_mem_init 1402db1e766SHadi Asyrafi 1412db1e766SHadi Asyrafifunc plat_secondary_cpus_bl31_entry 1422db1e766SHadi Asyrafi el3_entrypoint_common \ 1432db1e766SHadi Asyrafi _init_sctlr=0 \ 1442db1e766SHadi Asyrafi _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS \ 1452db1e766SHadi Asyrafi _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU \ 1462db1e766SHadi Asyrafi _init_memory=1 \ 1472db1e766SHadi Asyrafi _init_c_runtime=1 \ 1482db1e766SHadi Asyrafi _exception_vectors=runtime_exceptions \ 1492db1e766SHadi Asyrafi _pie_fixup_size=BL31_LIMIT - BL31_BASE 1502db1e766SHadi Asyrafiendfunc plat_secondary_cpus_bl31_entry 151