blob: a0babb0ef6af3b9c4bb0347411a110bfa4e9c1a5 [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
Sami Mujawara8722e92019-05-10 14:28:37 +010052/* --------------------------------------------------
53 * Disable speculative loads if Neoverse N1 supports
54 * SSBS.
55 *
56 * Shall clobber: x0.
57 * --------------------------------------------------
58 */
59func neoverse_n1_disable_speculative_loads
60 /* Check if the PE implements SSBS */
61 mrs x0, id_aa64pfr1_el1
62 tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
63 b.eq 1f
64
65 /* Disable speculative loads */
66 msr SSBS, xzr
67 isb
68
691:
70 ret
71endfunc neoverse_n1_disable_speculative_loads
72
John Tsichritzis56369c12019-02-19 13:49:06 +000073func neoverse_n1_reset_func
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010074 mov x19, x30
John Tsichritzis1f9ff492019-03-04 16:41:26 +000075
Sami Mujawara8722e92019-05-10 14:28:37 +010076 bl neoverse_n1_disable_speculative_loads
John Tsichritzis1f9ff492019-03-04 16:41:26 +000077
Louis Mayencourtb58142b2019-04-18 14:34:11 +010078 /* Forces all cacheable atomic instructions to be near */
79 mrs x0, NEOVERSE_N1_CPUACTLR2_EL1
80 orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2
81 msr NEOVERSE_N1_CPUACTLR2_EL1, x0
82 isb
83
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010084 bl cpu_get_rev_var
85 mov x18, x0
86
John Tsichritzis56369c12019-02-19 13:49:06 +000087#if ERRATA_N1_1043202
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010088 mov x0, x18
John Tsichritzis56369c12019-02-19 13:49:06 +000089 bl errata_n1_1043202_wa
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +010090#endif
91
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000092#if ENABLE_AMU
93 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
94 mrs x0, actlr_el3
John Tsichritzis56369c12019-02-19 13:49:06 +000095 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
Dimitris Papastamos89736dd2018-02-13 11:28:02 +000096 msr actlr_el3, x0
97 isb
98
99 /* Make sure accesses from EL0/EL1 are not trapped to EL2 */
100 mrs x0, actlr_el2
John Tsichritzis56369c12019-02-19 13:49:06 +0000101 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
Dimitris Papastamos89736dd2018-02-13 11:28:02 +0000102 msr actlr_el2, x0
103 isb
104
105 /* Enable group0 counters */
John Tsichritzis56369c12019-02-19 13:49:06 +0000106 mov x0, #NEOVERSE_N1_AMU_GROUP0_MASK
Dimitris Papastamos89736dd2018-02-13 11:28:02 +0000107 msr CPUAMCNTENSET_EL0, x0
108 isb
109#endif
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100110 ret x19
John Tsichritzis56369c12019-02-19 13:49:06 +0000111endfunc neoverse_n1_reset_func
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100112
113 /* ---------------------------------------------
114 * HW will do the cache maintenance while powering down
115 * ---------------------------------------------
116 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000117func neoverse_n1_core_pwr_dwn
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100118 /* ---------------------------------------------
119 * Enable CPU power down bit in power control register
120 * ---------------------------------------------
121 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000122 mrs x0, NEOVERSE_N1_CPUPWRCTLR_EL1
123 orr x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
124 msr NEOVERSE_N1_CPUPWRCTLR_EL1, x0
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100125 isb
126 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000127endfunc neoverse_n1_core_pwr_dwn
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100128
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100129#if REPORT_ERRATA
130/*
John Tsichritzis56369c12019-02-19 13:49:06 +0000131 * Errata printing function for Neoverse N1. Must follow AAPCS.
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100132 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000133func neoverse_n1_errata_report
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100134 stp x8, x30, [sp, #-16]!
135
136 bl cpu_get_rev_var
137 mov x8, x0
138
139 /*
140 * Report all errata. The revision-variant information is passed to
141 * checking functions of each errata.
142 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000143 report_errata ERRATA_N1_1043202, neoverse_n1, 1043202
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100144
145 ldp x8, x30, [sp], #16
146 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000147endfunc neoverse_n1_errata_report
Dimitris Papastamos7ca21db2018-03-26 16:46:01 +0100148#endif
149
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100150 /* ---------------------------------------------
John Tsichritzis56369c12019-02-19 13:49:06 +0000151 * This function provides neoverse_n1 specific
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100152 * register information for crash reporting.
153 * It needs to return with x6 pointing to
154 * a list of register names in ascii and
155 * x8 - x15 having values of registers to be
156 * reported.
157 * ---------------------------------------------
158 */
John Tsichritzis56369c12019-02-19 13:49:06 +0000159.section .rodata.neoverse_n1_regs, "aS"
160neoverse_n1_regs: /* The ascii list of register names to be reported */
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100161 .asciz "cpuectlr_el1", ""
162
John Tsichritzis56369c12019-02-19 13:49:06 +0000163func neoverse_n1_cpu_reg_dump
164 adr x6, neoverse_n1_regs
165 mrs x8, NEOVERSE_N1_CPUECTLR_EL1
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100166 ret
John Tsichritzis56369c12019-02-19 13:49:06 +0000167endfunc neoverse_n1_cpu_reg_dump
Isla Mitchellea84d6b2017-08-03 16:04:46 +0100168
John Tsichritzis56369c12019-02-19 13:49:06 +0000169declare_cpu_ops neoverse_n1, NEOVERSE_N1_MIDR, \
170 neoverse_n1_reset_func, \
171 neoverse_n1_core_pwr_dwn