1*b5c850d4SMarcin Wojtas/* 2*b5c850d4SMarcin Wojtas * Copyright (C) 2018 Marvell International Ltd. 3*b5c850d4SMarcin Wojtas * 4*b5c850d4SMarcin Wojtas * SPDX-License-Identifier: BSD-3-Clause 5*b5c850d4SMarcin Wojtas * https://spdx.org/licenses 6*b5c850d4SMarcin Wojtas */ 7*b5c850d4SMarcin Wojtas 8*b5c850d4SMarcin Wojtas#include <asm_macros.S> 9*b5c850d4SMarcin Wojtas#include <platform_def.h> 10*b5c850d4SMarcin Wojtas 11*b5c850d4SMarcin Wojtas .globl plat_secondary_cold_boot_setup 12*b5c850d4SMarcin Wojtas .globl plat_get_my_entrypoint 13*b5c850d4SMarcin Wojtas .globl plat_is_my_cpu_primary 14*b5c850d4SMarcin Wojtas 15*b5c850d4SMarcin Wojtas /* ----------------------------------------------------- 16*b5c850d4SMarcin Wojtas * void plat_secondary_cold_boot_setup (void); 17*b5c850d4SMarcin Wojtas * 18*b5c850d4SMarcin Wojtas * This function performs any platform specific actions 19*b5c850d4SMarcin Wojtas * needed for a secondary cpu after a cold reset. Right 20*b5c850d4SMarcin Wojtas * now this is a stub function. 21*b5c850d4SMarcin Wojtas * ----------------------------------------------------- 22*b5c850d4SMarcin Wojtas */ 23*b5c850d4SMarcin Wojtasfunc plat_secondary_cold_boot_setup 24*b5c850d4SMarcin Wojtas mov x0, #0 25*b5c850d4SMarcin Wojtas ret 26*b5c850d4SMarcin Wojtasendfunc plat_secondary_cold_boot_setup 27*b5c850d4SMarcin Wojtas 28*b5c850d4SMarcin Wojtas /* --------------------------------------------------------------------- 29*b5c850d4SMarcin Wojtas * unsigned long plat_get_my_entrypoint (void); 30*b5c850d4SMarcin Wojtas * 31*b5c850d4SMarcin Wojtas * Main job of this routine is to distinguish between cold and warm boot 32*b5c850d4SMarcin Wojtas * For a cold boot, return 0. 33*b5c850d4SMarcin Wojtas * For a warm boot, read the mailbox and return the address it contains. 34*b5c850d4SMarcin Wojtas * A magic number is placed before entrypoint to avoid mistake caused by 35*b5c850d4SMarcin Wojtas * uninitialized mailbox data area. 36*b5c850d4SMarcin Wojtas * --------------------------------------------------------------------- 37*b5c850d4SMarcin Wojtas */ 38*b5c850d4SMarcin Wojtasfunc plat_get_my_entrypoint 39*b5c850d4SMarcin Wojtas /* Read first word and compare it with magic num */ 40*b5c850d4SMarcin Wojtas mov_imm x0, PLAT_MARVELL_MAILBOX_BASE 41*b5c850d4SMarcin Wojtas ldr x1, [x0] 42*b5c850d4SMarcin Wojtas mov_imm x2, PLAT_MARVELL_MAILBOX_MAGIC_NUM 43*b5c850d4SMarcin Wojtas cmp x1, x2 44*b5c850d4SMarcin Wojtas /* If compare failed, return 0, i.e. cold boot */ 45*b5c850d4SMarcin Wojtas beq entrypoint 46*b5c850d4SMarcin Wojtas mov x0, #0 47*b5c850d4SMarcin Wojtas ret 48*b5c850d4SMarcin Wojtasentrypoint: 49*b5c850d4SMarcin Wojtas /* Second word contains the jump address */ 50*b5c850d4SMarcin Wojtas add x0, x0, #8 51*b5c850d4SMarcin Wojtas ldr x0, [x0] 52*b5c850d4SMarcin Wojtas ret 53*b5c850d4SMarcin Wojtasendfunc plat_get_my_entrypoint 54*b5c850d4SMarcin Wojtas 55*b5c850d4SMarcin Wojtas /* ----------------------------------------------------- 56*b5c850d4SMarcin Wojtas * unsigned int plat_is_my_cpu_primary (void); 57*b5c850d4SMarcin Wojtas * 58*b5c850d4SMarcin Wojtas * Find out whether the current cpu is the primary 59*b5c850d4SMarcin Wojtas * cpu. 60*b5c850d4SMarcin Wojtas * ----------------------------------------------------- 61*b5c850d4SMarcin Wojtas */ 62*b5c850d4SMarcin Wojtasfunc plat_is_my_cpu_primary 63*b5c850d4SMarcin Wojtas mrs x0, mpidr_el1 64*b5c850d4SMarcin Wojtas and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 65*b5c850d4SMarcin Wojtas cmp x0, #MVEBU_PRIMARY_CPU 66*b5c850d4SMarcin Wojtas cset w0, eq 67*b5c850d4SMarcin Wojtas ret 68*b5c850d4SMarcin Wojtasendfunc plat_is_my_cpu_primary 69