1a2847172SGrzegorz Jaszczyk/* 2*831b0e98SJimmy 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 66a2847172SGrzegorz Jaszczyk mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE 67a2847172SGrzegorz Jaszczyk mov_imm x1, PLAT_MARVELL_CRASH_UART_CLK_IN_HZ 68a2847172SGrzegorz Jaszczyk mov_imm x2, MARVELL_CONSOLE_BAUDRATE 69a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 70a2847172SGrzegorz Jaszczyk b console_a3700_core_init 71a2847172SGrzegorz Jaszczyk#else 72a2847172SGrzegorz Jaszczyk b console_16550_core_init 73a2847172SGrzegorz Jaszczyk#endif 74a2847172SGrzegorz Jaszczykendfunc plat_crash_console_init 75a2847172SGrzegorz Jaszczyk 76a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 77a2847172SGrzegorz Jaszczyk * int plat_crash_console_putc(int c) 78a2847172SGrzegorz Jaszczyk * Function to print a character on the crash 79a2847172SGrzegorz Jaszczyk * console without a C Runtime. 80a2847172SGrzegorz Jaszczyk * Clobber list : x1, x2 81a2847172SGrzegorz Jaszczyk * --------------------------------------------- 82a2847172SGrzegorz Jaszczyk */ 83a2847172SGrzegorz Jaszczykfunc plat_crash_console_putc 84a2847172SGrzegorz Jaszczyk mov_imm x1, PLAT_MARVELL_CRASH_UART_BASE 85a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 86a2847172SGrzegorz Jaszczyk 87a2847172SGrzegorz Jaszczyk b console_a3700_core_putc 88a2847172SGrzegorz Jaszczyk#else 89a2847172SGrzegorz Jaszczyk b console_16550_core_putc 90a2847172SGrzegorz Jaszczyk#endif 91a2847172SGrzegorz Jaszczykendfunc plat_crash_console_putc 92a2847172SGrzegorz Jaszczyk 93a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 94*831b0e98SJimmy Brisson * void plat_crash_console_flush() 95a2847172SGrzegorz Jaszczyk * Function to force a write of all buffered 96a2847172SGrzegorz Jaszczyk * data that hasn't been output. 97*831b0e98SJimmy Brisson * Out : void. 98a2847172SGrzegorz Jaszczyk * Clobber list : r0 99a2847172SGrzegorz Jaszczyk * --------------------------------------------- 100a2847172SGrzegorz Jaszczyk */ 101a2847172SGrzegorz Jaszczykfunc plat_crash_console_flush 102a2847172SGrzegorz Jaszczyk mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE 103a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700 104a2847172SGrzegorz Jaszczyk b console_a3700_core_flush 105a2847172SGrzegorz Jaszczyk#else 106a2847172SGrzegorz Jaszczyk b console_16550_core_flush 107a2847172SGrzegorz Jaszczyk#endif 108a2847172SGrzegorz Jaszczykendfunc plat_crash_console_flush 109a2847172SGrzegorz Jaszczyk 110a2847172SGrzegorz Jaszczyk /* --------------------------------------------------------------------- 111a2847172SGrzegorz Jaszczyk * We don't need to carry out any memory initialization on ARM 112a2847172SGrzegorz Jaszczyk * platforms. The Secure RAM is accessible straight away. 113a2847172SGrzegorz Jaszczyk * --------------------------------------------------------------------- 114a2847172SGrzegorz Jaszczyk */ 115a2847172SGrzegorz Jaszczykfunc platform_mem_init 116a2847172SGrzegorz Jaszczyk ret 117a2847172SGrzegorz Jaszczykendfunc platform_mem_init 118a2847172SGrzegorz Jaszczyk 119a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 120a2847172SGrzegorz Jaszczyk * Disable icache, dcache, and MMU 121a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 122a2847172SGrzegorz Jaszczyk */ 123a2847172SGrzegorz Jaszczykfunc disable_mmu_dcache 124a2847172SGrzegorz Jaszczyk mrs x0, sctlr_el3 125a2847172SGrzegorz Jaszczyk bic x0, x0, 0x1 /* M bit - MMU */ 126a2847172SGrzegorz Jaszczyk bic x0, x0, 0x4 /* C bit - Dcache L1 & L2 */ 127a2847172SGrzegorz Jaszczyk msr sctlr_el3, x0 128a2847172SGrzegorz Jaszczyk isb 129a2847172SGrzegorz Jaszczyk b mmu_off 130a2847172SGrzegorz Jaszczykmmu_off: 131a2847172SGrzegorz Jaszczyk ret 132a2847172SGrzegorz Jaszczykendfunc disable_mmu_dcache 133a2847172SGrzegorz Jaszczyk 134a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 135a2847172SGrzegorz Jaszczyk * Disable all TLB entries 136a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 137a2847172SGrzegorz Jaszczyk */ 138a2847172SGrzegorz Jaszczykfunc invalidate_tlb_all 139a2847172SGrzegorz Jaszczyk tlbi alle3 140a2847172SGrzegorz Jaszczyk dsb sy 141a2847172SGrzegorz Jaszczyk isb 142a2847172SGrzegorz Jaszczyk ret 143a2847172SGrzegorz Jaszczykendfunc invalidate_tlb_all 144a2847172SGrzegorz Jaszczyk 145a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 146a2847172SGrzegorz Jaszczyk * Disable the i cache 147a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 148a2847172SGrzegorz Jaszczyk */ 149a2847172SGrzegorz Jaszczykfunc disable_icache 150a2847172SGrzegorz Jaszczyk mrs x0, sctlr_el3 151a2847172SGrzegorz Jaszczyk bic x0, x0, 0x1000 /* I bit - Icache L1 & L2 */ 152a2847172SGrzegorz Jaszczyk msr sctlr_el3, x0 153a2847172SGrzegorz Jaszczyk isb 154a2847172SGrzegorz Jaszczyk ret 155a2847172SGrzegorz Jaszczykendfunc disable_icache 156a2847172SGrzegorz Jaszczyk 157a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 158a2847172SGrzegorz Jaszczyk * Disable all of the i caches 159a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 160a2847172SGrzegorz Jaszczyk */ 161a2847172SGrzegorz Jaszczykfunc invalidate_icache_all 162a2847172SGrzegorz Jaszczyk ic ialluis 163a2847172SGrzegorz Jaszczyk isb sy 164a2847172SGrzegorz Jaszczyk ret 165a2847172SGrzegorz Jaszczykendfunc invalidate_icache_all 166a2847172SGrzegorz Jaszczyk 167a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 168a2847172SGrzegorz Jaszczyk * Clear the SRAM enabling bit to unmap SRAM 169a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 170a2847172SGrzegorz Jaszczyk */ 171a2847172SGrzegorz Jaszczykfunc platform_unmap_sram 172a2847172SGrzegorz Jaszczyk ldr x0, =CCU_SRAM_WIN_CR 173a2847172SGrzegorz Jaszczyk str wzr, [x0] 174a2847172SGrzegorz Jaszczyk ret 175a2847172SGrzegorz Jaszczykendfunc platform_unmap_sram 176a2847172SGrzegorz Jaszczyk 177a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 178a2847172SGrzegorz Jaszczyk * Disable the SRAM 179a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 180a2847172SGrzegorz Jaszczyk */ 181a2847172SGrzegorz Jaszczykfunc disable_sram 182a2847172SGrzegorz Jaszczyk /* Disable the line lockings. They must be disabled expictly 183a2847172SGrzegorz Jaszczyk * or the OS will have problems using the cache */ 184a2847172SGrzegorz Jaszczyk ldr x1, =MASTER_LLC_TC0_LOCK 185a2847172SGrzegorz Jaszczyk str wzr, [x1] 186a2847172SGrzegorz Jaszczyk 187a2847172SGrzegorz Jaszczyk /* Invalidate all ways */ 188a2847172SGrzegorz Jaszczyk ldr w1, =LLC_WAY_MASK 189772aa5baSKonstantin Porotchkin ldr x0, =MASTER_LLC_INV_WAY 190a2847172SGrzegorz Jaszczyk str w1, [x0] 191a2847172SGrzegorz Jaszczyk 192a2847172SGrzegorz Jaszczyk /* Finally disable LLC */ 193a2847172SGrzegorz Jaszczyk ldr x0, =MASTER_LLC_CTRL 194a2847172SGrzegorz Jaszczyk str wzr, [x0] 195a2847172SGrzegorz Jaszczyk 196a2847172SGrzegorz Jaszczyk ret 197a2847172SGrzegorz Jaszczykendfunc disable_sram 198a2847172SGrzegorz Jaszczyk 199a2847172SGrzegorz Jaszczyk /* ----------------------------------------------------- 200a2847172SGrzegorz Jaszczyk * Operation when exit bootROM: 201a2847172SGrzegorz Jaszczyk * Disable the MMU 202a2847172SGrzegorz Jaszczyk * Disable and invalidate the dcache 203a2847172SGrzegorz Jaszczyk * Unmap and disable the SRAM 204a2847172SGrzegorz Jaszczyk * Disable and invalidate the icache 205a2847172SGrzegorz Jaszczyk * ----------------------------------------------------- 206a2847172SGrzegorz Jaszczyk */ 207a2847172SGrzegorz Jaszczykfunc marvell_exit_bootrom 208a2847172SGrzegorz Jaszczyk /* Save the system restore address */ 209a2847172SGrzegorz Jaszczyk mov x28, x0 210a2847172SGrzegorz Jaszczyk 211a2847172SGrzegorz Jaszczyk /* Close the caches and MMU */ 212a2847172SGrzegorz Jaszczyk bl disable_mmu_dcache 213a2847172SGrzegorz Jaszczyk 214a2847172SGrzegorz Jaszczyk /* 215a2847172SGrzegorz Jaszczyk * There is nothing important in the caches now, 216a2847172SGrzegorz Jaszczyk * so invalidate them instead of cleaning. 217a2847172SGrzegorz Jaszczyk */ 218a2847172SGrzegorz Jaszczyk adr x0, __RW_START__ 219a2847172SGrzegorz Jaszczyk adr x1, __RW_END__ 220a2847172SGrzegorz Jaszczyk sub x1, x1, x0 221a2847172SGrzegorz Jaszczyk bl inv_dcache_range 222a2847172SGrzegorz Jaszczyk bl invalidate_tlb_all 223a2847172SGrzegorz Jaszczyk 224a2847172SGrzegorz Jaszczyk /* 225a2847172SGrzegorz Jaszczyk * Clean the memory mapping of SRAM 226a2847172SGrzegorz Jaszczyk * the DDR mapping will remain to enable boot image to execute 227a2847172SGrzegorz Jaszczyk */ 228a2847172SGrzegorz Jaszczyk bl platform_unmap_sram 229a2847172SGrzegorz Jaszczyk 230a2847172SGrzegorz Jaszczyk /* Disable the SRAM */ 231a2847172SGrzegorz Jaszczyk bl disable_sram 232a2847172SGrzegorz Jaszczyk 233a2847172SGrzegorz Jaszczyk /* Disable and invalidate icache */ 234a2847172SGrzegorz Jaszczyk bl disable_icache 235a2847172SGrzegorz Jaszczyk bl invalidate_icache_all 236a2847172SGrzegorz Jaszczyk 237a2847172SGrzegorz Jaszczyk mov x0, x28 238a2847172SGrzegorz Jaszczyk br x0 239a2847172SGrzegorz Jaszczykendfunc marvell_exit_bootrom 240a2847172SGrzegorz Jaszczyk 241a2847172SGrzegorz Jaszczyk /* 242a2847172SGrzegorz Jaszczyk * Enable L2 UniqueClean evictions with data 243a2847172SGrzegorz Jaszczyk */ 244a2847172SGrzegorz Jaszczykfunc ca72_l2_enable_unique_clean 245a2847172SGrzegorz Jaszczyk 246a2847172SGrzegorz Jaszczyk mrs x0, CORTEX_A72_L2ACTLR_EL1 247a2847172SGrzegorz Jaszczyk orr x0, x0, #CORTEX_A72_L2ACTLR_ENABLE_UNIQUE_CLEAN 248a2847172SGrzegorz Jaszczyk msr CORTEX_A72_L2ACTLR_EL1, x0 249a2847172SGrzegorz Jaszczyk 250a2847172SGrzegorz Jaszczyk ret 251a2847172SGrzegorz Jaszczykendfunc ca72_l2_enable_unique_clean 252