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