125bbbd2dSJavier Almansa Sobrino/* 225bbbd2dSJavier Almansa Sobrino * Copyright (c) 2020, Arm Limited. All rights reserved. 325bbbd2dSJavier Almansa Sobrino * 425bbbd2dSJavier Almansa Sobrino * SPDX-License-Identifier: BSD-3-Clause 525bbbd2dSJavier Almansa Sobrino */ 625bbbd2dSJavier Almansa Sobrino 725bbbd2dSJavier Almansa Sobrino#include <arch.h> 825bbbd2dSJavier Almansa Sobrino#include <asm_macros.S> 925bbbd2dSJavier Almansa Sobrino#include <cpu_macros.S> 1025bbbd2dSJavier Almansa Sobrino#include <neoverse_n2.h> 1125bbbd2dSJavier Almansa Sobrino 1225bbbd2dSJavier Almansa Sobrino/* Hardware handled coherency */ 1325bbbd2dSJavier Almansa Sobrino#if HW_ASSISTED_COHERENCY == 0 1425bbbd2dSJavier Almansa Sobrino#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled" 1525bbbd2dSJavier Almansa Sobrino#endif 1625bbbd2dSJavier Almansa Sobrino 1725bbbd2dSJavier Almansa Sobrino/* 64-bit only core */ 1825bbbd2dSJavier Almansa Sobrino#if CTX_INCLUDE_AARCH32_REGS == 1 1925bbbd2dSJavier Almansa Sobrino#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 2025bbbd2dSJavier Almansa Sobrino#endif 2125bbbd2dSJavier Almansa Sobrino 22*9380f754Snayanpatel-arm/* -------------------------------------------------- 23*9380f754Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2002655. 24*9380f754Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open. 25*9380f754Snayanpatel-arm * Inputs: 26*9380f754Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu. 27*9380f754Snayanpatel-arm * Shall clobber: x0-x17 28*9380f754Snayanpatel-arm * -------------------------------------------------- 29*9380f754Snayanpatel-arm */ 30*9380f754Snayanpatel-armfunc errata_n2_2002655_wa 31*9380f754Snayanpatel-arm /* Check revision. */ 32*9380f754Snayanpatel-arm mov x17, x30 33*9380f754Snayanpatel-arm bl check_errata_2002655 34*9380f754Snayanpatel-arm cbz x0, 1f 35*9380f754Snayanpatel-arm 36*9380f754Snayanpatel-arm /* Apply instruction patching sequence */ 37*9380f754Snayanpatel-arm ldr x0,=0x6 38*9380f754Snayanpatel-arm msr S3_6_c15_c8_0,x0 39*9380f754Snayanpatel-arm ldr x0,=0xF3A08002 40*9380f754Snayanpatel-arm msr S3_6_c15_c8_2,x0 41*9380f754Snayanpatel-arm ldr x0,=0xFFF0F7FE 42*9380f754Snayanpatel-arm msr S3_6_c15_c8_3,x0 43*9380f754Snayanpatel-arm ldr x0,=0x40000001003ff 44*9380f754Snayanpatel-arm msr S3_6_c15_c8_1,x0 45*9380f754Snayanpatel-arm ldr x0,=0x7 46*9380f754Snayanpatel-arm msr S3_6_c15_c8_0,x0 47*9380f754Snayanpatel-arm ldr x0,=0xBF200000 48*9380f754Snayanpatel-arm msr S3_6_c15_c8_2,x0 49*9380f754Snayanpatel-arm ldr x0,=0xFFEF0000 50*9380f754Snayanpatel-arm msr S3_6_c15_c8_3,x0 51*9380f754Snayanpatel-arm ldr x0,=0x40000001003f3 52*9380f754Snayanpatel-arm msr S3_6_c15_c8_1,x0 53*9380f754Snayanpatel-arm isb 54*9380f754Snayanpatel-arm1: 55*9380f754Snayanpatel-arm ret x17 56*9380f754Snayanpatel-armendfunc errata_n2_2002655_wa 57*9380f754Snayanpatel-arm 58*9380f754Snayanpatel-armfunc check_errata_2002655 59*9380f754Snayanpatel-arm /* Applies to r0p0 */ 60*9380f754Snayanpatel-arm mov x1, #0x00 61*9380f754Snayanpatel-arm b cpu_rev_var_ls 62*9380f754Snayanpatel-armendfunc check_errata_2002655 63*9380f754Snayanpatel-arm 6425bbbd2dSJavier Almansa Sobrino /* ------------------------------------------------- 6525bbbd2dSJavier Almansa Sobrino * The CPU Ops reset function for Neoverse N2. 6625bbbd2dSJavier Almansa Sobrino * ------------------------------------------------- 6725bbbd2dSJavier Almansa Sobrino */ 6825bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_reset_func 69*9380f754Snayanpatel-arm mov x19, x30 70*9380f754Snayanpatel-arm 7125bbbd2dSJavier Almansa Sobrino /* Check if the PE implements SSBS */ 7225bbbd2dSJavier Almansa Sobrino mrs x0, id_aa64pfr1_el1 7325bbbd2dSJavier Almansa Sobrino tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 7425bbbd2dSJavier Almansa Sobrino b.eq 1f 7525bbbd2dSJavier Almansa Sobrino 7625bbbd2dSJavier Almansa Sobrino /* Disable speculative loads */ 7725bbbd2dSJavier Almansa Sobrino msr SSBS, xzr 7825bbbd2dSJavier Almansa Sobrino1: 7925bbbd2dSJavier Almansa Sobrino /* Force all cacheable atomic instructions to be near */ 8025bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUACTLR2_EL1 8125bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2 8225bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUACTLR2_EL1, x0 8325bbbd2dSJavier Almansa Sobrino 8425bbbd2dSJavier Almansa Sobrino#if ENABLE_AMU 8525bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 8625bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el3 8725bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 8825bbbd2dSJavier Almansa Sobrino msr cptr_el3, x0 8925bbbd2dSJavier Almansa Sobrino 9025bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 9125bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el2 9225bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 9325bbbd2dSJavier Almansa Sobrino msr cptr_el2, x0 9425bbbd2dSJavier Almansa Sobrino 9525bbbd2dSJavier Almansa Sobrino /* No need to enable the counters as this would be done at el3 exit */ 9625bbbd2dSJavier Almansa Sobrino#endif 9725bbbd2dSJavier Almansa Sobrino 9825bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC 9925bbbd2dSJavier Almansa Sobrino /* Some systems may have External LLC, core needs to be made aware */ 10025bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUECTLR_EL1 10125bbbd2dSJavier Almansa Sobrino orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT 10225bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUECTLR_EL1, x0 10325bbbd2dSJavier Almansa Sobrino#endif 10425bbbd2dSJavier Almansa Sobrino 105*9380f754Snayanpatel-arm bl cpu_get_rev_var 106*9380f754Snayanpatel-arm mov x18, x0 107*9380f754Snayanpatel-arm 108*9380f754Snayanpatel-arm#if ERRATA_N2_2002655 109*9380f754Snayanpatel-arm mov x0, x18 110*9380f754Snayanpatel-arm bl errata_n2_2002655_wa 111*9380f754Snayanpatel-arm#endif 112*9380f754Snayanpatel-arm 11325bbbd2dSJavier Almansa Sobrino isb 114*9380f754Snayanpatel-arm ret x19 11525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_reset_func 11625bbbd2dSJavier Almansa Sobrino 11725bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn 11825bbbd2dSJavier Almansa Sobrino /* --------------------------------------------- 11925bbbd2dSJavier Almansa Sobrino * Enable CPU power down bit in power control register 12025bbbd2dSJavier Almansa Sobrino * No need to do cache maintenance here. 12125bbbd2dSJavier Almansa Sobrino * --------------------------------------------- 12225bbbd2dSJavier Almansa Sobrino */ 12325bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 12425bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT 12525bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 12625bbbd2dSJavier Almansa Sobrino isb 12725bbbd2dSJavier Almansa Sobrino ret 12825bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn 12925bbbd2dSJavier Almansa Sobrino 13025bbbd2dSJavier Almansa Sobrino#if REPORT_ERRATA 13125bbbd2dSJavier Almansa Sobrino/* 13225bbbd2dSJavier Almansa Sobrino * Errata printing function for Neoverse N2 cores. Must follow AAPCS. 13325bbbd2dSJavier Almansa Sobrino */ 13425bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_errata_report 135*9380f754Snayanpatel-arm stp x8, x30, [sp, #-16]! 136*9380f754Snayanpatel-arm 137*9380f754Snayanpatel-arm bl cpu_get_rev_var 138*9380f754Snayanpatel-arm mov x8, x0 139*9380f754Snayanpatel-arm 140*9380f754Snayanpatel-arm /* 141*9380f754Snayanpatel-arm * Report all errata. The revision-variant information is passed to 142*9380f754Snayanpatel-arm * checking functions of each errata. 143*9380f754Snayanpatel-arm */ 144*9380f754Snayanpatel-arm report_errata ERRATA_N2_2002655, neoverse_n2, 2002655 145*9380f754Snayanpatel-arm 146*9380f754Snayanpatel-arm ldp x8, x30, [sp], #16 14725bbbd2dSJavier Almansa Sobrino ret 14825bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_errata_report 14925bbbd2dSJavier Almansa Sobrino#endif 15025bbbd2dSJavier Almansa Sobrino 15125bbbd2dSJavier Almansa Sobrino /* --------------------------------------------- 15225bbbd2dSJavier Almansa Sobrino * This function provides Neoverse N2 specific 15325bbbd2dSJavier Almansa Sobrino * register information for crash reporting. 15425bbbd2dSJavier Almansa Sobrino * It needs to return with x6 pointing to 15525bbbd2dSJavier Almansa Sobrino * a list of register names in ASCII and 15625bbbd2dSJavier Almansa Sobrino * x8 - x15 having values of registers to be 15725bbbd2dSJavier Almansa Sobrino * reported. 15825bbbd2dSJavier Almansa Sobrino * --------------------------------------------- 15925bbbd2dSJavier Almansa Sobrino */ 16025bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS" 16125bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs: /* The ASCII list of register names to be reported */ 16225bbbd2dSJavier Almansa Sobrino .asciz "cpupwrctlr_el1", "" 16325bbbd2dSJavier Almansa Sobrino 16425bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump 16525bbbd2dSJavier Almansa Sobrino adr x6, neoverse_n2_regs 16625bbbd2dSJavier Almansa Sobrino mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1 16725bbbd2dSJavier Almansa Sobrino ret 16825bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump 16925bbbd2dSJavier Almansa Sobrino 17025bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \ 17125bbbd2dSJavier Almansa Sobrino neoverse_n2_reset_func, \ 17225bbbd2dSJavier Almansa Sobrino neoverse_n2_core_pwr_dwn 173