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