1*a2847172SGrzegorz Jaszczyk/* 2*a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd. 3*a2847172SGrzegorz Jaszczyk * 4*a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier: BSD-3-Clause 5*a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses 6*a2847172SGrzegorz Jaszczyk */ 7*a2847172SGrzegorz Jaszczyk 8*a2847172SGrzegorz Jaszczyk#include <asm_macros.S> 9*a2847172SGrzegorz Jaszczyk#include <platform_def.h> 10*a2847172SGrzegorz Jaszczyk#include <marvell_pm.h> 11*a2847172SGrzegorz Jaszczyk 12*a2847172SGrzegorz Jaszczyk .globl plat_secondary_cold_boot_setup 13*a2847172SGrzegorz Jaszczyk .globl plat_get_my_entrypoint 14*a2847172SGrzegorz Jaszczyk .globl plat_is_my_cpu_primary 15*a2847172SGrzegorz Jaszczyk .globl plat_reset_handler 16*a2847172SGrzegorz Jaszczyk 17*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 18*a2847172SGrzegorz Jaszczyk * void plat_secondary_cold_boot_setup (void); 19*a2847172SGrzegorz Jaszczyk * 20*a2847172SGrzegorz Jaszczyk * This function performs any platform specific actions 21*a2847172SGrzegorz Jaszczyk * needed for a secondary cpu after a cold reset. Right 22*a2847172SGrzegorz Jaszczyk * now this is a stub function. 23*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 24*a2847172SGrzegorz Jaszczyk */ 25*a2847172SGrzegorz Jaszczykfunc plat_secondary_cold_boot_setup 26*a2847172SGrzegorz Jaszczyk mov x0, #0 27*a2847172SGrzegorz Jaszczyk ret 28*a2847172SGrzegorz Jaszczykendfunc plat_secondary_cold_boot_setup 29*a2847172SGrzegorz Jaszczyk 30*a2847172SGrzegorz Jaszczyk /* --------------------------------------------------------------------- 31*a2847172SGrzegorz Jaszczyk * unsigned long plat_get_my_entrypoint (void); 32*a2847172SGrzegorz Jaszczyk * 33*a2847172SGrzegorz Jaszczyk * Main job of this routine is to distinguish 34*a2847172SGrzegorz Jaszczyk * between a cold and warm boot 35*a2847172SGrzegorz Jaszczyk * For a cold boot, return 0. 36*a2847172SGrzegorz Jaszczyk * For a warm boot, read the mailbox and return the address it contains. 37*a2847172SGrzegorz Jaszczyk * 38*a2847172SGrzegorz Jaszczyk * --------------------------------------------------------------------- 39*a2847172SGrzegorz Jaszczyk */ 40*a2847172SGrzegorz Jaszczykfunc plat_get_my_entrypoint 41*a2847172SGrzegorz Jaszczyk /* Read first word and compare it with magic num */ 42*a2847172SGrzegorz Jaszczyk mov_imm x0, PLAT_MARVELL_MAILBOX_BASE 43*a2847172SGrzegorz Jaszczyk ldr x1, [x0] 44*a2847172SGrzegorz Jaszczyk mov_imm x2, MVEBU_MAILBOX_MAGIC_NUM 45*a2847172SGrzegorz Jaszczyk cmp x1, x2 46*a2847172SGrzegorz Jaszczyk beq warm_boot /* If compare failed, return 0, i.e. cold boot */ 47*a2847172SGrzegorz Jaszczyk mov x0, #0 48*a2847172SGrzegorz Jaszczyk ret 49*a2847172SGrzegorz Jaszczykwarm_boot: 50*a2847172SGrzegorz Jaszczyk mov_imm x1, MBOX_IDX_SEC_ADDR /* Get the jump address */ 51*a2847172SGrzegorz Jaszczyk subs x1, x1, #1 52*a2847172SGrzegorz Jaszczyk mov x2, #(MBOX_IDX_SEC_ADDR * 8) 53*a2847172SGrzegorz Jaszczyk lsl x3, x2, x1 54*a2847172SGrzegorz Jaszczyk add x0, x0, x3 55*a2847172SGrzegorz Jaszczyk ldr x0, [x0] 56*a2847172SGrzegorz Jaszczyk ret 57*a2847172SGrzegorz Jaszczykendfunc plat_get_my_entrypoint 58*a2847172SGrzegorz Jaszczyk 59*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 60*a2847172SGrzegorz Jaszczyk * unsigned int plat_is_my_cpu_primary (void); 61*a2847172SGrzegorz Jaszczyk * 62*a2847172SGrzegorz Jaszczyk * Find out whether the current cpu is the primary 63*a2847172SGrzegorz Jaszczyk * cpu. 64*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 65*a2847172SGrzegorz Jaszczyk */ 66*a2847172SGrzegorz Jaszczykfunc plat_is_my_cpu_primary 67*a2847172SGrzegorz Jaszczyk mrs x0, mpidr_el1 68*a2847172SGrzegorz Jaszczyk and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK) 69*a2847172SGrzegorz Jaszczyk cmp x0, #MVEBU_PRIMARY_CPU 70*a2847172SGrzegorz Jaszczyk cset w0, eq 71*a2847172SGrzegorz Jaszczyk ret 72*a2847172SGrzegorz Jaszczykendfunc plat_is_my_cpu_primary 73*a2847172SGrzegorz Jaszczyk 74*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 75*a2847172SGrzegorz Jaszczyk * void plat_reset_handler (void); 76*a2847172SGrzegorz Jaszczyk * 77*a2847172SGrzegorz Jaszczyk * Platform specific configuration right after cpu is 78*a2847172SGrzegorz Jaszczyk * is our of reset. 79*a2847172SGrzegorz Jaszczyk * 80*a2847172SGrzegorz Jaszczyk * The plat_reset_handler can clobber x0 - x18, x30. 81*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 82*a2847172SGrzegorz Jaszczyk */ 83*a2847172SGrzegorz Jaszczykfunc plat_reset_handler 84*a2847172SGrzegorz Jaszczyk /* 85*a2847172SGrzegorz Jaszczyk * Note: the configurations below should be done before MMU, 86*a2847172SGrzegorz Jaszczyk * I Cache and L2are enabled. 87*a2847172SGrzegorz Jaszczyk * The reset handler is executed right after reset 88*a2847172SGrzegorz Jaszczyk * and before Caches are enabled. 89*a2847172SGrzegorz Jaszczyk */ 90*a2847172SGrzegorz Jaszczyk 91*a2847172SGrzegorz Jaszczyk /* Enable L1/L2 ECC and Parity */ 92*a2847172SGrzegorz Jaszczyk mrs x5, s3_1_c11_c0_2 /* L2 Ctrl */ 93*a2847172SGrzegorz Jaszczyk orr x5, x5, #(1 << 21) /* Enable L1/L2 cache ECC & Parity */ 94*a2847172SGrzegorz Jaszczyk msr s3_1_c11_c0_2, x5 /* L2 Ctrl */ 95*a2847172SGrzegorz Jaszczyk 96*a2847172SGrzegorz Jaszczyk#if LLC_ENABLE 97*a2847172SGrzegorz Jaszczyk /* 98*a2847172SGrzegorz Jaszczyk * Enable L2 UniqueClean evictions 99*a2847172SGrzegorz Jaszczyk * Note: this configuration assumes that LLC is configured 100*a2847172SGrzegorz Jaszczyk * in exclusive mode. 101*a2847172SGrzegorz Jaszczyk * Later on in the code this assumption will be validated 102*a2847172SGrzegorz Jaszczyk */ 103*a2847172SGrzegorz Jaszczyk mrs x5, s3_1_c15_c0_0 /* L2 Ctrl */ 104*a2847172SGrzegorz Jaszczyk orr x5, x5, #(1 << 14) /* Enable UniqueClean evictions with data */ 105*a2847172SGrzegorz Jaszczyk msr s3_1_c15_c0_0, x5 /* L2 Ctrl */ 106*a2847172SGrzegorz Jaszczyk#endif 107*a2847172SGrzegorz Jaszczyk 108*a2847172SGrzegorz Jaszczyk /* Instruction Barrier to allow msr command completion */ 109*a2847172SGrzegorz Jaszczyk isb 110*a2847172SGrzegorz Jaszczyk 111*a2847172SGrzegorz Jaszczyk ret 112*a2847172SGrzegorz Jaszczykendfunc plat_reset_handler 113