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 229380f754Snayanpatel-arm/* -------------------------------------------------- 239380f754Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2002655. 249380f754Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open. 259380f754Snayanpatel-arm * Inputs: 269380f754Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu. 279380f754Snayanpatel-arm * Shall clobber: x0-x17 289380f754Snayanpatel-arm * -------------------------------------------------- 299380f754Snayanpatel-arm */ 309380f754Snayanpatel-armfunc errata_n2_2002655_wa 319380f754Snayanpatel-arm /* Check revision. */ 329380f754Snayanpatel-arm mov x17, x30 339380f754Snayanpatel-arm bl check_errata_2002655 349380f754Snayanpatel-arm cbz x0, 1f 359380f754Snayanpatel-arm 369380f754Snayanpatel-arm /* Apply instruction patching sequence */ 379380f754Snayanpatel-arm ldr x0,=0x6 389380f754Snayanpatel-arm msr S3_6_c15_c8_0,x0 399380f754Snayanpatel-arm ldr x0,=0xF3A08002 409380f754Snayanpatel-arm msr S3_6_c15_c8_2,x0 419380f754Snayanpatel-arm ldr x0,=0xFFF0F7FE 429380f754Snayanpatel-arm msr S3_6_c15_c8_3,x0 439380f754Snayanpatel-arm ldr x0,=0x40000001003ff 449380f754Snayanpatel-arm msr S3_6_c15_c8_1,x0 459380f754Snayanpatel-arm ldr x0,=0x7 469380f754Snayanpatel-arm msr S3_6_c15_c8_0,x0 479380f754Snayanpatel-arm ldr x0,=0xBF200000 489380f754Snayanpatel-arm msr S3_6_c15_c8_2,x0 499380f754Snayanpatel-arm ldr x0,=0xFFEF0000 509380f754Snayanpatel-arm msr S3_6_c15_c8_3,x0 519380f754Snayanpatel-arm ldr x0,=0x40000001003f3 529380f754Snayanpatel-arm msr S3_6_c15_c8_1,x0 539380f754Snayanpatel-arm isb 549380f754Snayanpatel-arm1: 559380f754Snayanpatel-arm ret x17 569380f754Snayanpatel-armendfunc errata_n2_2002655_wa 579380f754Snayanpatel-arm 589380f754Snayanpatel-armfunc check_errata_2002655 599380f754Snayanpatel-arm /* Applies to r0p0 */ 609380f754Snayanpatel-arm mov x1, #0x00 619380f754Snayanpatel-arm b cpu_rev_var_ls 629380f754Snayanpatel-armendfunc check_errata_2002655 639380f754Snayanpatel-arm 64*65e04f27SBipin Ravi/* --------------------------------------------------------------- 65*65e04f27SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2067956. 66*65e04f27SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open. 67*65e04f27SBipin Ravi * Inputs: 68*65e04f27SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu. 69*65e04f27SBipin Ravi * Shall clobber: x0-x17 70*65e04f27SBipin Ravi * --------------------------------------------------------------- 71*65e04f27SBipin Ravi */ 72*65e04f27SBipin Ravifunc errata_n2_2067956_wa 73*65e04f27SBipin Ravi /* Compare x0 against revision r0p0 */ 74*65e04f27SBipin Ravi mov x17, x30 75*65e04f27SBipin Ravi bl check_errata_2067956 76*65e04f27SBipin Ravi cbz x0, 1f 77*65e04f27SBipin Ravi mrs x1, NEOVERSE_N2_CPUACTLR_EL1 78*65e04f27SBipin Ravi orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46 79*65e04f27SBipin Ravi msr NEOVERSE_N2_CPUACTLR_EL1, x1 80*65e04f27SBipin Ravi1: 81*65e04f27SBipin Ravi ret x17 82*65e04f27SBipin Raviendfunc errata_n2_2067956_wa 83*65e04f27SBipin Ravi 84*65e04f27SBipin Ravifunc check_errata_2067956 85*65e04f27SBipin Ravi /* Applies to r0p0 */ 86*65e04f27SBipin Ravi mov x1, #0x00 87*65e04f27SBipin Ravi b cpu_rev_var_ls 88*65e04f27SBipin Raviendfunc check_errata_2067956 89*65e04f27SBipin Ravi 9025bbbd2dSJavier Almansa Sobrino /* ------------------------------------------------- 9125bbbd2dSJavier Almansa Sobrino * The CPU Ops reset function for Neoverse N2. 9225bbbd2dSJavier Almansa Sobrino * ------------------------------------------------- 9325bbbd2dSJavier Almansa Sobrino */ 9425bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_reset_func 959380f754Snayanpatel-arm mov x19, x30 969380f754Snayanpatel-arm 9725bbbd2dSJavier Almansa Sobrino /* Check if the PE implements SSBS */ 9825bbbd2dSJavier Almansa Sobrino mrs x0, id_aa64pfr1_el1 9925bbbd2dSJavier Almansa Sobrino tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 10025bbbd2dSJavier Almansa Sobrino b.eq 1f 10125bbbd2dSJavier Almansa Sobrino 10225bbbd2dSJavier Almansa Sobrino /* Disable speculative loads */ 10325bbbd2dSJavier Almansa Sobrino msr SSBS, xzr 10425bbbd2dSJavier Almansa Sobrino1: 10525bbbd2dSJavier Almansa Sobrino /* Force all cacheable atomic instructions to be near */ 10625bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUACTLR2_EL1 10725bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2 10825bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUACTLR2_EL1, x0 10925bbbd2dSJavier Almansa Sobrino 110*65e04f27SBipin Ravi#if ERRATA_N2_2067956 111*65e04f27SBipin Ravi mov x0, x18 112*65e04f27SBipin Ravi bl errata_n2_2067956_wa 113*65e04f27SBipin Ravi#endif 114*65e04f27SBipin Ravi 11525bbbd2dSJavier Almansa Sobrino#if ENABLE_AMU 11625bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 11725bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el3 11825bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 11925bbbd2dSJavier Almansa Sobrino msr cptr_el3, x0 12025bbbd2dSJavier Almansa Sobrino 12125bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 12225bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el2 12325bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 12425bbbd2dSJavier Almansa Sobrino msr cptr_el2, x0 12525bbbd2dSJavier Almansa Sobrino 12625bbbd2dSJavier Almansa Sobrino /* No need to enable the counters as this would be done at el3 exit */ 12725bbbd2dSJavier Almansa Sobrino#endif 12825bbbd2dSJavier Almansa Sobrino 12925bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC 13025bbbd2dSJavier Almansa Sobrino /* Some systems may have External LLC, core needs to be made aware */ 13125bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUECTLR_EL1 13225bbbd2dSJavier Almansa Sobrino orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT 13325bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUECTLR_EL1, x0 13425bbbd2dSJavier Almansa Sobrino#endif 13525bbbd2dSJavier Almansa Sobrino 1369380f754Snayanpatel-arm bl cpu_get_rev_var 1379380f754Snayanpatel-arm mov x18, x0 1389380f754Snayanpatel-arm 1399380f754Snayanpatel-arm#if ERRATA_N2_2002655 1409380f754Snayanpatel-arm mov x0, x18 1419380f754Snayanpatel-arm bl errata_n2_2002655_wa 1429380f754Snayanpatel-arm#endif 1439380f754Snayanpatel-arm 14425bbbd2dSJavier Almansa Sobrino isb 1459380f754Snayanpatel-arm ret x19 14625bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_reset_func 14725bbbd2dSJavier Almansa Sobrino 14825bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn 14925bbbd2dSJavier Almansa Sobrino /* --------------------------------------------- 15025bbbd2dSJavier Almansa Sobrino * Enable CPU power down bit in power control register 15125bbbd2dSJavier Almansa Sobrino * No need to do cache maintenance here. 15225bbbd2dSJavier Almansa Sobrino * --------------------------------------------- 15325bbbd2dSJavier Almansa Sobrino */ 15425bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 15525bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT 15625bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 15725bbbd2dSJavier Almansa Sobrino isb 15825bbbd2dSJavier Almansa Sobrino ret 15925bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn 16025bbbd2dSJavier Almansa Sobrino 16125bbbd2dSJavier Almansa Sobrino#if REPORT_ERRATA 16225bbbd2dSJavier Almansa Sobrino/* 16325bbbd2dSJavier Almansa Sobrino * Errata printing function for Neoverse N2 cores. Must follow AAPCS. 16425bbbd2dSJavier Almansa Sobrino */ 16525bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_errata_report 1669380f754Snayanpatel-arm stp x8, x30, [sp, #-16]! 1679380f754Snayanpatel-arm 1689380f754Snayanpatel-arm bl cpu_get_rev_var 1699380f754Snayanpatel-arm mov x8, x0 1709380f754Snayanpatel-arm 1719380f754Snayanpatel-arm /* 1729380f754Snayanpatel-arm * Report all errata. The revision-variant information is passed to 1739380f754Snayanpatel-arm * checking functions of each errata. 1749380f754Snayanpatel-arm */ 1759380f754Snayanpatel-arm report_errata ERRATA_N2_2002655, neoverse_n2, 2002655 176*65e04f27SBipin Ravi report_errata ERRATA_N2_2067956, neoverse_n2, 2067956 1779380f754Snayanpatel-arm 1789380f754Snayanpatel-arm ldp x8, x30, [sp], #16 17925bbbd2dSJavier Almansa Sobrino ret 18025bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_errata_report 18125bbbd2dSJavier Almansa Sobrino#endif 18225bbbd2dSJavier Almansa Sobrino 18325bbbd2dSJavier Almansa Sobrino /* --------------------------------------------- 18425bbbd2dSJavier Almansa Sobrino * This function provides Neoverse N2 specific 18525bbbd2dSJavier Almansa Sobrino * register information for crash reporting. 18625bbbd2dSJavier Almansa Sobrino * It needs to return with x6 pointing to 18725bbbd2dSJavier Almansa Sobrino * a list of register names in ASCII and 18825bbbd2dSJavier Almansa Sobrino * x8 - x15 having values of registers to be 18925bbbd2dSJavier Almansa Sobrino * reported. 19025bbbd2dSJavier Almansa Sobrino * --------------------------------------------- 19125bbbd2dSJavier Almansa Sobrino */ 19225bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS" 19325bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs: /* The ASCII list of register names to be reported */ 19425bbbd2dSJavier Almansa Sobrino .asciz "cpupwrctlr_el1", "" 19525bbbd2dSJavier Almansa Sobrino 19625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump 19725bbbd2dSJavier Almansa Sobrino adr x6, neoverse_n2_regs 19825bbbd2dSJavier Almansa Sobrino mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1 19925bbbd2dSJavier Almansa Sobrino ret 20025bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump 20125bbbd2dSJavier Almansa Sobrino 20225bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \ 20325bbbd2dSJavier Almansa Sobrino neoverse_n2_reset_func, \ 20425bbbd2dSJavier Almansa Sobrino neoverse_n2_core_pwr_dwn 205