1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
/*
* Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <asm_macros.S>
#include <assert_macros.S>
#include <cortex_a17.h>
#include <cpu_macros.S>
.macro assert_cache_enabled
#if ENABLE_ASSERTIONS
ldcopr r0, SCTLR
tst r0, #SCTLR_C_BIT
ASM_ASSERT(eq)
#endif
.endm
func cortex_a17_disable_smp
ldcopr r0, ACTLR
bic r0, #CORTEX_A17_ACTLR_SMP_BIT
stcopr r0, ACTLR
isb
dsb sy
bx lr
endfunc cortex_a17_disable_smp
func cortex_a17_enable_smp
ldcopr r0, ACTLR
orr r0, #CORTEX_A17_ACTLR_SMP_BIT
stcopr r0, ACTLR
isb
bx lr
endfunc cortex_a17_enable_smp
/* ----------------------------------------------------
* Errata Workaround for Cortex A17 Errata #852421.
* This applies only to revision <= r1p2 of Cortex A17.
* Inputs:
* r0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: r0-r3
* ----------------------------------------------------
*/
func errata_a17_852421_wa
/*
* Compare r0 against revision r1p2
*/
mov r2, lr
bl check_errata_852421
cmp r0, #ERRATA_NOT_APPLIES
beq 1f
ldcopr r0, CORTEX_A17_IMP_DEF_REG1
orr r0, r0, #(1<<24)
stcopr r0, CORTEX_A17_IMP_DEF_REG1
1:
bx r2
endfunc errata_a17_852421_wa
func check_errata_852421
mov r1, #0x12
b cpu_rev_var_ls
endfunc check_errata_852421
/* ----------------------------------------------------
* Errata Workaround for Cortex A17 Errata #852423.
* This applies only to revision <= r1p2 of Cortex A17.
* Inputs:
* r0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: r0-r3
* ----------------------------------------------------
*/
func errata_a17_852423_wa
/*
* Compare r0 against revision r1p2
*/
mov r2, lr
bl check_errata_852423
cmp r0, #ERRATA_NOT_APPLIES
beq 1f
ldcopr r0, CORTEX_A17_IMP_DEF_REG1
orr r0, r0, #(1<<12)
stcopr r0, CORTEX_A17_IMP_DEF_REG1
1:
bx r2
endfunc errata_a17_852423_wa
func check_errata_852423
mov r1, #0x12
b cpu_rev_var_ls
endfunc check_errata_852423
func check_errata_cve_2017_5715
#if WORKAROUND_CVE_2017_5715
mov r0, #ERRATA_APPLIES
#else
mov r0, #ERRATA_MISSING
#endif
bx lr
endfunc check_errata_cve_2017_5715
#if REPORT_ERRATA
/*
* Errata printing function for Cortex A17. Must follow AAPCS.
*/
func cortex_a17_errata_report
push {r12, lr}
bl cpu_get_rev_var
mov r4, r0
/*
* Report all errata. The revision-variant information is passed to
* checking functions of each errata.
*/
report_errata ERRATA_A17_852421, cortex_a17, 852421
report_errata ERRATA_A17_852423, cortex_a17, 852423
report_errata WORKAROUND_CVE_2017_5715, cortex_a17, cve_2017_5715
pop {r12, lr}
bx lr
endfunc cortex_a17_errata_report
#endif
func cortex_a17_reset_func
mov r5, lr
bl cpu_get_rev_var
mov r4, r0
#if ERRATA_A17_852421
mov r0, r4
bl errata_a17_852421_wa
#endif
#if ERRATA_A17_852423
mov r0, r4
bl errata_a17_852423_wa
#endif
#if IMAGE_BL32 && WORKAROUND_CVE_2017_5715
ldr r0, =workaround_bpiall_runtime_exceptions
stcopr r0, VBAR
stcopr r0, MVBAR
/* isb will be applied in the course of the reset func */
#endif
mov lr, r5
b cortex_a17_enable_smp
endfunc cortex_a17_reset_func
func cortex_a17_core_pwr_dwn
push {r12, lr}
assert_cache_enabled
/* Flush L1 cache */
mov r0, #DC_OP_CISW
bl dcsw_op_level1
/* Exit cluster coherency */
pop {r12, lr}
b cortex_a17_disable_smp
endfunc cortex_a17_core_pwr_dwn
func cortex_a17_cluster_pwr_dwn
push {r12, lr}
assert_cache_enabled
/* Flush L1 caches */
mov r0, #DC_OP_CISW
bl dcsw_op_level1
bl plat_disable_acp
/* Exit cluster coherency */
pop {r12, lr}
b cortex_a17_disable_smp
endfunc cortex_a17_cluster_pwr_dwn
declare_cpu_ops cortex_a17, CORTEX_A17_MIDR, \
cortex_a17_reset_func, \
cortex_a17_core_pwr_dwn, \
cortex_a17_cluster_pwr_dwn
|