1*fd9b3c5aSBiju Das/* 2*fd9b3c5aSBiju Das * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved. 3*fd9b3c5aSBiju Das * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. 4*fd9b3c5aSBiju Das * 5*fd9b3c5aSBiju Das * SPDX-License-Identifier: BSD-3-Clause 6*fd9b3c5aSBiju Das */ 7*fd9b3c5aSBiju Das 8*fd9b3c5aSBiju Das#include <arch.h> 9*fd9b3c5aSBiju Das#include <asm_macros.S> 10*fd9b3c5aSBiju Das#include <common/bl_common.h> 11*fd9b3c5aSBiju Das#include <common/runtime_svc.h> 12*fd9b3c5aSBiju Das#include <cortex_a57.h> 13*fd9b3c5aSBiju Das#include <platform_def.h> 14*fd9b3c5aSBiju Das 15*fd9b3c5aSBiju Das#include "rcar_def.h" 16*fd9b3c5aSBiju Das 17*fd9b3c5aSBiju Das .globl plat_get_my_entrypoint 18*fd9b3c5aSBiju Das .extern plat_set_my_stack 19*fd9b3c5aSBiju Das .globl platform_mem_init 20*fd9b3c5aSBiju Das 21*fd9b3c5aSBiju Das .globl plat_crash_console_init 22*fd9b3c5aSBiju Das .globl plat_crash_console_putc 23*fd9b3c5aSBiju Das .globl plat_crash_console_flush 24*fd9b3c5aSBiju Das .globl plat_invalidate_icache 25*fd9b3c5aSBiju Das .globl plat_report_exception 26*fd9b3c5aSBiju Das .globl plat_secondary_reset 27*fd9b3c5aSBiju Das .globl plat_reset_handler 28*fd9b3c5aSBiju Das .globl plat_my_core_pos 29*fd9b3c5aSBiju Das .extern rcar_log_init 30*fd9b3c5aSBiju Das 31*fd9b3c5aSBiju Das .extern console_rcar_init 32*fd9b3c5aSBiju Das .extern console_rcar_putc 33*fd9b3c5aSBiju Das .extern console_rcar_flush 34*fd9b3c5aSBiju Das 35*fd9b3c5aSBiju Das#if IMAGE_BL2 36*fd9b3c5aSBiju Das #define INT_ID_MASK (0x3ff) 37*fd9b3c5aSBiju Das .extern bl2_interrupt_error_type 38*fd9b3c5aSBiju Das .extern bl2_interrupt_error_id 39*fd9b3c5aSBiju Das .globl bl2_enter_bl31 40*fd9b3c5aSBiju Das .extern gicv2_acknowledge_interrupt 41*fd9b3c5aSBiju Das .extern rcar_swdt_exec 42*fd9b3c5aSBiju Das#endif 43*fd9b3c5aSBiju Das 44*fd9b3c5aSBiju Das /* ----------------------------------------------------- 45*fd9b3c5aSBiju Das * void platform_get_core_pos (mpidr) 46*fd9b3c5aSBiju Das * ----------------------------------------------------- 47*fd9b3c5aSBiju Das */ 48*fd9b3c5aSBiju Dasfunc platform_get_core_pos 49*fd9b3c5aSBiju Das and x1, x0, #MPIDR_CPU_MASK 50*fd9b3c5aSBiju Das and x0, x0, #MPIDR_CLUSTER_MASK 51*fd9b3c5aSBiju Das add x0, x1, x0, LSR #6 52*fd9b3c5aSBiju Das ret 53*fd9b3c5aSBiju Dasendfunc platform_get_core_pos 54*fd9b3c5aSBiju Das 55*fd9b3c5aSBiju Das /* ----------------------------------------------------- 56*fd9b3c5aSBiju Das * void platform_my_core_pos 57*fd9b3c5aSBiju Das * ----------------------------------------------------- 58*fd9b3c5aSBiju Das */ 59*fd9b3c5aSBiju Dasfunc plat_my_core_pos 60*fd9b3c5aSBiju Das mrs x0, mpidr_el1 61*fd9b3c5aSBiju Das b platform_get_core_pos 62*fd9b3c5aSBiju Dasendfunc plat_my_core_pos 63*fd9b3c5aSBiju Das 64*fd9b3c5aSBiju Das /* ----------------------------------------------------- 65*fd9b3c5aSBiju Das * void platform_get_my_entrypoint (unsigned int mpid); 66*fd9b3c5aSBiju Das * 67*fd9b3c5aSBiju Das * Main job of this routine is to distinguish between 68*fd9b3c5aSBiju Das * a cold and warm boot. 69*fd9b3c5aSBiju Das * On a cold boot the secondaries first wait for the 70*fd9b3c5aSBiju Das * platform to be initialized after which they are 71*fd9b3c5aSBiju Das * hotplugged in. The primary proceeds to perform the 72*fd9b3c5aSBiju Das * platform initialization. 73*fd9b3c5aSBiju Das * On a warm boot, each cpu jumps to the address in its 74*fd9b3c5aSBiju Das * mailbox. 75*fd9b3c5aSBiju Das * 76*fd9b3c5aSBiju Das * TODO: Not a good idea to save lr in a temp reg 77*fd9b3c5aSBiju Das * ----------------------------------------------------- 78*fd9b3c5aSBiju Das */ 79*fd9b3c5aSBiju Dasfunc plat_get_my_entrypoint 80*fd9b3c5aSBiju Das mrs x0, mpidr_el1 81*fd9b3c5aSBiju Das mov x9, x30 /* lr */ 82*fd9b3c5aSBiju Das 83*fd9b3c5aSBiju Das#if defined(IMAGE_BL2) 84*fd9b3c5aSBiju Das /* always cold boot on bl2 */ 85*fd9b3c5aSBiju Das mov x0, #0 86*fd9b3c5aSBiju Das ret x9 87*fd9b3c5aSBiju Das#else 88*fd9b3c5aSBiju Das ldr x1, =BOOT_KIND_BASE 89*fd9b3c5aSBiju Das ldr x21, [x1] 90*fd9b3c5aSBiju Das 91*fd9b3c5aSBiju Das /* Check the reset info */ 92*fd9b3c5aSBiju Das and x1, x21, #0x000c 93*fd9b3c5aSBiju Das cmp x1, #0x0008 94*fd9b3c5aSBiju Das beq el3_panic 95*fd9b3c5aSBiju Das cmp x1, #0x000c 96*fd9b3c5aSBiju Das beq el3_panic 97*fd9b3c5aSBiju Das 98*fd9b3c5aSBiju Das /* Check the boot kind */ 99*fd9b3c5aSBiju Das and x1, x21, #0x0003 100*fd9b3c5aSBiju Das cmp x1, #0x0002 101*fd9b3c5aSBiju Das beq el3_panic 102*fd9b3c5aSBiju Das cmp x1, #0x0003 103*fd9b3c5aSBiju Das beq el3_panic 104*fd9b3c5aSBiju Das 105*fd9b3c5aSBiju Das /* warm boot or cold boot */ 106*fd9b3c5aSBiju Das and x1, x21, #1 107*fd9b3c5aSBiju Das cmp x1, #0 108*fd9b3c5aSBiju Das bne warm_reset 109*fd9b3c5aSBiju Das 110*fd9b3c5aSBiju Das /* Cold boot */ 111*fd9b3c5aSBiju Das mov x0, #0 112*fd9b3c5aSBiju Das b exit 113*fd9b3c5aSBiju Das 114*fd9b3c5aSBiju Daswarm_reset: 115*fd9b3c5aSBiju Das /* -------------------------------------------------------------------- 116*fd9b3c5aSBiju Das * A per-cpu mailbox is maintained in the trusted SDRAM. Its flushed out 117*fd9b3c5aSBiju Das * of the caches after every update using normal memory so its safe to 118*fd9b3c5aSBiju Das * read it here with SO attributes 119*fd9b3c5aSBiju Das * --------------------------------------------------------------------- 120*fd9b3c5aSBiju Das */ 121*fd9b3c5aSBiju Das ldr x10, =MBOX_BASE 122*fd9b3c5aSBiju Das bl platform_get_core_pos 123*fd9b3c5aSBiju Das lsl x0, x0, #CACHE_WRITEBACK_SHIFT 124*fd9b3c5aSBiju Das ldr x0, [x10, x0] 125*fd9b3c5aSBiju Das cbz x0, _panic 126*fd9b3c5aSBiju Dasexit: 127*fd9b3c5aSBiju Das ret x9 128*fd9b3c5aSBiju Das_panic: 129*fd9b3c5aSBiju Das b do_panic 130*fd9b3c5aSBiju Das#endif 131*fd9b3c5aSBiju Das 132*fd9b3c5aSBiju Dasendfunc plat_get_my_entrypoint 133*fd9b3c5aSBiju Das 134*fd9b3c5aSBiju Das /* --------------------------------------------- 135*fd9b3c5aSBiju Das * plat_secondary_reset 136*fd9b3c5aSBiju Das * 137*fd9b3c5aSBiju Das * --------------------------------------------- 138*fd9b3c5aSBiju Das */ 139*fd9b3c5aSBiju Dasfunc plat_secondary_reset 140*fd9b3c5aSBiju Das mrs x0, sctlr_el3 141*fd9b3c5aSBiju Das bic x0, x0, #SCTLR_EE_BIT 142*fd9b3c5aSBiju Das msr sctlr_el3, x0 143*fd9b3c5aSBiju Das isb 144*fd9b3c5aSBiju Das 145*fd9b3c5aSBiju Das mrs x0, cptr_el3 146*fd9b3c5aSBiju Das bic w0, w0, #TCPAC_BIT 147*fd9b3c5aSBiju Das bic w0, w0, #TTA_BIT 148*fd9b3c5aSBiju Das bic w0, w0, #TFP_BIT 149*fd9b3c5aSBiju Das msr cptr_el3, x0 150*fd9b3c5aSBiju Das 151*fd9b3c5aSBiju Das mov_imm x0, PARAMS_BASE 152*fd9b3c5aSBiju Das mov_imm x2, BL31_BASE 153*fd9b3c5aSBiju Das ldr x3, =BOOT_KIND_BASE 154*fd9b3c5aSBiju Das mov x1, #0x1 155*fd9b3c5aSBiju Das str x1, [x3] 156*fd9b3c5aSBiju Das br x2 /* jump to BL31 */ 157*fd9b3c5aSBiju Das nop 158*fd9b3c5aSBiju Das nop 159*fd9b3c5aSBiju Das nop 160*fd9b3c5aSBiju Dasendfunc plat_secondary_reset 161*fd9b3c5aSBiju Das 162*fd9b3c5aSBiju Das /* --------------------------------------------- 163*fd9b3c5aSBiju Das * plat_enter_bl31 164*fd9b3c5aSBiju Das * 165*fd9b3c5aSBiju Das * --------------------------------------------- 166*fd9b3c5aSBiju Das */ 167*fd9b3c5aSBiju Dasfunc bl2_enter_bl31 168*fd9b3c5aSBiju Das mov x20, x0 169*fd9b3c5aSBiju Das /* 170*fd9b3c5aSBiju Das * MMU needs to be disabled because both BL2 and BL31 execute 171*fd9b3c5aSBiju Das * in EL3, and therefore share the same address space. 172*fd9b3c5aSBiju Das * BL31 will initialize the address space according to its 173*fd9b3c5aSBiju Das * own requirement. 174*fd9b3c5aSBiju Das */ 175*fd9b3c5aSBiju Das#if RCAR_BL2_DCACHE == 1 176*fd9b3c5aSBiju Das /* Disable mmu and data cache */ 177*fd9b3c5aSBiju Das bl disable_mmu_el3 178*fd9b3c5aSBiju Das /* Data cache clean and invalidate */ 179*fd9b3c5aSBiju Das mov x0, #DCCISW 180*fd9b3c5aSBiju Das bl dcsw_op_all 181*fd9b3c5aSBiju Das /* TLB invalidate all, EL3 */ 182*fd9b3c5aSBiju Das tlbi alle3 183*fd9b3c5aSBiju Das#endif /* RCAR_BL2_DCACHE == 1 */ 184*fd9b3c5aSBiju Das bl disable_mmu_icache_el3 185*fd9b3c5aSBiju Das /* Invalidate instruction cache */ 186*fd9b3c5aSBiju Das ic iallu 187*fd9b3c5aSBiju Das dsb sy 188*fd9b3c5aSBiju Das isb 189*fd9b3c5aSBiju Das ldp x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET] 190*fd9b3c5aSBiju Das msr elr_el3, x0 191*fd9b3c5aSBiju Das msr spsr_el3, x1 192*fd9b3c5aSBiju Das exception_return 193*fd9b3c5aSBiju Dasendfunc bl2_enter_bl31 194*fd9b3c5aSBiju Das 195*fd9b3c5aSBiju Das /* ----------------------------------------------------- 196*fd9b3c5aSBiju Das * void platform_mem_init (void); 197*fd9b3c5aSBiju Das * 198*fd9b3c5aSBiju Das * Zero out the mailbox registers in the shared memory 199*fd9b3c5aSBiju Das * and set the rcar_boot_kind_flag. 200*fd9b3c5aSBiju Das * The mmu is turned off right now and only the primary can 201*fd9b3c5aSBiju Das * ever execute this code. Secondaries will read the 202*fd9b3c5aSBiju Das * mailboxes using SO accesses. 203*fd9b3c5aSBiju Das * ----------------------------------------------------- 204*fd9b3c5aSBiju Das */ 205*fd9b3c5aSBiju Dasfunc platform_mem_init 206*fd9b3c5aSBiju Das#if !IMAGE_BL2 207*fd9b3c5aSBiju Das ldr x0, =MBOX_BASE 208*fd9b3c5aSBiju Das mov w1, #PLATFORM_CORE_COUNT 209*fd9b3c5aSBiju Dasloop: 210*fd9b3c5aSBiju Das str xzr, [x0], #CACHE_WRITEBACK_GRANULE 211*fd9b3c5aSBiju Das subs w1, w1, #1 212*fd9b3c5aSBiju Das b.gt loop 213*fd9b3c5aSBiju Das#endif 214*fd9b3c5aSBiju Das ret 215*fd9b3c5aSBiju Dasendfunc platform_mem_init 216*fd9b3c5aSBiju Das 217*fd9b3c5aSBiju Das /* --------------------------------------------- 218*fd9b3c5aSBiju Das * void plat_report_exception(unsigned int type) 219*fd9b3c5aSBiju Das * Function to report an unhandled exception 220*fd9b3c5aSBiju Das * with platform-specific means. 221*fd9b3c5aSBiju Das * --------------------------------------------- 222*fd9b3c5aSBiju Das */ 223*fd9b3c5aSBiju Dasfunc plat_report_exception 224*fd9b3c5aSBiju Das /* Switch to SP_EL0 */ 225*fd9b3c5aSBiju Das msr spsel, #0 226*fd9b3c5aSBiju Das#if IMAGE_BL2 227*fd9b3c5aSBiju Das mov w1, #FIQ_SP_EL0 228*fd9b3c5aSBiju Das cmp w0, w1 229*fd9b3c5aSBiju Das beq rep_exec_fiq_elx 230*fd9b3c5aSBiju Das b rep_exec_panic_type 231*fd9b3c5aSBiju Dasrep_exec_fiq_elx: 232*fd9b3c5aSBiju Das bl gicv2_acknowledge_interrupt 233*fd9b3c5aSBiju Das mov x2, #INT_ID_MASK 234*fd9b3c5aSBiju Das and x0, x0, x2 235*fd9b3c5aSBiju Das mov x1, #ARM_IRQ_SEC_WDT 236*fd9b3c5aSBiju Das cmp x0, x1 237*fd9b3c5aSBiju Das bne rep_exec_panic_id 238*fd9b3c5aSBiju Das mrs x0, ELR_EL3 239*fd9b3c5aSBiju Das b rcar_swdt_exec 240*fd9b3c5aSBiju Dasrep_exec_panic_type: 241*fd9b3c5aSBiju Das /* x0 is interrupt TYPE */ 242*fd9b3c5aSBiju Das b bl2_interrupt_error_type 243*fd9b3c5aSBiju Dasrep_exec_panic_id: 244*fd9b3c5aSBiju Das /* x0 is interrupt ID */ 245*fd9b3c5aSBiju Das b bl2_interrupt_error_id 246*fd9b3c5aSBiju Dasrep_exec_end: 247*fd9b3c5aSBiju Das#endif 248*fd9b3c5aSBiju Das ret 249*fd9b3c5aSBiju Dasendfunc plat_report_exception 250*fd9b3c5aSBiju Das 251*fd9b3c5aSBiju Das /* --------------------------------------------- 252*fd9b3c5aSBiju Das * int plat_crash_console_init(void) 253*fd9b3c5aSBiju Das * Function to initialize log area 254*fd9b3c5aSBiju Das * --------------------------------------------- 255*fd9b3c5aSBiju Das */ 256*fd9b3c5aSBiju Dasfunc plat_crash_console_init 257*fd9b3c5aSBiju Das#if IMAGE_BL2 258*fd9b3c5aSBiju Das mov x0, #0 259*fd9b3c5aSBiju Das#else 260*fd9b3c5aSBiju Das mov x1, sp 261*fd9b3c5aSBiju Das mov_imm x2, RCAR_CRASH_STACK 262*fd9b3c5aSBiju Das mov sp, x2 263*fd9b3c5aSBiju Das str x1, [sp, #-16]! 264*fd9b3c5aSBiju Das str x30, [sp, #-16]! 265*fd9b3c5aSBiju Das bl console_rcar_init 266*fd9b3c5aSBiju Das ldr x30, [sp], #16 267*fd9b3c5aSBiju Das ldr x1, [sp], #16 268*fd9b3c5aSBiju Das mov sp, x1 269*fd9b3c5aSBiju Das#endif 270*fd9b3c5aSBiju Das ret 271*fd9b3c5aSBiju Dasendfunc plat_crash_console_init 272*fd9b3c5aSBiju Das 273*fd9b3c5aSBiju Das /* --------------------------------------------- 274*fd9b3c5aSBiju Das * int plat_crash_console_putc(int c) 275*fd9b3c5aSBiju Das * Function to store a character to log area 276*fd9b3c5aSBiju Das * --------------------------------------------- 277*fd9b3c5aSBiju Das */ 278*fd9b3c5aSBiju Dasfunc plat_crash_console_putc 279*fd9b3c5aSBiju Das mov x1, sp 280*fd9b3c5aSBiju Das mov_imm x2, RCAR_CRASH_STACK 281*fd9b3c5aSBiju Das mov sp, x2 282*fd9b3c5aSBiju Das str x1, [sp, #-16]! 283*fd9b3c5aSBiju Das str x30, [sp, #-16]! 284*fd9b3c5aSBiju Das str x3, [sp, #-16]! 285*fd9b3c5aSBiju Das str x4, [sp, #-16]! 286*fd9b3c5aSBiju Das str x5, [sp, #-16]! 287*fd9b3c5aSBiju Das bl console_rcar_putc 288*fd9b3c5aSBiju Das ldr x5, [sp], #16 289*fd9b3c5aSBiju Das ldr x4, [sp], #16 290*fd9b3c5aSBiju Das ldr x3, [sp], #16 291*fd9b3c5aSBiju Das ldr x30, [sp], #16 292*fd9b3c5aSBiju Das ldr x1, [sp], #16 293*fd9b3c5aSBiju Das mov sp, x1 294*fd9b3c5aSBiju Das ret 295*fd9b3c5aSBiju Dasendfunc plat_crash_console_putc 296*fd9b3c5aSBiju Das 297*fd9b3c5aSBiju Das /* --------------------------------------------- 298*fd9b3c5aSBiju Das * void plat_crash_console_flush() 299*fd9b3c5aSBiju Das * --------------------------------------------- 300*fd9b3c5aSBiju Das */ 301*fd9b3c5aSBiju Dasfunc plat_crash_console_flush 302*fd9b3c5aSBiju Das b console_rcar_flush 303*fd9b3c5aSBiju Dasendfunc plat_crash_console_flush 304*fd9b3c5aSBiju Das 305*fd9b3c5aSBiju Das /* -------------------------------------------------------------------- 306*fd9b3c5aSBiju Das * void plat_reset_handler(void); 307*fd9b3c5aSBiju Das * 308*fd9b3c5aSBiju Das * Before adding code in this function, refer to the guidelines in 309*fd9b3c5aSBiju Das * docs/firmware-design.md to determine whether the code should reside 310*fd9b3c5aSBiju Das * within the FIRST_RESET_HANDLER_CALL block or not. 311*fd9b3c5aSBiju Das * 312*fd9b3c5aSBiju Das * For R-Car H3: 313*fd9b3c5aSBiju Das * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57 314*fd9b3c5aSBiju Das * - Set the L2 Data setup latency to 1 (i.e. 1 cycles) for Cortex-A57 315*fd9b3c5aSBiju Das * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57 316*fd9b3c5aSBiju Das * For R-Car M3/M3N: 317*fd9b3c5aSBiju Das * - Set the L2 Tag RAM latency to 2 (i.e. 3 cycles) for Cortex-A57 318*fd9b3c5aSBiju Das * - Set the L2 Data setup latency to 0 (i.e. 0 cycles) for Cortex-A57 319*fd9b3c5aSBiju Das * - Set the L2 Data RAM latency to 3 (i.e. 4 cycles) for Cortex-A57 320*fd9b3c5aSBiju Das * 321*fd9b3c5aSBiju Das * -------------------------------------------------------------------- 322*fd9b3c5aSBiju Das */ 323*fd9b3c5aSBiju Dasfunc plat_reset_handler 324*fd9b3c5aSBiju Das /* 325*fd9b3c5aSBiju Das * On R-Car H3 : x2 := 0 326*fd9b3c5aSBiju Das * On R-Car M3/M3N: x2 := 1 327*fd9b3c5aSBiju Das */ 328*fd9b3c5aSBiju Das /* read PRR */ 329*fd9b3c5aSBiju Das ldr x0, =0xFFF00044 330*fd9b3c5aSBiju Das ldr w0, [x0] 331*fd9b3c5aSBiju Das ubfx w0, w0, 8, 8 332*fd9b3c5aSBiju Das /* H3? */ 333*fd9b3c5aSBiju Das cmp w0, #0x4F 334*fd9b3c5aSBiju Das b.eq RCARH3 335*fd9b3c5aSBiju Das /* set R-Car M3/M3N */ 336*fd9b3c5aSBiju Das mov x2, #1 337*fd9b3c5aSBiju Das b CHK_A5x 338*fd9b3c5aSBiju DasRCARH3: 339*fd9b3c5aSBiju Das /* set R-Car H3 */ 340*fd9b3c5aSBiju Das mov x2, #0 341*fd9b3c5aSBiju Das /* -------------------------------------------------------------------- 342*fd9b3c5aSBiju Das * Determine whether this code is executed on a Cortex-A53 or on a 343*fd9b3c5aSBiju Das * Cortex-A57 core. 344*fd9b3c5aSBiju Das * -------------------------------------------------------------------- 345*fd9b3c5aSBiju Das */ 346*fd9b3c5aSBiju DasCHK_A5x: 347*fd9b3c5aSBiju Das mrs x0, midr_el1 348*fd9b3c5aSBiju Das ubfx x1, x0, MIDR_PN_SHIFT, #12 349*fd9b3c5aSBiju Das cmp w1, #((CORTEX_A57_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK) 350*fd9b3c5aSBiju Das b.eq A57 351*fd9b3c5aSBiju Das ret 352*fd9b3c5aSBiju DasA57: 353*fd9b3c5aSBiju Das /* Get data from CORTEX_A57_L2CTLR_EL1 */ 354*fd9b3c5aSBiju Das mrs x0, CORTEX_A57_L2CTLR_EL1 355*fd9b3c5aSBiju Das /* 356*fd9b3c5aSBiju Das * On R-Car H3/M3/M3N 357*fd9b3c5aSBiju Das * 358*fd9b3c5aSBiju Das * L2 Tag RAM latency is bit8-6 of CORTEX_A57_L2CTLR_EL1 359*fd9b3c5aSBiju Das * L2 Data RAM setup is bit5 of CORTEX_A57_L2CTLR_EL1 360*fd9b3c5aSBiju Das * L2 Data RAM latency is bit2-0 of CORTEX_A57_L2CTLR_EL1 361*fd9b3c5aSBiju Das */ 362*fd9b3c5aSBiju Das /* clear bit of L2 RAM */ 363*fd9b3c5aSBiju Das /* ~(0x1e7) -> x1 */ 364*fd9b3c5aSBiju Das mov x1, #0x1e7 365*fd9b3c5aSBiju Das neg x1, x1 366*fd9b3c5aSBiju Das /* clear bit of L2 RAM -> x0 */ 367*fd9b3c5aSBiju Das and x0, x0, x1 368*fd9b3c5aSBiju Das /* L2 Tag RAM latency (3 cycles) */ 369*fd9b3c5aSBiju Das orr x0, x0, #0x2 << 6 370*fd9b3c5aSBiju Das /* If M3/M3N then L2 RAM setup is 0 */ 371*fd9b3c5aSBiju Das cbnz x2, M3_L2 372*fd9b3c5aSBiju Das /* L2 Data RAM setup (1 cycle) */ 373*fd9b3c5aSBiju Das orr x0, x0, #0x1 << 5 374*fd9b3c5aSBiju DasM3_L2: 375*fd9b3c5aSBiju Das /* L2 Data RAM latency (4 cycles) */ 376*fd9b3c5aSBiju Das orr x0, x0, #0x3 377*fd9b3c5aSBiju Das /* Store data to L2CTLR_EL1 */ 378*fd9b3c5aSBiju Das msr CORTEX_A57_L2CTLR_EL1, x0 379*fd9b3c5aSBiju Dasapply_l2_ram_latencies: 380*fd9b3c5aSBiju Das ret 381*fd9b3c5aSBiju Dasendfunc plat_reset_handler 382*fd9b3c5aSBiju Das 383*fd9b3c5aSBiju Das /* --------------------------------------------- 384*fd9b3c5aSBiju Das * void plat_invalidate_icache(void) 385*fd9b3c5aSBiju Das * Instruction Cache Invalidate All to PoU 386*fd9b3c5aSBiju Das * --------------------------------------------- 387*fd9b3c5aSBiju Das */ 388*fd9b3c5aSBiju Dasfunc plat_invalidate_icache 389*fd9b3c5aSBiju Das ic iallu 390*fd9b3c5aSBiju Das 391*fd9b3c5aSBiju Das ret 392*fd9b3c5aSBiju Dasendfunc plat_invalidate_icache 393