blob: 2038f318be586ec3ce1527308ff2ebb99dec7ce6 [file] [log] [blame]
Isla Mitchellea84d6b2017-08-03 16:04:46 +01001/*
John Tsichritzis56369c12019-02-19 13:49:06 +00002 * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
Isla Mitchellea84d6b2017-08-03 16:04:46 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
John Tsichritzis56369c12019-02-19 13:49:06 +00009#include <neoverse_n1.h>
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000010#include <cpuamu.h>
Isla Mitchellea84d6b2017-08-03 16:04:46 +010011#include <cpu_macros.S>
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000012
John Tsichritzisfe6df392019-03-19 17:20:52 +000013/* Hardware handled coherency */
14#if HW_ASSISTED_COHERENCY == 0
15#error "Neoverse N1 must be compiled with HW_ASSISTED_COHERENCY enabled"
16#endif
17
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010018/* --------------------------------------------------
John Tsichritzis56369c12019-02-19 13:49:06 +000019 * Errata Workaround for Neoverse N1 Errata
20 * This applies to revision r0p0 and r1p0 of Neoverse N1.
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010021 * Inputs:
22 * x0: variant[4:7] and revision[0:3] of current cpu.
23 * Shall clobber: x0-x17
24 * --------------------------------------------------
25 */
John Tsichritzis56369c12019-02-19 13:49:06 +000026func errata_n1_1043202_wa
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010027 /* Compare x0 against revision r1p0 */
28 mov x17, x30
29 bl check_errata_1043202
30 cbz x0, 1f
31
32 /* Apply instruction patching sequence */
33 ldr x0, =0x0
34 msr CPUPSELR_EL3, x0
35 ldr x0, =0xF3BF8F2F
36 msr CPUPOR_EL3, x0
37 ldr x0, =0xFFFFFFFF
38 msr CPUPMR_EL3, x0
39 ldr x0, =0x800200071
40 msr CPUPCR_EL3, x0
41 isb
421:
43 ret x17
John Tsichritzis56369c12019-02-19 13:49:06 +000044endfunc errata_n1_1043202_wa
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010045
46func check_errata_1043202
47 /* Applies to r0p0 and r1p0 */
48 mov x1, #0x10
49 b cpu_rev_var_ls
50endfunc check_errata_1043202
51
John Tsichritzis56369c12019-02-19 13:49:06 +000052func neoverse_n1_reset_func
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010053 mov x19, x30
John Tsichritzis1f9ff492019-03-04 16:41:26 +000054
55 /* Disables speculative loads */
56 msr SSBS, xzr
57
Louis Mayencourtb58142b2019-04-18 14:34:11 +010058 /* Forces all cacheable atomic instructions to be near */
59 mrs x0, NEOVERSE_N1_CPUACTLR2_EL1
60 orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2
61 msr NEOVERSE_N1_CPUACTLR2_EL1, x0
62 isb
63
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010064 bl cpu_get_rev_var
65 mov x18, x0
66
John Tsichritzis56369c12019-02-19 13:49:06 +000067#if ERRATA_N1_1043202
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010068 mov x0, x18
John Tsichritzis56369c12019-02-19 13:49:06 +000069 bl errata_n1_1043202_wa
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010070#endif
71
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000072#if ENABLE_AMU
73 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
74 mrs x0, actlr_el3
John Tsichritzis56369c12019-02-19 13:49:06 +000075 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000076 msr actlr_el3, x0
77 isb
78
79 /* Make sure accesses from EL0/EL1 are not trapped to EL2 */
80 mrs x0, actlr_el2
John Tsichritzis56369c12019-02-19 13:49:06 +000081 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000082 msr actlr_el2, x0
83 isb
84
85 /* Enable group0 counters */
John Tsichritzis56369c12019-02-19 13:49:06 +000086 mov x0, #NEOVERSE_N1_AMU_GROUP0_MASK
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000087 msr CPUAMCNTENSET_EL0, x0
88 isb
89#endif
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010090 ret x19
John Tsichritzis56369c12019-02-19 13:49:06 +000091endfunc neoverse_n1_reset_func
Isla Mitchellea84d6b2017-08-03 16:04:46 +010092
93 /* ---------------------------------------------
94 * HW will do the cache maintenance while powering down
95 * ---------------------------------------------
96 */
John Tsichritzis56369c12019-02-19 13:49:06 +000097func neoverse_n1_core_pwr_dwn
Isla Mitchellea84d6b2017-08-03 16:04:46 +010098 /* ---------------------------------------------
99 * Enable CPU power down bit in power control register
100 * ---------------------------------------------
101 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000102 mrs x0, NEOVERSE_N1_CPUPWRCTLR_EL1
103 orr x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
104 msr NEOVERSE_N1_CPUPWRCTLR_EL1, x0
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100105 isb
106 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000107endfunc neoverse_n1_core_pwr_dwn
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100108
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100109#if REPORT_ERRATA
110/*
John Tsichritzis56369c12019-02-19 13:49:06 +0000111 * Errata printing function for Neoverse N1. Must follow AAPCS.
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100112 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000113func neoverse_n1_errata_report
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100114 stp x8, x30, [sp, #-16]!
115
116 bl cpu_get_rev_var
117 mov x8, x0
118
119 /*
120 * Report all errata. The revision-variant information is passed to
121 * checking functions of each errata.
122 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000123 report_errata ERRATA_N1_1043202, neoverse_n1, 1043202
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100124
125 ldp x8, x30, [sp], #16
126 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000127endfunc neoverse_n1_errata_report
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100128#endif
129
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100130 /* ---------------------------------------------
John Tsichritzis56369c12019-02-19 13:49:06 +0000131 * This function provides neoverse_n1 specific
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100132 * register information for crash reporting.
133 * It needs to return with x6 pointing to
134 * a list of register names in ascii and
135 * x8 - x15 having values of registers to be
136 * reported.
137 * ---------------------------------------------
138 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000139.section .rodata.neoverse_n1_regs, "aS"
140neoverse_n1_regs: /* The ascii list of register names to be reported */
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100141 .asciz "cpuectlr_el1", ""
142
John Tsichritzis56369c12019-02-19 13:49:06 +0000143func neoverse_n1_cpu_reg_dump
144 adr x6, neoverse_n1_regs
145 mrs x8, NEOVERSE_N1_CPUECTLR_EL1
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100146 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000147endfunc neoverse_n1_cpu_reg_dump
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100148
John Tsichritzis56369c12019-02-19 13:49:06 +0000149declare_cpu_ops neoverse_n1, NEOVERSE_N1_MIDR, \
150 neoverse_n1_reset_func, \
151 neoverse_n1_core_pwr_dwn