xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n2.S (revision 65e04f27d42c5eccdb3893e41e25363f396e42ed)
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