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 <cortex_a72.h> 10*a2847172SGrzegorz Jaszczyk#ifndef PLAT_a3700 11*a2847172SGrzegorz Jaszczyk#include <drivers/marvell/ccu.h> 12*a2847172SGrzegorz Jaszczyk#include <drivers/marvell/cache_llc.h> 13*a2847172SGrzegorz Jaszczyk#endif 14*a2847172SGrzegorz Jaszczyk#include <marvell_def.h> 15*a2847172SGrzegorz Jaszczyk#include <platform_def.h> 16*a2847172SGrzegorz Jaszczyk 17*a2847172SGrzegorz Jaszczyk .weak plat_marvell_calc_core_pos 18*a2847172SGrzegorz Jaszczyk .weak plat_my_core_pos 19*a2847172SGrzegorz Jaszczyk .globl plat_crash_console_init 20*a2847172SGrzegorz Jaszczyk .globl plat_crash_console_putc 21*a2847172SGrzegorz Jaszczyk .globl plat_crash_console_flush 22*a2847172SGrzegorz Jaszczyk .globl platform_mem_init 23*a2847172SGrzegorz Jaszczyk .globl disable_mmu_dcache 24*a2847172SGrzegorz Jaszczyk .globl invalidate_tlb_all 25*a2847172SGrzegorz Jaszczyk .globl platform_unmap_sram 26*a2847172SGrzegorz Jaszczyk .globl disable_sram 27*a2847172SGrzegorz Jaszczyk .globl disable_icache 28*a2847172SGrzegorz Jaszczyk .globl invalidate_icache_all 29*a2847172SGrzegorz Jaszczyk .globl marvell_exit_bootrom 30*a2847172SGrzegorz Jaszczyk .globl ca72_l2_enable_unique_clean 31*a2847172SGrzegorz Jaszczyk 32*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 33*a2847172SGrzegorz Jaszczyk * unsigned int plat_my_core_pos(void) 34*a2847172SGrzegorz Jaszczyk * This function uses the plat_marvell_calc_core_pos() 35*a2847172SGrzegorz Jaszczyk * definition to get the index of the calling CPU. 36*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 37*a2847172SGrzegorz Jaszczyk */ 38*a2847172SGrzegorz Jaszczykfunc plat_my_core_pos 39*a2847172SGrzegorz Jaszczyk mrs x0, mpidr_el1 40*a2847172SGrzegorz Jaszczyk b plat_marvell_calc_core_pos 41*a2847172SGrzegorz Jaszczykendfunc plat_my_core_pos 42*a2847172SGrzegorz Jaszczyk 43*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 44*a2847172SGrzegorz Jaszczyk * unsigned int plat_marvell_calc_core_pos(uint64_t mpidr) 45*a2847172SGrzegorz Jaszczyk * Helper function to calculate the core position. 46*a2847172SGrzegorz Jaszczyk * With this function: CorePos = (ClusterId * 2) + 47*a2847172SGrzegorz Jaszczyk * CoreId 48*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 49*a2847172SGrzegorz Jaszczyk */ 50*a2847172SGrzegorz Jaszczykfunc plat_marvell_calc_core_pos 51*a2847172SGrzegorz Jaszczyk and x1, x0, #MPIDR_CPU_MASK 52*a2847172SGrzegorz Jaszczyk and x0, x0, #MPIDR_CLUSTER_MASK 53*a2847172SGrzegorz Jaszczyk add x0, x1, x0, LSR #7 54*a2847172SGrzegorz Jaszczyk ret 55*a2847172SGrzegorz Jaszczykendfunc plat_marvell_calc_core_pos 56*a2847172SGrzegorz Jaszczyk 57*a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 58*a2847172SGrzegorz Jaszczyk * int plat_crash_console_init(void) 59*a2847172SGrzegorz Jaszczyk * Function to initialize the crash console 60*a2847172SGrzegorz Jaszczyk * without a C Runtime to print crash report. 61*a2847172SGrzegorz Jaszczyk * Clobber list : x0, x1, x2 62*a2847172SGrzegorz Jaszczyk * --------------------------------------------- 63*a2847172SGrzegorz Jaszczyk */ 64*a2847172SGrzegorz Jaszczykfunc plat_crash_console_init 65*a2847172SGrzegorz Jaszczyk mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE 66*a2847172SGrzegorz Jaszczyk mov_imm x1, PLAT_MARVELL_CRASH_UART_CLK_IN_HZ 67*a2847172SGrzegorz Jaszczyk mov_imm x2, MARVELL_CONSOLE_BAUDRATE 68*a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 69*a2847172SGrzegorz Jaszczyk b console_a3700_core_init 70*a2847172SGrzegorz Jaszczyk#else 71*a2847172SGrzegorz Jaszczyk b console_16550_core_init 72*a2847172SGrzegorz Jaszczyk#endif 73*a2847172SGrzegorz Jaszczykendfunc plat_crash_console_init 74*a2847172SGrzegorz Jaszczyk 75*a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 76*a2847172SGrzegorz Jaszczyk * int plat_crash_console_putc(int c) 77*a2847172SGrzegorz Jaszczyk * Function to print a character on the crash 78*a2847172SGrzegorz Jaszczyk * console without a C Runtime. 79*a2847172SGrzegorz Jaszczyk * Clobber list : x1, x2 80*a2847172SGrzegorz Jaszczyk * --------------------------------------------- 81*a2847172SGrzegorz Jaszczyk */ 82*a2847172SGrzegorz Jaszczykfunc plat_crash_console_putc 83*a2847172SGrzegorz Jaszczyk mov_imm x1, PLAT_MARVELL_CRASH_UART_BASE 84*a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 85*a2847172SGrzegorz Jaszczyk 86*a2847172SGrzegorz Jaszczyk b console_a3700_core_putc 87*a2847172SGrzegorz Jaszczyk#else 88*a2847172SGrzegorz Jaszczyk b console_16550_core_putc 89*a2847172SGrzegorz Jaszczyk#endif 90*a2847172SGrzegorz Jaszczykendfunc plat_crash_console_putc 91*a2847172SGrzegorz Jaszczyk 92*a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 93*a2847172SGrzegorz Jaszczyk * int plat_crash_console_flush() 94*a2847172SGrzegorz Jaszczyk * Function to force a write of all buffered 95*a2847172SGrzegorz Jaszczyk * data that hasn't been output. 96*a2847172SGrzegorz Jaszczyk * Out : return -1 on error else return 0. 97*a2847172SGrzegorz Jaszczyk * Clobber list : r0 98*a2847172SGrzegorz Jaszczyk * --------------------------------------------- 99*a2847172SGrzegorz Jaszczyk */ 100*a2847172SGrzegorz Jaszczykfunc plat_crash_console_flush 101*a2847172SGrzegorz Jaszczyk mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE 102*a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 103*a2847172SGrzegorz Jaszczyk b console_a3700_core_flush 104*a2847172SGrzegorz Jaszczyk#else 105*a2847172SGrzegorz Jaszczyk b console_16550_core_flush 106*a2847172SGrzegorz Jaszczyk#endif 107*a2847172SGrzegorz Jaszczykendfunc plat_crash_console_flush 108*a2847172SGrzegorz Jaszczyk 109*a2847172SGrzegorz Jaszczyk /* --------------------------------------------------------------------- 110*a2847172SGrzegorz Jaszczyk * We don't need to carry out any memory initialization on ARM 111*a2847172SGrzegorz Jaszczyk * platforms. The Secure RAM is accessible straight away. 112*a2847172SGrzegorz Jaszczyk * --------------------------------------------------------------------- 113*a2847172SGrzegorz Jaszczyk */ 114*a2847172SGrzegorz Jaszczykfunc platform_mem_init 115*a2847172SGrzegorz Jaszczyk ret 116*a2847172SGrzegorz Jaszczykendfunc platform_mem_init 117*a2847172SGrzegorz Jaszczyk 118*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 119*a2847172SGrzegorz Jaszczyk * Disable icache, dcache, and MMU 120*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 121*a2847172SGrzegorz Jaszczyk */ 122*a2847172SGrzegorz Jaszczykfunc disable_mmu_dcache 123*a2847172SGrzegorz Jaszczyk mrs x0, sctlr_el3 124*a2847172SGrzegorz Jaszczyk bic x0, x0, 0x1 /* M bit - MMU */ 125*a2847172SGrzegorz Jaszczyk bic x0, x0, 0x4 /* C bit - Dcache L1 & L2 */ 126*a2847172SGrzegorz Jaszczyk msr sctlr_el3, x0 127*a2847172SGrzegorz Jaszczyk isb 128*a2847172SGrzegorz Jaszczyk b mmu_off 129*a2847172SGrzegorz Jaszczykmmu_off: 130*a2847172SGrzegorz Jaszczyk ret 131*a2847172SGrzegorz Jaszczykendfunc disable_mmu_dcache 132*a2847172SGrzegorz Jaszczyk 133*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 134*a2847172SGrzegorz Jaszczyk * Disable all TLB entries 135*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 136*a2847172SGrzegorz Jaszczyk */ 137*a2847172SGrzegorz Jaszczykfunc invalidate_tlb_all 138*a2847172SGrzegorz Jaszczyk tlbi alle3 139*a2847172SGrzegorz Jaszczyk dsb sy 140*a2847172SGrzegorz Jaszczyk isb 141*a2847172SGrzegorz Jaszczyk ret 142*a2847172SGrzegorz Jaszczykendfunc invalidate_tlb_all 143*a2847172SGrzegorz Jaszczyk 144*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 145*a2847172SGrzegorz Jaszczyk * Disable the i cache 146*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 147*a2847172SGrzegorz Jaszczyk */ 148*a2847172SGrzegorz Jaszczykfunc disable_icache 149*a2847172SGrzegorz Jaszczyk mrs x0, sctlr_el3 150*a2847172SGrzegorz Jaszczyk bic x0, x0, 0x1000 /* I bit - Icache L1 & L2 */ 151*a2847172SGrzegorz Jaszczyk msr sctlr_el3, x0 152*a2847172SGrzegorz Jaszczyk isb 153*a2847172SGrzegorz Jaszczyk ret 154*a2847172SGrzegorz Jaszczykendfunc disable_icache 155*a2847172SGrzegorz Jaszczyk 156*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 157*a2847172SGrzegorz Jaszczyk * Disable all of the i caches 158*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 159*a2847172SGrzegorz Jaszczyk */ 160*a2847172SGrzegorz Jaszczykfunc invalidate_icache_all 161*a2847172SGrzegorz Jaszczyk ic ialluis 162*a2847172SGrzegorz Jaszczyk isb sy 163*a2847172SGrzegorz Jaszczyk ret 164*a2847172SGrzegorz Jaszczykendfunc invalidate_icache_all 165*a2847172SGrzegorz Jaszczyk 166*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 167*a2847172SGrzegorz Jaszczyk * Clear the SRAM enabling bit to unmap SRAM 168*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 169*a2847172SGrzegorz Jaszczyk */ 170*a2847172SGrzegorz Jaszczykfunc platform_unmap_sram 171*a2847172SGrzegorz Jaszczyk ldr x0, =CCU_SRAM_WIN_CR 172*a2847172SGrzegorz Jaszczyk str wzr, [x0] 173*a2847172SGrzegorz Jaszczyk ret 174*a2847172SGrzegorz Jaszczykendfunc platform_unmap_sram 175*a2847172SGrzegorz Jaszczyk 176*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 177*a2847172SGrzegorz Jaszczyk * Disable the SRAM 178*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 179*a2847172SGrzegorz Jaszczyk */ 180*a2847172SGrzegorz Jaszczykfunc disable_sram 181*a2847172SGrzegorz Jaszczyk /* Disable the line lockings. They must be disabled expictly 182*a2847172SGrzegorz Jaszczyk * or the OS will have problems using the cache */ 183*a2847172SGrzegorz Jaszczyk ldr x1, =MASTER_LLC_TC0_LOCK 184*a2847172SGrzegorz Jaszczyk str wzr, [x1] 185*a2847172SGrzegorz Jaszczyk 186*a2847172SGrzegorz Jaszczyk /* Invalidate all ways */ 187*a2847172SGrzegorz Jaszczyk ldr w1, =LLC_WAY_MASK 188*a2847172SGrzegorz Jaszczyk ldr x0, =MASTER_L2X0_INV_WAY 189*a2847172SGrzegorz Jaszczyk str w1, [x0] 190*a2847172SGrzegorz Jaszczyk 191*a2847172SGrzegorz Jaszczyk /* Finally disable LLC */ 192*a2847172SGrzegorz Jaszczyk ldr x0, =MASTER_LLC_CTRL 193*a2847172SGrzegorz Jaszczyk str wzr, [x0] 194*a2847172SGrzegorz Jaszczyk 195*a2847172SGrzegorz Jaszczyk ret 196*a2847172SGrzegorz Jaszczykendfunc disable_sram 197*a2847172SGrzegorz Jaszczyk 198*a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 199*a2847172SGrzegorz Jaszczyk * Operation when exit bootROM: 200*a2847172SGrzegorz Jaszczyk * Disable the MMU 201*a2847172SGrzegorz Jaszczyk * Disable and invalidate the dcache 202*a2847172SGrzegorz Jaszczyk * Unmap and disable the SRAM 203*a2847172SGrzegorz Jaszczyk * Disable and invalidate the icache 204*a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 205*a2847172SGrzegorz Jaszczyk */ 206*a2847172SGrzegorz Jaszczykfunc marvell_exit_bootrom 207*a2847172SGrzegorz Jaszczyk /* Save the system restore address */ 208*a2847172SGrzegorz Jaszczyk mov x28, x0 209*a2847172SGrzegorz Jaszczyk 210*a2847172SGrzegorz Jaszczyk /* Close the caches and MMU */ 211*a2847172SGrzegorz Jaszczyk bl disable_mmu_dcache 212*a2847172SGrzegorz Jaszczyk 213*a2847172SGrzegorz Jaszczyk /* 214*a2847172SGrzegorz Jaszczyk * There is nothing important in the caches now, 215*a2847172SGrzegorz Jaszczyk * so invalidate them instead of cleaning. 216*a2847172SGrzegorz Jaszczyk */ 217*a2847172SGrzegorz Jaszczyk adr x0, __RW_START__ 218*a2847172SGrzegorz Jaszczyk adr x1, __RW_END__ 219*a2847172SGrzegorz Jaszczyk sub x1, x1, x0 220*a2847172SGrzegorz Jaszczyk bl inv_dcache_range 221*a2847172SGrzegorz Jaszczyk bl invalidate_tlb_all 222*a2847172SGrzegorz Jaszczyk 223*a2847172SGrzegorz Jaszczyk /* 224*a2847172SGrzegorz Jaszczyk * Clean the memory mapping of SRAM 225*a2847172SGrzegorz Jaszczyk * the DDR mapping will remain to enable boot image to execute 226*a2847172SGrzegorz Jaszczyk */ 227*a2847172SGrzegorz Jaszczyk bl platform_unmap_sram 228*a2847172SGrzegorz Jaszczyk 229*a2847172SGrzegorz Jaszczyk /* Disable the SRAM */ 230*a2847172SGrzegorz Jaszczyk bl disable_sram 231*a2847172SGrzegorz Jaszczyk 232*a2847172SGrzegorz Jaszczyk /* Disable and invalidate icache */ 233*a2847172SGrzegorz Jaszczyk bl disable_icache 234*a2847172SGrzegorz Jaszczyk bl invalidate_icache_all 235*a2847172SGrzegorz Jaszczyk 236*a2847172SGrzegorz Jaszczyk mov x0, x28 237*a2847172SGrzegorz Jaszczyk br x0 238*a2847172SGrzegorz Jaszczykendfunc marvell_exit_bootrom 239*a2847172SGrzegorz Jaszczyk 240*a2847172SGrzegorz Jaszczyk /* 241*a2847172SGrzegorz Jaszczyk * Enable L2 UniqueClean evictions with data 242*a2847172SGrzegorz Jaszczyk */ 243*a2847172SGrzegorz Jaszczykfunc ca72_l2_enable_unique_clean 244*a2847172SGrzegorz Jaszczyk 245*a2847172SGrzegorz Jaszczyk mrs x0, CORTEX_A72_L2ACTLR_EL1 246*a2847172SGrzegorz Jaszczyk orr x0, x0, #CORTEX_A72_L2ACTLR_ENABLE_UNIQUE_CLEAN 247*a2847172SGrzegorz Jaszczyk msr CORTEX_A72_L2ACTLR_EL1, x0 248*a2847172SGrzegorz Jaszczyk 249*a2847172SGrzegorz Jaszczyk ret 250*a2847172SGrzegorz Jaszczykendfunc ca72_l2_enable_unique_clean 251