1*f180a3b7SHieu Nguyen/* 2*f180a3b7SHieu Nguyen * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved. 3*f180a3b7SHieu Nguyen * Copyright (c) 2025, Renesas Electronics Corporation. All rights reserved. 4*f180a3b7SHieu Nguyen * 5*f180a3b7SHieu Nguyen * SPDX-License-Identifier: BSD-3-Clause 6*f180a3b7SHieu Nguyen */ 7*f180a3b7SHieu Nguyen 8*f180a3b7SHieu Nguyen#include <arch.h> 9*f180a3b7SHieu Nguyen#include <asm_macros.S> 10*f180a3b7SHieu Nguyen#include <common/bl_common.h> 11*f180a3b7SHieu Nguyen#include <common/runtime_svc.h> 12*f180a3b7SHieu Nguyen#include <cortex_a720_ae.h> 13*f180a3b7SHieu Nguyen#include <platform_def.h> 14*f180a3b7SHieu Nguyen 15*f180a3b7SHieu Nguyen#include "rcar_def.h" 16*f180a3b7SHieu Nguyen 17*f180a3b7SHieu Nguyen .globl plat_get_my_entrypoint 18*f180a3b7SHieu Nguyen .extern plat_set_my_stack 19*f180a3b7SHieu Nguyen .globl platform_mem_init 20*f180a3b7SHieu Nguyen 21*f180a3b7SHieu Nguyen .globl plat_crash_console_init 22*f180a3b7SHieu Nguyen .globl plat_crash_console_putc 23*f180a3b7SHieu Nguyen .globl plat_crash_console_flush 24*f180a3b7SHieu Nguyen .globl plat_invalidate_icache 25*f180a3b7SHieu Nguyen .globl plat_secondary_reset 26*f180a3b7SHieu Nguyen .globl plat_my_core_pos 27*f180a3b7SHieu Nguyen .globl plat_renesas_calc_core_pos 28*f180a3b7SHieu Nguyen .globl bl31_plat_enable_mmu 29*f180a3b7SHieu Nguyen 30*f180a3b7SHieu Nguyen .extern console_rcar_init 31*f180a3b7SHieu Nguyen .extern console_rcar_putc 32*f180a3b7SHieu Nguyen .extern console_rcar_flush 33*f180a3b7SHieu Nguyen .extern rcar_pwrc_code_copy_to_system_ram 34*f180a3b7SHieu Nguyen 35*f180a3b7SHieu Nguyen /* ----------------------------------------------------- 36*f180a3b7SHieu Nguyen * void platform_get_core_pos (mpidr) 37*f180a3b7SHieu Nguyen * ----------------------------------------------------- 38*f180a3b7SHieu Nguyen */ 39*f180a3b7SHieu Nguyenfunc plat_renesas_calc_core_pos 40*f180a3b7SHieu Nguyen lsr x0, x0, #8 41*f180a3b7SHieu Nguyen and x1, x0, #MPIDR_CPU_MASK 42*f180a3b7SHieu Nguyen and x0, x0, #MPIDR_CLUSTER_MASK 43*f180a3b7SHieu Nguyen add x0, x1, x0, LSR #6 44*f180a3b7SHieu Nguyen ret 45*f180a3b7SHieu Nguyenendfunc plat_renesas_calc_core_pos 46*f180a3b7SHieu Nguyen 47*f180a3b7SHieu Nguyen /* ----------------------------------------------------- 48*f180a3b7SHieu Nguyen * void platform_my_core_pos 49*f180a3b7SHieu Nguyen * ----------------------------------------------------- 50*f180a3b7SHieu Nguyen */ 51*f180a3b7SHieu Nguyenfunc plat_my_core_pos 52*f180a3b7SHieu Nguyen mrs x0, mpidr_el1 53*f180a3b7SHieu Nguyen b plat_renesas_calc_core_pos 54*f180a3b7SHieu Nguyenendfunc plat_my_core_pos 55*f180a3b7SHieu Nguyen 56*f180a3b7SHieu Nguyen /* ----------------------------------------------------- 57*f180a3b7SHieu Nguyen * void platform_get_my_entrypoint (unsigned int mpid); 58*f180a3b7SHieu Nguyen * 59*f180a3b7SHieu Nguyen * Main job of this routine is to distinguish between 60*f180a3b7SHieu Nguyen * a cold and warm boot. 61*f180a3b7SHieu Nguyen * On a cold boot the secondaries first wait for the 62*f180a3b7SHieu Nguyen * platform to be initialized after which they are 63*f180a3b7SHieu Nguyen * hotplugged in. The primary proceeds to perform the 64*f180a3b7SHieu Nguyen * platform initialization. 65*f180a3b7SHieu Nguyen * On a warm boot, each cpu jumps to the address in its 66*f180a3b7SHieu Nguyen * mailbox. 67*f180a3b7SHieu Nguyen * 68*f180a3b7SHieu Nguyen * TODO: Not a good idea to save lr in a temp reg 69*f180a3b7SHieu Nguyen * ----------------------------------------------------- 70*f180a3b7SHieu Nguyen */ 71*f180a3b7SHieu Nguyenfunc plat_get_my_entrypoint 72*f180a3b7SHieu Nguyen mrs x0, mpidr_el1 73*f180a3b7SHieu Nguyen mov x9, x30 /* lr */ 74*f180a3b7SHieu Nguyen 75*f180a3b7SHieu Nguyen ldr x1, =BOOT_KIND_BASE 76*f180a3b7SHieu Nguyen ldr x21, [x1] 77*f180a3b7SHieu Nguyen 78*f180a3b7SHieu Nguyen /* Check the reset info */ 79*f180a3b7SHieu Nguyen and x1, x21, #0x000c 80*f180a3b7SHieu Nguyen cmp x1, #0x0008 81*f180a3b7SHieu Nguyen beq el3_panic 82*f180a3b7SHieu Nguyen cmp x1, #0x000c 83*f180a3b7SHieu Nguyen beq el3_panic 84*f180a3b7SHieu Nguyen 85*f180a3b7SHieu Nguyen /* Check the boot kind */ 86*f180a3b7SHieu Nguyen and x1, x21, #0x0003 87*f180a3b7SHieu Nguyen cmp x1, #0x0002 88*f180a3b7SHieu Nguyen beq el3_panic 89*f180a3b7SHieu Nguyen cmp x1, #0x0003 90*f180a3b7SHieu Nguyen beq el3_panic 91*f180a3b7SHieu Nguyen 92*f180a3b7SHieu Nguyen /* warm boot or cold boot */ 93*f180a3b7SHieu Nguyen and x1, x21, #1 94*f180a3b7SHieu Nguyen cmp x1, #0 95*f180a3b7SHieu Nguyen bne warm_reset 96*f180a3b7SHieu Nguyen 97*f180a3b7SHieu Nguyen /* Cold boot */ 98*f180a3b7SHieu Nguyen mov x0, #0 99*f180a3b7SHieu Nguyen b exit 100*f180a3b7SHieu Nguyen 101*f180a3b7SHieu Nguyenwarm_reset: 102*f180a3b7SHieu Nguyen /* -------------------------------------------------------------------- 103*f180a3b7SHieu Nguyen * A per-cpu mailbox is maintained in the trusted SDRAM. Its flushed out 104*f180a3b7SHieu Nguyen * of the caches after every update using normal memory so its safe to 105*f180a3b7SHieu Nguyen * read it here with SO attributes 106*f180a3b7SHieu Nguyen * --------------------------------------------------------------------- 107*f180a3b7SHieu Nguyen */ 108*f180a3b7SHieu Nguyen ldr x10, =MBOX_BASE 109*f180a3b7SHieu Nguyen bl plat_renesas_calc_core_pos 110*f180a3b7SHieu Nguyen lsl x0, x0, #CACHE_WRITEBACK_SHIFT 111*f180a3b7SHieu Nguyen ldr x0, [x10, x0] 112*f180a3b7SHieu Nguyen cbz x0, _panic 113*f180a3b7SHieu Nguyenexit: 114*f180a3b7SHieu Nguyen ret x9 115*f180a3b7SHieu Nguyen_panic: 116*f180a3b7SHieu Nguyen b el3_panic 117*f180a3b7SHieu Nguyen 118*f180a3b7SHieu Nguyenendfunc plat_get_my_entrypoint 119*f180a3b7SHieu Nguyen 120*f180a3b7SHieu Nguyen /* --------------------------------------------- 121*f180a3b7SHieu Nguyen * plat_secondary_reset 122*f180a3b7SHieu Nguyen * 123*f180a3b7SHieu Nguyen * --------------------------------------------- 124*f180a3b7SHieu Nguyen */ 125*f180a3b7SHieu Nguyenfunc plat_secondary_reset 126*f180a3b7SHieu Nguyen mrs x0, sctlr_el3 127*f180a3b7SHieu Nguyen bic x0, x0, #SCTLR_EE_BIT 128*f180a3b7SHieu Nguyen msr sctlr_el3, x0 129*f180a3b7SHieu Nguyen isb 130*f180a3b7SHieu Nguyen 131*f180a3b7SHieu Nguyen mrs x0, cptr_el3 132*f180a3b7SHieu Nguyen bic w0, w0, #TCPAC_BIT 133*f180a3b7SHieu Nguyen bic w0, w0, #TTA_BIT 134*f180a3b7SHieu Nguyen bic w0, w0, #TFP_BIT 135*f180a3b7SHieu Nguyen msr cptr_el3, x0 136*f180a3b7SHieu Nguyen 137*f180a3b7SHieu Nguyen mov_imm x0, PARAMS_BASE 138*f180a3b7SHieu Nguyen mov_imm x2, BL31_BASE 139*f180a3b7SHieu Nguyen ldr x3, =BOOT_KIND_BASE 140*f180a3b7SHieu Nguyen mov x1, #0x1 141*f180a3b7SHieu Nguyen str x1, [x3] 142*f180a3b7SHieu Nguyen br x2 /* jump to BL31 */ 143*f180a3b7SHieu Nguyen nop 144*f180a3b7SHieu Nguyen nop 145*f180a3b7SHieu Nguyen nop 146*f180a3b7SHieu Nguyenendfunc plat_secondary_reset 147*f180a3b7SHieu Nguyen 148*f180a3b7SHieu Nguyen /* ----------------------------------------------------- 149*f180a3b7SHieu Nguyen * void platform_mem_init (void); 150*f180a3b7SHieu Nguyen * 151*f180a3b7SHieu Nguyen * Zero out the mailbox registers in the shared memory 152*f180a3b7SHieu Nguyen * and set the rcar_boot_kind_flag. 153*f180a3b7SHieu Nguyen * The mmu is turned off right now and only the primary can 154*f180a3b7SHieu Nguyen * ever execute this code. Secondaries will read the 155*f180a3b7SHieu Nguyen * mailboxes using SO accesses. 156*f180a3b7SHieu Nguyen * ----------------------------------------------------- 157*f180a3b7SHieu Nguyen */ 158*f180a3b7SHieu Nguyenfunc platform_mem_init 159*f180a3b7SHieu Nguyen ldr x0, =MBOX_BASE 160*f180a3b7SHieu Nguyen mov w1, #PLATFORM_CORE_COUNT 161*f180a3b7SHieu Nguyenloop: 162*f180a3b7SHieu Nguyen str xzr, [x0], #CACHE_WRITEBACK_GRANULE 163*f180a3b7SHieu Nguyen subs w1, w1, #1 164*f180a3b7SHieu Nguyen b.gt loop 165*f180a3b7SHieu Nguyen ret 166*f180a3b7SHieu Nguyenendfunc platform_mem_init 167*f180a3b7SHieu Nguyen 168*f180a3b7SHieu Nguyen /* --------------------------------------------- 169*f180a3b7SHieu Nguyen * int plat_crash_console_init(void) 170*f180a3b7SHieu Nguyen * Function to initialize log area 171*f180a3b7SHieu Nguyen * --------------------------------------------- 172*f180a3b7SHieu Nguyen */ 173*f180a3b7SHieu Nguyenfunc plat_crash_console_init 174*f180a3b7SHieu Nguyen mov x1, sp 175*f180a3b7SHieu Nguyen mov_imm x2, RCAR_CRASH_STACK 176*f180a3b7SHieu Nguyen mov sp, x2 177*f180a3b7SHieu Nguyen str x1, [sp, #-16]! 178*f180a3b7SHieu Nguyen str x30, [sp, #-16]! 179*f180a3b7SHieu Nguyen bl console_rcar_init 180*f180a3b7SHieu Nguyen ldr x30, [sp], #16 181*f180a3b7SHieu Nguyen ldr x1, [sp], #16 182*f180a3b7SHieu Nguyen mov sp, x1 183*f180a3b7SHieu Nguyen ret 184*f180a3b7SHieu Nguyenendfunc plat_crash_console_init 185*f180a3b7SHieu Nguyen 186*f180a3b7SHieu Nguyen /* --------------------------------------------- 187*f180a3b7SHieu Nguyen * int plat_crash_console_putc(int c) 188*f180a3b7SHieu Nguyen * Function to store a character to log area 189*f180a3b7SHieu Nguyen * --------------------------------------------- 190*f180a3b7SHieu Nguyen */ 191*f180a3b7SHieu Nguyenfunc plat_crash_console_putc 192*f180a3b7SHieu Nguyen mov x1, sp 193*f180a3b7SHieu Nguyen mov_imm x2, RCAR_CRASH_STACK 194*f180a3b7SHieu Nguyen mov sp, x2 195*f180a3b7SHieu Nguyen str x1, [sp, #-16]! 196*f180a3b7SHieu Nguyen str x30, [sp, #-16]! 197*f180a3b7SHieu Nguyen str x3, [sp, #-16]! 198*f180a3b7SHieu Nguyen str x4, [sp, #-16]! 199*f180a3b7SHieu Nguyen str x5, [sp, #-16]! 200*f180a3b7SHieu Nguyen str x6, [sp, #-16]! 201*f180a3b7SHieu Nguyen str x7, [sp, #-16]! 202*f180a3b7SHieu Nguyen bl console_rcar_putc 203*f180a3b7SHieu Nguyen ldr x7, [sp], #16 204*f180a3b7SHieu Nguyen ldr x6, [sp], #16 205*f180a3b7SHieu Nguyen ldr x5, [sp], #16 206*f180a3b7SHieu Nguyen ldr x4, [sp], #16 207*f180a3b7SHieu Nguyen ldr x3, [sp], #16 208*f180a3b7SHieu Nguyen ldr x30, [sp], #16 209*f180a3b7SHieu Nguyen ldr x1, [sp], #16 210*f180a3b7SHieu Nguyen mov sp, x1 211*f180a3b7SHieu Nguyen ret 212*f180a3b7SHieu Nguyenendfunc plat_crash_console_putc 213*f180a3b7SHieu Nguyen 214*f180a3b7SHieu Nguyen /* --------------------------------------------- 215*f180a3b7SHieu Nguyen * void plat_crash_console_flush() 216*f180a3b7SHieu Nguyen * --------------------------------------------- 217*f180a3b7SHieu Nguyen */ 218*f180a3b7SHieu Nguyenfunc plat_crash_console_flush 219*f180a3b7SHieu Nguyen b console_rcar_flush 220*f180a3b7SHieu Nguyenendfunc plat_crash_console_flush 221*f180a3b7SHieu Nguyen 222*f180a3b7SHieu Nguyen /* --------------------------------------------- 223*f180a3b7SHieu Nguyen * void plat_invalidate_icache(void) 224*f180a3b7SHieu Nguyen * Instruction Cache Invalidate All to PoU 225*f180a3b7SHieu Nguyen * --------------------------------------------- 226*f180a3b7SHieu Nguyen */ 227*f180a3b7SHieu Nguyenfunc plat_invalidate_icache 228*f180a3b7SHieu Nguyen ic iallu 229*f180a3b7SHieu Nguyen ret 230*f180a3b7SHieu Nguyenendfunc plat_invalidate_icache 231*f180a3b7SHieu Nguyen 232*f180a3b7SHieu Nguyen /* ----------------------------------------------------- 233*f180a3b7SHieu Nguyen * void bl31_plat_enable_mmu(uint32_t flags); 234*f180a3b7SHieu Nguyen * 235*f180a3b7SHieu Nguyen * Enable MMU in BL31. 236*f180a3b7SHieu Nguyen * And copy the code to run on System RAM. 237*f180a3b7SHieu Nguyen * Note: This function call will only be done from Warm boot. 238*f180a3b7SHieu Nguyen * ----------------------------------------------------- 239*f180a3b7SHieu Nguyen */ 240*f180a3b7SHieu Nguyenfunc bl31_plat_enable_mmu 241*f180a3b7SHieu Nguyen mov x28, x30 242*f180a3b7SHieu Nguyen bl enable_mmu_direct_el3 243*f180a3b7SHieu Nguyen mov x30, x28 244*f180a3b7SHieu Nguyen ret 245*f180a3b7SHieu Nguyenendfunc bl31_plat_enable_mmu 246