blob: 86c256158247d9b0db029666d7fc5bd858eff4d1 [file] [log] [blame]
Balint Dobszaycc942642019-07-03 13:02:56 +02001/*
Boyan Karatoteva44c3422023-01-27 12:12:56 +00002 * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved.
Balint Dobszaycc942642019-07-03 13:02:56 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <common/bl_common.h>
10#include <cortex_a77.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
Bipin Ravi86499742022-01-18 01:59:06 -060013#include "wa_cve_2022_23960_bhb_vector.S"
Balint Dobszaycc942642019-07-03 13:02:56 +020014
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
17#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled"
18#endif
19
20/* 64-bit only core */
21#if CTX_INCLUDE_AARCH32_REGS == 1
22#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
23#endif
24
Bipin Ravi86499742022-01-18 01:59:06 -060025#if WORKAROUND_CVE_2022_23960
26 wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77
27#endif /* WORKAROUND_CVE_2022_23960 */
28
Boyan Karatoteva44c3422023-01-27 12:12:56 +000029workaround_reset_start cortex_a77, ERRATUM(1508412), ERRATA_A77_1508412
30 /* move cpu revision in again and compare against r0p0 */
31 mov x0, x7
32 mov x1, #CPU_REV(0, 0)
33 bl cpu_rev_var_ls
laurenw-arm99ad9762020-07-14 14:18:34 -050034 cbz x0, 1f
Boyan Karatoteva44c3422023-01-27 12:12:56 +000035
laurenw-arm99ad9762020-07-14 14:18:34 -050036 ldr x0, =0x0
37 msr CORTEX_A77_CPUPSELR_EL3, x0
38 ldr x0, =0x00E8400000
39 msr CORTEX_A77_CPUPOR_EL3, x0
40 ldr x0, =0x00FFE00000
41 msr CORTEX_A77_CPUPMR_EL3, x0
42 ldr x0, =0x4004003FF
43 msr CORTEX_A77_CPUPCR_EL3, x0
44 ldr x0, =0x1
45 msr CORTEX_A77_CPUPSELR_EL3, x0
46 ldr x0, =0x00E8C00040
47 msr CORTEX_A77_CPUPOR_EL3, x0
48 ldr x0, =0x00FFE00040
49 msr CORTEX_A77_CPUPMR_EL3, x0
50 b 2f
511:
52 ldr x0, =0x0
53 msr CORTEX_A77_CPUPSELR_EL3, x0
54 ldr x0, =0x00E8400000
55 msr CORTEX_A77_CPUPOR_EL3, x0
56 ldr x0, =0x00FF600000
57 msr CORTEX_A77_CPUPMR_EL3, x0
58 ldr x0, =0x00E8E00080
59 msr CORTEX_A77_CPUPOR2_EL3, x0
60 ldr x0, =0x00FFE000C0
61 msr CORTEX_A77_CPUPMR2_EL3, x0
622:
63 ldr x0, =0x04004003FF
64 msr CORTEX_A77_CPUPCR_EL3, x0
Boyan Karatoteva44c3422023-01-27 12:12:56 +000065workaround_reset_end cortex_a77, ERRATUM(1508412)
laurenw-arm99ad9762020-07-14 14:18:34 -050066
Boyan Karatoteva44c3422023-01-27 12:12:56 +000067check_erratum_ls cortex_a77, ERRATUM(1508412), CPU_REV(1, 0)
laurenw-arm99ad9762020-07-14 14:18:34 -050068
Boyan Karatoteva44c3422023-01-27 12:12:56 +000069workaround_reset_start cortex_a77, ERRATUM(1791578), ERRATA_A77_1791578
Boyan Karatotev751a3112023-01-31 11:05:54 +000070 sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_2
Boyan Karatoteva44c3422023-01-27 12:12:56 +000071workaround_reset_end cortex_a77, ERRATUM(1791578)
Boyan Karatotev1776f422023-01-27 11:56:40 +000072
Boyan Karatoteva44c3422023-01-27 12:12:56 +000073check_erratum_ls cortex_a77, ERRATUM(1791578), CPU_REV(1, 1)
Boyan Karatotev1776f422023-01-27 11:56:40 +000074
Boyan Karatoteva44c3422023-01-27 12:12:56 +000075workaround_reset_start cortex_a77, ERRATUM(1800714), ERRATA_A77_1800714
Boyan Karatotev1776f422023-01-27 11:56:40 +000076 /* Disable allocation of splintered pages in the L2 TLB */
Boyan Karatotev751a3112023-01-31 11:05:54 +000077 sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_53
Boyan Karatoteva44c3422023-01-27 12:12:56 +000078workaround_reset_end cortex_a77, ERRATUM(1800714)
Boyan Karatotev1776f422023-01-27 11:56:40 +000079
Boyan Karatoteva44c3422023-01-27 12:12:56 +000080check_erratum_ls cortex_a77, ERRATUM(1800714), CPU_REV(1, 1)
Boyan Karatotev1776f422023-01-27 11:56:40 +000081
Boyan Karatoteva44c3422023-01-27 12:12:56 +000082workaround_reset_start cortex_a77, ERRATUM(1925769), ERRATA_A77_1925769
Boyan Karatotev751a3112023-01-31 11:05:54 +000083 sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_8
Boyan Karatoteva44c3422023-01-27 12:12:56 +000084workaround_reset_end cortex_a77, ERRATUM(1925769)
johpow01a2fa12c2020-09-10 13:39:26 -050085
Boyan Karatoteva44c3422023-01-27 12:12:56 +000086check_erratum_ls cortex_a77, ERRATUM(1925769), CPU_REV(1, 1)
johpow01a2fa12c2020-09-10 13:39:26 -050087
Boyan Karatoteva44c3422023-01-27 12:12:56 +000088workaround_reset_start cortex_a77, ERRATUM(1946167), ERRATA_A77_1946167
laurenw-armf5dbbef2021-03-23 13:09:35 -050089 ldr x0,=0x4
90 msr CORTEX_A77_CPUPSELR_EL3,x0
91 ldr x0,=0x10E3900002
92 msr CORTEX_A77_CPUPOR_EL3,x0
93 ldr x0,=0x10FFF00083
94 msr CORTEX_A77_CPUPMR_EL3,x0
95 ldr x0,=0x2001003FF
96 msr CORTEX_A77_CPUPCR_EL3,x0
97
98 ldr x0,=0x5
99 msr CORTEX_A77_CPUPSELR_EL3,x0
100 ldr x0,=0x10E3800082
101 msr CORTEX_A77_CPUPOR_EL3,x0
102 ldr x0,=0x10FFF00083
103 msr CORTEX_A77_CPUPMR_EL3,x0
104 ldr x0,=0x2001003FF
105 msr CORTEX_A77_CPUPCR_EL3,x0
106
107 ldr x0,=0x6
108 msr CORTEX_A77_CPUPSELR_EL3,x0
109 ldr x0,=0x10E3800200
110 msr CORTEX_A77_CPUPOR_EL3,x0
111 ldr x0,=0x10FFF003E0
112 msr CORTEX_A77_CPUPMR_EL3,x0
113 ldr x0,=0x2001003FF
114 msr CORTEX_A77_CPUPCR_EL3,x0
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000115workaround_reset_end cortex_a77, ERRATUM(1946167)
laurenw-armf5dbbef2021-03-23 13:09:35 -0500116
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000117check_erratum_ls cortex_a77, ERRATUM(1946167), CPU_REV(1, 1)
laurenw-armf5dbbef2021-03-23 13:09:35 -0500118
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000119workaround_reset_start cortex_a77, ERRATUM(2356587), ERRATA_A77_2356587
Boyan Karatotev751a3112023-01-31 11:05:54 +0000120 sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_0
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000121workaround_reset_end cortex_a77, ERRATUM(2356587)
Bipin Ravi8e916622022-06-08 15:27:00 -0500122
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000123check_erratum_ls cortex_a77, ERRATUM(2356587), CPU_REV(1, 1)
Boyan Karatotevaaf5d292022-11-01 11:22:12 +0000124
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000125workaround_runtime_start cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100
Boyan Karatotevaaf5d292022-11-01 11:22:12 +0000126 /* dsb before isb of power down sequence */
127 dsb sy
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000128workaround_runtime_end cortex_a77, ERRATUM(2743100), NO_ISB
johpow01eb146102021-05-03 13:37:13 -0500129
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000130check_erratum_ls cortex_a77, ERRATUM(2743100), CPU_REV(1, 1)
Bipin Ravi8e916622022-06-08 15:27:00 -0500131
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000132workaround_reset_start cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
133#if IMAGE_BL31
Bipin Ravi86499742022-01-18 01:59:06 -0600134 /*
135 * The Cortex-A77 generic vectors are overridden to apply errata
136 * mitigation on exception entry from lower ELs.
137 */
138 adr x0, wa_cve_vbar_cortex_a77
139 msr vbar_el3, x0
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000140#endif /* IMAGE_BL31 */
141workaround_reset_end cortex_a77, CVE(2022, 23960)
Bipin Ravi86499742022-01-18 01:59:06 -0600142
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000143check_erratum_chosen cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
Boyan Karatoteve5cf16b2022-09-27 10:37:54 +0100144
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000145 /* -------------------------------------------------
146 * The CPU Ops reset function for Cortex-A77. Must follow AAPCS.
147 * -------------------------------------------------
148 */
149cpu_reset_func_start cortex_a77
150cpu_reset_func_end cortex_a77
johpow0168aedc72020-06-03 15:23:31 -0500151
Balint Dobszaycc942642019-07-03 13:02:56 +0200152 /* ---------------------------------------------
153 * HW will do the cache maintenance while powering down
154 * ---------------------------------------------
155 */
156func cortex_a77_core_pwr_dwn
157 /* ---------------------------------------------
158 * Enable CPU power down bit in power control register
159 * ---------------------------------------------
160 */
Boyan Karatotev751a3112023-01-31 11:05:54 +0000161 sysreg_bit_set CORTEX_A77_CPUPWRCTLR_EL1, \
162 CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
163
164 apply_erratum cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100
165
Balint Dobszaycc942642019-07-03 13:02:56 +0200166 isb
167 ret
168endfunc cortex_a77_core_pwr_dwn
169
Boyan Karatoteva44c3422023-01-27 12:12:56 +0000170errata_report_shim cortex_a77
Balint Dobszaycc942642019-07-03 13:02:56 +0200171 /* ---------------------------------------------
172 * This function provides Cortex-A77 specific
173 * register information for crash reporting.
174 * It needs to return with x6 pointing to
175 * a list of register names in ascii and
176 * x8 - x15 having values of registers to be
177 * reported.
178 * ---------------------------------------------
179 */
180.section .rodata.cortex_a77_regs, "aS"
181cortex_a77_regs: /* The ascii list of register names to be reported */
182 .asciz "cpuectlr_el1", ""
183
184func cortex_a77_cpu_reg_dump
185 adr x6, cortex_a77_regs
186 mrs x8, CORTEX_A77_CPUECTLR_EL1
187 ret
188endfunc cortex_a77_cpu_reg_dump
189
190declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
johpow0168aedc72020-06-03 15:23:31 -0500191 cortex_a77_reset_func, \
Balint Dobszaycc942642019-07-03 13:02:56 +0200192 cortex_a77_core_pwr_dwn