1044ddf9eSPankaj Gupta/* 2044ddf9eSPankaj Gupta * Copyright 2018-2021 NXP 3044ddf9eSPankaj Gupta * 4044ddf9eSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5044ddf9eSPankaj Gupta * 6044ddf9eSPankaj Gupta */ 7044ddf9eSPankaj Gupta 8044ddf9eSPankaj Gupta#include <asm_macros.S> 9*3ccc8ac3SJiafei Pan#include <cortex_a53.h> 10044ddf9eSPankaj Gupta#include <drivers/console.h> 11044ddf9eSPankaj Gupta#include <lib/cpus/aarch64/cortex_a72.h> 12044ddf9eSPankaj Gupta 13044ddf9eSPankaj Gupta#include <platform_def.h> 14044ddf9eSPankaj Gupta 15044ddf9eSPankaj Gupta 16044ddf9eSPankaj Gupta .globl plat_crash_console_init 17044ddf9eSPankaj Gupta .globl plat_crash_console_putc 18044ddf9eSPankaj Gupta .globl plat_crash_console_flush 19044ddf9eSPankaj Gupta .globl plat_core_pos 20044ddf9eSPankaj Gupta .globl plat_my_core_pos 21044ddf9eSPankaj Gupta .globl plat_core_mask 22044ddf9eSPankaj Gupta .globl plat_my_core_mask 23044ddf9eSPankaj Gupta .globl plat_core_pos_by_mpidr 24044ddf9eSPankaj Gupta .globl _disable_ldstr_pfetch_A53 25044ddf9eSPankaj Gupta .globl _disable_ldstr_pfetch_A72 26044ddf9eSPankaj Gupta .global _set_smmu_pagesz_64 27044ddf9eSPankaj Gupta 28044ddf9eSPankaj Gupta /* int plat_crash_console_init(void) 29044ddf9eSPankaj Gupta * Function to initialize the crash console 30044ddf9eSPankaj Gupta * without a C Runtime to print crash report. 31044ddf9eSPankaj Gupta * Clobber list : x0 - x4 32044ddf9eSPankaj Gupta */ 33044ddf9eSPankaj Gupta 34044ddf9eSPankaj Gupta /* int plat_crash_console_init(void) 35044ddf9eSPankaj Gupta * Use normal console by default. Switch it to crash 36044ddf9eSPankaj Gupta * mode so serial consoles become active again. 37044ddf9eSPankaj Gupta * NOTE: This default implementation will only work for 38044ddf9eSPankaj Gupta * crashes that occur after a normal console (marked 39044ddf9eSPankaj Gupta * valid for the crash state) has been registered with 40044ddf9eSPankaj Gupta * the console framework. To debug crashes that occur 41044ddf9eSPankaj Gupta * earlier, the platform has to override these functions 42044ddf9eSPankaj Gupta * with an implementation that initializes a console 43044ddf9eSPankaj Gupta * driver with hardcoded parameters. See 44044ddf9eSPankaj Gupta * docs/porting-guide.rst for more information. 45044ddf9eSPankaj Gupta */ 46044ddf9eSPankaj Guptafunc plat_crash_console_init 47044ddf9eSPankaj Gupta mov x3, x30 48044ddf9eSPankaj Gupta mov x0, #CONSOLE_FLAG_CRASH 49044ddf9eSPankaj Gupta bl console_switch_state 50044ddf9eSPankaj Gupta mov x0, #1 51044ddf9eSPankaj Gupta ret x3 52044ddf9eSPankaj Guptaendfunc plat_crash_console_init 53044ddf9eSPankaj Gupta 54044ddf9eSPankaj Gupta /* void plat_crash_console_putc(int character) 55044ddf9eSPankaj Gupta * Output through the normal console by default. 56044ddf9eSPankaj Gupta */ 57044ddf9eSPankaj Guptafunc plat_crash_console_putc 58044ddf9eSPankaj Gupta b console_putc 59044ddf9eSPankaj Guptaendfunc plat_crash_console_putc 60044ddf9eSPankaj Gupta 61044ddf9eSPankaj Gupta /* void plat_crash_console_flush(void) 62044ddf9eSPankaj Gupta * Flush normal console by default. 63044ddf9eSPankaj Gupta */ 64044ddf9eSPankaj Guptafunc plat_crash_console_flush 65044ddf9eSPankaj Gupta b console_flush 66044ddf9eSPankaj Guptaendfunc plat_crash_console_flush 67044ddf9eSPankaj Gupta 68044ddf9eSPankaj Gupta/* This function implements a part of the critical interface between the psci 69044ddf9eSPankaj Gupta * generic layer and the platform that allows the former to query the platform 70044ddf9eSPankaj Gupta * to convert an MPIDR to a unique linear index. An error code (-1) is returned 71044ddf9eSPankaj Gupta * in case the MPIDR is invalid. 72044ddf9eSPankaj Gupta */ 73044ddf9eSPankaj Guptafunc plat_core_pos_by_mpidr 74044ddf9eSPankaj Gupta 75044ddf9eSPankaj Gupta b plat_core_pos 76044ddf9eSPankaj Gupta 77044ddf9eSPankaj Guptaendfunc plat_core_pos_by_mpidr 78044ddf9eSPankaj Gupta 79044ddf9eSPankaj Gupta#if (SYMMETRICAL_CLUSTERS) 80044ddf9eSPankaj Gupta/* unsigned int plat_my_core_mask(void) 81044ddf9eSPankaj Gupta * generate a mask bit for this core 82044ddf9eSPankaj Gupta */ 83044ddf9eSPankaj Guptafunc plat_my_core_mask 84044ddf9eSPankaj Gupta mrs x0, MPIDR_EL1 85044ddf9eSPankaj Gupta b plat_core_mask 86044ddf9eSPankaj Guptaendfunc plat_my_core_mask 87044ddf9eSPankaj Gupta 88044ddf9eSPankaj Gupta/* unsigned int plat_core_mask(u_register_t mpidr) 89044ddf9eSPankaj Gupta * generate a lsb-based mask bit for the core specified by mpidr in x0. 90044ddf9eSPankaj Gupta * 91044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core) 92044ddf9eSPankaj Gupta * mask = (1 << SoC core) 93044ddf9eSPankaj Gupta */ 94044ddf9eSPankaj Guptafunc plat_core_mask 95044ddf9eSPankaj Gupta mov w1, wzr 96044ddf9eSPankaj Gupta mov w2, wzr 97044ddf9eSPankaj Gupta 98044ddf9eSPankaj Gupta /* extract cluster */ 99044ddf9eSPankaj Gupta bfxil w1, w0, #8, #8 100044ddf9eSPankaj Gupta /* extract cpu # */ 101044ddf9eSPankaj Gupta bfxil w2, w0, #0, #8 102044ddf9eSPankaj Gupta 103044ddf9eSPankaj Gupta mov w0, wzr 104044ddf9eSPankaj Gupta 105044ddf9eSPankaj Gupta /* error checking */ 106044ddf9eSPankaj Gupta cmp w1, #NUMBER_OF_CLUSTERS 107044ddf9eSPankaj Gupta b.ge 1f 108044ddf9eSPankaj Gupta cmp w2, #CORES_PER_CLUSTER 109044ddf9eSPankaj Gupta b.ge 1f 110044ddf9eSPankaj Gupta 111044ddf9eSPankaj Gupta mov w0, #CORES_PER_CLUSTER 112044ddf9eSPankaj Gupta mul w1, w1, w0 113044ddf9eSPankaj Gupta add w1, w1, w2 114044ddf9eSPankaj Gupta mov w2, #0x1 115044ddf9eSPankaj Gupta lsl w0, w2, w1 116044ddf9eSPankaj Gupta1: 117044ddf9eSPankaj Gupta ret 118044ddf9eSPankaj Guptaendfunc plat_core_mask 119044ddf9eSPankaj Gupta 120044ddf9eSPankaj Gupta/* 121044ddf9eSPankaj Gupta * unsigned int plat_my_core_pos(void) 122044ddf9eSPankaj Gupta * generate a linear core number for this core 123044ddf9eSPankaj Gupta */ 124044ddf9eSPankaj Guptafunc plat_my_core_pos 125044ddf9eSPankaj Gupta mrs x0, MPIDR_EL1 126044ddf9eSPankaj Gupta b plat_core_pos 127044ddf9eSPankaj Guptaendfunc plat_my_core_pos 128044ddf9eSPankaj Gupta 129044ddf9eSPankaj Gupta/* 130044ddf9eSPankaj Gupta * unsigned int plat_core_pos(u_register_t mpidr) 131044ddf9eSPankaj Gupta * Generate a linear core number for the core specified by mpidr. 132044ddf9eSPankaj Gupta * 133044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core) 134044ddf9eSPankaj Gupta * Returns -1 if mpidr invalid 135044ddf9eSPankaj Gupta */ 136044ddf9eSPankaj Guptafunc plat_core_pos 137044ddf9eSPankaj Gupta mov w1, wzr 138044ddf9eSPankaj Gupta mov w2, wzr 139044ddf9eSPankaj Gupta bfxil w1, w0, #8, #8 /* extract cluster */ 140044ddf9eSPankaj Gupta bfxil w2, w0, #0, #8 /* extract cpu # */ 141044ddf9eSPankaj Gupta 142044ddf9eSPankaj Gupta mov w0, #-1 143044ddf9eSPankaj Gupta 144044ddf9eSPankaj Gupta /* error checking */ 145044ddf9eSPankaj Gupta cmp w1, #NUMBER_OF_CLUSTERS 146044ddf9eSPankaj Gupta b.ge 1f 147044ddf9eSPankaj Gupta cmp w2, #CORES_PER_CLUSTER 148044ddf9eSPankaj Gupta b.ge 1f 149044ddf9eSPankaj Gupta 150044ddf9eSPankaj Gupta mov w0, #CORES_PER_CLUSTER 151044ddf9eSPankaj Gupta mul w1, w1, w0 152044ddf9eSPankaj Gupta add w0, w1, w2 153044ddf9eSPankaj Gupta1: 154044ddf9eSPankaj Gupta ret 155044ddf9eSPankaj Guptaendfunc plat_core_pos 156044ddf9eSPankaj Gupta 157044ddf9eSPankaj Gupta#endif 158044ddf9eSPankaj Gupta 159044ddf9eSPankaj Gupta/* this function disables the load-store prefetch of the calling core 160*3ccc8ac3SJiafei Pan * Note: this function is for A53 cores ONLY 161*3ccc8ac3SJiafei Pan * in: none 162*3ccc8ac3SJiafei Pan * out: none 163*3ccc8ac3SJiafei Pan * uses x0 164*3ccc8ac3SJiafei Pan */ 165*3ccc8ac3SJiafei Panfunc _disable_ldstr_pfetch_A53 166*3ccc8ac3SJiafei Pan mrs x0, CORTEX_A53_CPUACTLR_EL1 167*3ccc8ac3SJiafei Pan tst x0, #CORTEX_A53_CPUACTLR_EL1_L1PCTL 168*3ccc8ac3SJiafei Pan b.ne 1f 169*3ccc8ac3SJiafei Pan b 2f 170*3ccc8ac3SJiafei Pan 171*3ccc8ac3SJiafei Pan.align 6 172*3ccc8ac3SJiafei Pan1: 173*3ccc8ac3SJiafei Pan dsb sy 174*3ccc8ac3SJiafei Pan isb 175*3ccc8ac3SJiafei Pan bic x0, x0, #CORTEX_A53_CPUACTLR_EL1_L1PCTL 176*3ccc8ac3SJiafei Pan msr CORTEX_A53_CPUACTLR_EL1, x0 177*3ccc8ac3SJiafei Pan isb 178*3ccc8ac3SJiafei Pan 179*3ccc8ac3SJiafei Pan2: 180*3ccc8ac3SJiafei Pan ret 181*3ccc8ac3SJiafei Panendfunc _disable_ldstr_pfetch_A53 182*3ccc8ac3SJiafei Pan 183*3ccc8ac3SJiafei Pan 184*3ccc8ac3SJiafei Pan/* this function disables the load-store prefetch of the calling core 185044ddf9eSPankaj Gupta * Note: this function is for A72 cores ONLY 186044ddf9eSPankaj Gupta * in: none 187044ddf9eSPankaj Gupta * out: none 188044ddf9eSPankaj Gupta * uses x0 189044ddf9eSPankaj Gupta */ 190044ddf9eSPankaj Guptafunc _disable_ldstr_pfetch_A72 191044ddf9eSPankaj Gupta 192044ddf9eSPankaj Gupta mrs x0, CORTEX_A72_CPUACTLR_EL1 193044ddf9eSPankaj Gupta tst x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH 194044ddf9eSPankaj Gupta b.eq 1f 195044ddf9eSPankaj Gupta b 2f 196044ddf9eSPankaj Gupta 197044ddf9eSPankaj Gupta.align 6 198044ddf9eSPankaj Gupta1: 199044ddf9eSPankaj Gupta dsb sy 200044ddf9eSPankaj Gupta isb 201044ddf9eSPankaj Gupta orr x0, x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH 202044ddf9eSPankaj Gupta msr CORTEX_A72_CPUACTLR_EL1, x0 203044ddf9eSPankaj Gupta isb 204044ddf9eSPankaj Gupta 205044ddf9eSPankaj Gupta2: 206044ddf9eSPankaj Gupta ret 207044ddf9eSPankaj Guptaendfunc _disable_ldstr_pfetch_A72 208044ddf9eSPankaj Gupta 209044ddf9eSPankaj Gupta/* 210044ddf9eSPankaj Gupta * Function sets the SACR pagesize to 64k 211044ddf9eSPankaj Gupta */ 212044ddf9eSPankaj Guptafunc _set_smmu_pagesz_64 213044ddf9eSPankaj Gupta 214044ddf9eSPankaj Gupta ldr x1, =NXP_SMMU_ADDR 215044ddf9eSPankaj Gupta ldr w0, [x1, #0x10] 216044ddf9eSPankaj Gupta orr w0, w0, #1 << 16 /* setting to 64K page */ 217044ddf9eSPankaj Gupta str w0, [x1, #0x10] 218044ddf9eSPankaj Gupta 219044ddf9eSPankaj Gupta ret 220044ddf9eSPankaj Guptaendfunc _set_smmu_pagesz_64 221