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