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