1*044ddf9eSPankaj Gupta/* 2*044ddf9eSPankaj Gupta * Copyright 2018-2021 NXP 3*044ddf9eSPankaj Gupta * 4*044ddf9eSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*044ddf9eSPankaj Gupta * 6*044ddf9eSPankaj Gupta */ 7*044ddf9eSPankaj Gupta 8*044ddf9eSPankaj Gupta#include <asm_macros.S> 9*044ddf9eSPankaj Gupta#include <drivers/console.h> 10*044ddf9eSPankaj Gupta#include <lib/cpus/aarch64/cortex_a72.h> 11*044ddf9eSPankaj Gupta 12*044ddf9eSPankaj Gupta#include <platform_def.h> 13*044ddf9eSPankaj Gupta 14*044ddf9eSPankaj Gupta 15*044ddf9eSPankaj Gupta .globl plat_crash_console_init 16*044ddf9eSPankaj Gupta .globl plat_crash_console_putc 17*044ddf9eSPankaj Gupta .globl plat_crash_console_flush 18*044ddf9eSPankaj Gupta .globl plat_core_pos 19*044ddf9eSPankaj Gupta .globl plat_my_core_pos 20*044ddf9eSPankaj Gupta .globl plat_core_mask 21*044ddf9eSPankaj Gupta .globl plat_my_core_mask 22*044ddf9eSPankaj Gupta .globl plat_core_pos_by_mpidr 23*044ddf9eSPankaj Gupta .globl _disable_ldstr_pfetch_A53 24*044ddf9eSPankaj Gupta .globl _disable_ldstr_pfetch_A72 25*044ddf9eSPankaj Gupta .global _set_smmu_pagesz_64 26*044ddf9eSPankaj Gupta 27*044ddf9eSPankaj Gupta /* int plat_crash_console_init(void) 28*044ddf9eSPankaj Gupta * Function to initialize the crash console 29*044ddf9eSPankaj Gupta * without a C Runtime to print crash report. 30*044ddf9eSPankaj Gupta * Clobber list : x0 - x4 31*044ddf9eSPankaj Gupta */ 32*044ddf9eSPankaj Gupta 33*044ddf9eSPankaj Gupta /* int plat_crash_console_init(void) 34*044ddf9eSPankaj Gupta * Use normal console by default. Switch it to crash 35*044ddf9eSPankaj Gupta * mode so serial consoles become active again. 36*044ddf9eSPankaj Gupta * NOTE: This default implementation will only work for 37*044ddf9eSPankaj Gupta * crashes that occur after a normal console (marked 38*044ddf9eSPankaj Gupta * valid for the crash state) has been registered with 39*044ddf9eSPankaj Gupta * the console framework. To debug crashes that occur 40*044ddf9eSPankaj Gupta * earlier, the platform has to override these functions 41*044ddf9eSPankaj Gupta * with an implementation that initializes a console 42*044ddf9eSPankaj Gupta * driver with hardcoded parameters. See 43*044ddf9eSPankaj Gupta * docs/porting-guide.rst for more information. 44*044ddf9eSPankaj Gupta */ 45*044ddf9eSPankaj Guptafunc plat_crash_console_init 46*044ddf9eSPankaj Gupta mov x3, x30 47*044ddf9eSPankaj Gupta mov x0, #CONSOLE_FLAG_CRASH 48*044ddf9eSPankaj Gupta bl console_switch_state 49*044ddf9eSPankaj Gupta mov x0, #1 50*044ddf9eSPankaj Gupta ret x3 51*044ddf9eSPankaj Guptaendfunc plat_crash_console_init 52*044ddf9eSPankaj Gupta 53*044ddf9eSPankaj Gupta /* void plat_crash_console_putc(int character) 54*044ddf9eSPankaj Gupta * Output through the normal console by default. 55*044ddf9eSPankaj Gupta */ 56*044ddf9eSPankaj Guptafunc plat_crash_console_putc 57*044ddf9eSPankaj Gupta b console_putc 58*044ddf9eSPankaj Guptaendfunc plat_crash_console_putc 59*044ddf9eSPankaj Gupta 60*044ddf9eSPankaj Gupta /* void plat_crash_console_flush(void) 61*044ddf9eSPankaj Gupta * Flush normal console by default. 62*044ddf9eSPankaj Gupta */ 63*044ddf9eSPankaj Guptafunc plat_crash_console_flush 64*044ddf9eSPankaj Gupta b console_flush 65*044ddf9eSPankaj Guptaendfunc plat_crash_console_flush 66*044ddf9eSPankaj Gupta 67*044ddf9eSPankaj Gupta/* This function implements a part of the critical interface between the psci 68*044ddf9eSPankaj Gupta * generic layer and the platform that allows the former to query the platform 69*044ddf9eSPankaj Gupta * to convert an MPIDR to a unique linear index. An error code (-1) is returned 70*044ddf9eSPankaj Gupta * in case the MPIDR is invalid. 71*044ddf9eSPankaj Gupta */ 72*044ddf9eSPankaj Guptafunc plat_core_pos_by_mpidr 73*044ddf9eSPankaj Gupta 74*044ddf9eSPankaj Gupta b plat_core_pos 75*044ddf9eSPankaj Gupta 76*044ddf9eSPankaj Guptaendfunc plat_core_pos_by_mpidr 77*044ddf9eSPankaj Gupta 78*044ddf9eSPankaj Gupta#if (SYMMETRICAL_CLUSTERS) 79*044ddf9eSPankaj Gupta/* unsigned int plat_my_core_mask(void) 80*044ddf9eSPankaj Gupta * generate a mask bit for this core 81*044ddf9eSPankaj Gupta */ 82*044ddf9eSPankaj Guptafunc plat_my_core_mask 83*044ddf9eSPankaj Gupta mrs x0, MPIDR_EL1 84*044ddf9eSPankaj Gupta b plat_core_mask 85*044ddf9eSPankaj Guptaendfunc plat_my_core_mask 86*044ddf9eSPankaj Gupta 87*044ddf9eSPankaj Gupta/* unsigned int plat_core_mask(u_register_t mpidr) 88*044ddf9eSPankaj Gupta * generate a lsb-based mask bit for the core specified by mpidr in x0. 89*044ddf9eSPankaj Gupta * 90*044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core) 91*044ddf9eSPankaj Gupta * mask = (1 << SoC core) 92*044ddf9eSPankaj Gupta */ 93*044ddf9eSPankaj Guptafunc plat_core_mask 94*044ddf9eSPankaj Gupta mov w1, wzr 95*044ddf9eSPankaj Gupta mov w2, wzr 96*044ddf9eSPankaj Gupta 97*044ddf9eSPankaj Gupta /* extract cluster */ 98*044ddf9eSPankaj Gupta bfxil w1, w0, #8, #8 99*044ddf9eSPankaj Gupta /* extract cpu # */ 100*044ddf9eSPankaj Gupta bfxil w2, w0, #0, #8 101*044ddf9eSPankaj Gupta 102*044ddf9eSPankaj Gupta mov w0, wzr 103*044ddf9eSPankaj Gupta 104*044ddf9eSPankaj Gupta /* error checking */ 105*044ddf9eSPankaj Gupta cmp w1, #NUMBER_OF_CLUSTERS 106*044ddf9eSPankaj Gupta b.ge 1f 107*044ddf9eSPankaj Gupta cmp w2, #CORES_PER_CLUSTER 108*044ddf9eSPankaj Gupta b.ge 1f 109*044ddf9eSPankaj Gupta 110*044ddf9eSPankaj Gupta mov w0, #CORES_PER_CLUSTER 111*044ddf9eSPankaj Gupta mul w1, w1, w0 112*044ddf9eSPankaj Gupta add w1, w1, w2 113*044ddf9eSPankaj Gupta mov w2, #0x1 114*044ddf9eSPankaj Gupta lsl w0, w2, w1 115*044ddf9eSPankaj Gupta1: 116*044ddf9eSPankaj Gupta ret 117*044ddf9eSPankaj Guptaendfunc plat_core_mask 118*044ddf9eSPankaj Gupta 119*044ddf9eSPankaj Gupta/* 120*044ddf9eSPankaj Gupta * unsigned int plat_my_core_pos(void) 121*044ddf9eSPankaj Gupta * generate a linear core number for this core 122*044ddf9eSPankaj Gupta */ 123*044ddf9eSPankaj Guptafunc plat_my_core_pos 124*044ddf9eSPankaj Gupta mrs x0, MPIDR_EL1 125*044ddf9eSPankaj Gupta b plat_core_pos 126*044ddf9eSPankaj Guptaendfunc plat_my_core_pos 127*044ddf9eSPankaj Gupta 128*044ddf9eSPankaj Gupta/* 129*044ddf9eSPankaj Gupta * unsigned int plat_core_pos(u_register_t mpidr) 130*044ddf9eSPankaj Gupta * Generate a linear core number for the core specified by mpidr. 131*044ddf9eSPankaj Gupta * 132*044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core) 133*044ddf9eSPankaj Gupta * Returns -1 if mpidr invalid 134*044ddf9eSPankaj Gupta */ 135*044ddf9eSPankaj Guptafunc plat_core_pos 136*044ddf9eSPankaj Gupta mov w1, wzr 137*044ddf9eSPankaj Gupta mov w2, wzr 138*044ddf9eSPankaj Gupta bfxil w1, w0, #8, #8 /* extract cluster */ 139*044ddf9eSPankaj Gupta bfxil w2, w0, #0, #8 /* extract cpu # */ 140*044ddf9eSPankaj Gupta 141*044ddf9eSPankaj Gupta mov w0, #-1 142*044ddf9eSPankaj Gupta 143*044ddf9eSPankaj Gupta /* error checking */ 144*044ddf9eSPankaj Gupta cmp w1, #NUMBER_OF_CLUSTERS 145*044ddf9eSPankaj Gupta b.ge 1f 146*044ddf9eSPankaj Gupta cmp w2, #CORES_PER_CLUSTER 147*044ddf9eSPankaj Gupta b.ge 1f 148*044ddf9eSPankaj Gupta 149*044ddf9eSPankaj Gupta mov w0, #CORES_PER_CLUSTER 150*044ddf9eSPankaj Gupta mul w1, w1, w0 151*044ddf9eSPankaj Gupta add w0, w1, w2 152*044ddf9eSPankaj Gupta1: 153*044ddf9eSPankaj Gupta ret 154*044ddf9eSPankaj Guptaendfunc plat_core_pos 155*044ddf9eSPankaj Gupta 156*044ddf9eSPankaj Gupta#endif 157*044ddf9eSPankaj Gupta 158*044ddf9eSPankaj Gupta/* this function disables the load-store prefetch of the calling core 159*044ddf9eSPankaj Gupta * Note: this function is for A72 cores ONLY 160*044ddf9eSPankaj Gupta * in: none 161*044ddf9eSPankaj Gupta * out: none 162*044ddf9eSPankaj Gupta * uses x0 163*044ddf9eSPankaj Gupta */ 164*044ddf9eSPankaj Guptafunc _disable_ldstr_pfetch_A72 165*044ddf9eSPankaj Gupta 166*044ddf9eSPankaj Gupta mrs x0, CORTEX_A72_CPUACTLR_EL1 167*044ddf9eSPankaj Gupta tst x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH 168*044ddf9eSPankaj Gupta b.eq 1f 169*044ddf9eSPankaj Gupta b 2f 170*044ddf9eSPankaj Gupta 171*044ddf9eSPankaj Gupta.align 6 172*044ddf9eSPankaj Gupta1: 173*044ddf9eSPankaj Gupta dsb sy 174*044ddf9eSPankaj Gupta isb 175*044ddf9eSPankaj Gupta orr x0, x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH 176*044ddf9eSPankaj Gupta msr CORTEX_A72_CPUACTLR_EL1, x0 177*044ddf9eSPankaj Gupta isb 178*044ddf9eSPankaj Gupta 179*044ddf9eSPankaj Gupta2: 180*044ddf9eSPankaj Gupta ret 181*044ddf9eSPankaj Guptaendfunc _disable_ldstr_pfetch_A72 182*044ddf9eSPankaj Gupta 183*044ddf9eSPankaj Gupta/* 184*044ddf9eSPankaj Gupta * Function sets the SACR pagesize to 64k 185*044ddf9eSPankaj Gupta */ 186*044ddf9eSPankaj Guptafunc _set_smmu_pagesz_64 187*044ddf9eSPankaj Gupta 188*044ddf9eSPankaj Gupta ldr x1, =NXP_SMMU_ADDR 189*044ddf9eSPankaj Gupta ldr w0, [x1, #0x10] 190*044ddf9eSPankaj Gupta orr w0, w0, #1 << 16 /* setting to 64K page */ 191*044ddf9eSPankaj Gupta str w0, [x1, #0x10] 192*044ddf9eSPankaj Gupta 193*044ddf9eSPankaj Gupta ret 194*044ddf9eSPankaj Guptaendfunc _set_smmu_pagesz_64 195