blob: 421c174333d304c4c8c20f07a6e648e60c269b7b [file] [log] [blame]
Artsem Artsemenkafea97f72019-09-16 15:11:21 +01001/*
Jimmy Brisson3571fb92020-06-01 10:18:22 -05002 * Copyright (c) 2019-2020, ARM Limited. All rights reserved.
Varun Wadekara3110ad2021-07-27 00:39:40 -07003 * Copyright (c) 2021, NVIDIA Corporation. All rights reserved.
Artsem Artsemenkafea97f72019-09-16 15:11:21 +01004 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#include <arch.h>
9#include <asm_macros.S>
10#include <common/bl_common.h>
Jimmy Brisson7cc90c42020-09-30 15:34:51 -050011#include <cortex_a78_ae.h>
Artsem Artsemenkafea97f72019-09-16 15:11:21 +010012#include <cpu_macros.S>
13#include <plat_macros.S>
14
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
Jimmy Brisson7cc90c42020-09-30 15:34:51 -050017#error "cortex_a78_ae must be compiled with HW_ASSISTED_COHERENCY enabled"
Artsem Artsemenkafea97f72019-09-16 15:11:21 +010018#endif
19
Varun Wadekara3110ad2021-07-27 00:39:40 -070020/* --------------------------------------------------
Varun Wadekar0914fc42021-07-27 02:32:29 -070021 * Errata Workaround for A78 AE Erratum 1941500.
22 * This applies to revisions r0p0 and r0p1 of A78 AE.
23 * Inputs:
24 * x0: variant[4:7] and revision[0:3] of current cpu.
25 * Shall clobber: x0-x17
26 * --------------------------------------------------
27 */
28func errata_a78_ae_1941500_wa
29 /* Compare x0 against revisions r0p0 - r0p1 */
30 mov x17, x30
31 bl check_errata_1941500
32 cbz x0, 1f
33
34 /* Set bit 8 in ECTLR_EL1 */
35 mrs x0, CORTEX_A78_AE_CPUECTLR_EL1
36 bic x0, x0, #CORTEX_A78_AE_CPUECTLR_EL1_BIT_8
37 msr CORTEX_A78_AE_CPUECTLR_EL1, x0
38 isb
391:
40 ret x17
41endfunc errata_a78_ae_1941500_wa
42
43func check_errata_1941500
44 /* Applies to revisions r0p0 and r0p1. */
45 mov x1, #CPU_REV(0, 0)
46 mov x2, #CPU_REV(0, 1)
47 b cpu_rev_var_range
48endfunc check_errata_1941500
49
50/* --------------------------------------------------
Varun Wadekara3110ad2021-07-27 00:39:40 -070051 * Errata Workaround for A78 AE Erratum 1951502.
52 * This applies to revisions r0p0 and r0p1 of A78 AE.
53 * Inputs:
54 * x0: variant[4:7] and revision[0:3] of current cpu.
55 * Shall clobber: x0-x17
56 * --------------------------------------------------
57 */
58func errata_a78_ae_1951502_wa
59 /* Compare x0 against revisions r0p0 - r0p1 */
60 mov x17, x30
61 bl check_errata_1951502
62 cbz x0, 1f
63
64 msr S3_6_c15_c8_0, xzr
65 ldr x0, =0x10E3900002
66 msr S3_6_c15_c8_2, x0
67 ldr x0, =0x10FFF00083
68 msr S3_6_c15_c8_3, x0
69 ldr x0, =0x2001003FF
70 msr S3_6_c15_c8_1, x0
71
72 mov x0, #1
73 msr S3_6_c15_c8_0, x0
74 ldr x0, =0x10E3800082
75 msr S3_6_c15_c8_2, x0
76 ldr x0, =0x10FFF00083
77 msr S3_6_c15_c8_3, x0
78 ldr x0, =0x2001003FF
79 msr S3_6_c15_c8_1, x0
80
81 mov x0, #2
82 msr S3_6_c15_c8_0, x0
83 ldr x0, =0x10E3800200
84 msr S3_6_c15_c8_2, x0
85 ldr x0, =0x10FFF003E0
86 msr S3_6_c15_c8_3, x0
87 ldr x0, =0x2001003FF
88 msr S3_6_c15_c8_1, x0
89
90 isb
911:
92 ret x17
93endfunc errata_a78_ae_1951502_wa
94
95func check_errata_1951502
96 /* Applies to revisions r0p0 and r0p1. */
97 mov x1, #CPU_REV(0, 0)
98 mov x2, #CPU_REV(0, 1)
99 b cpu_rev_var_range
100endfunc check_errata_1951502
101
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100102 /* -------------------------------------------------
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500103 * The CPU Ops reset function for Cortex-A78-AE
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100104 * -------------------------------------------------
105 */
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500106func cortex_a78_ae_reset_func
Varun Wadekara3110ad2021-07-27 00:39:40 -0700107 mov x19, x30
108 bl cpu_get_rev_var
109 mov x18, x0
110
Varun Wadekar0914fc42021-07-27 02:32:29 -0700111#if ERRATA_A78_AE_1941500
112 mov x0, x18
113 bl errata_a78_ae_1941500_wa
114#endif
115
Varun Wadekara3110ad2021-07-27 00:39:40 -0700116#if ERRATA_A78_AE_1951502
117 mov x0, x18
118 bl errata_a78_ae_1951502_wa
119#endif
120
121#if ENABLE_AMU
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100122 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
123 mrs x0, actlr_el3
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500124 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100125 msr actlr_el3, x0
126
127 /* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */
128 mrs x0, actlr_el2
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500129 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100130 msr actlr_el2, x0
131
132 /* Enable group0 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500133 mov x0, #CORTEX_A78_AMU_GROUP0_MASK
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100134 msr CPUAMCNTENSET0_EL0, x0
135
136 /* Enable group1 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500137 mov x0, #CORTEX_A78_AMU_GROUP1_MASK
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100138 msr CPUAMCNTENSET1_EL0, x0
Varun Wadekara3110ad2021-07-27 00:39:40 -0700139#endif
140
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100141 isb
142
Varun Wadekara3110ad2021-07-27 00:39:40 -0700143 ret x19
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500144endfunc cortex_a78_ae_reset_func
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100145
146 /* -------------------------------------------------------
147 * HW will do the cache maintenance while powering down
148 * -------------------------------------------------------
149 */
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500150func cortex_a78_ae_core_pwr_dwn
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100151 /* -------------------------------------------------------
152 * Enable CPU power down bit in power control register
153 * -------------------------------------------------------
154 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500155 mrs x0, CORTEX_A78_CPUPWRCTLR_EL1
156 orr x0, x0, #CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT
157 msr CORTEX_A78_CPUPWRCTLR_EL1, x0
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100158 isb
159 ret
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500160endfunc cortex_a78_ae_core_pwr_dwn
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100161
162 /*
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500163 * Errata printing function for cortex_a78_ae. Must follow AAPCS.
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100164 */
165#if REPORT_ERRATA
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500166func cortex_a78_ae_errata_report
Varun Wadekara3110ad2021-07-27 00:39:40 -0700167 stp x8, x30, [sp, #-16]!
168
169 bl cpu_get_rev_var
170 mov x8, x0
171
172 /*
173 * Report all errata. The revision-variant information is passed to
174 * checking functions of each errata.
175 */
Varun Wadekar0914fc42021-07-27 02:32:29 -0700176 report_errata ERRATA_A78_AE_1941500, cortex_a78_ae, 1941500
Varun Wadekara3110ad2021-07-27 00:39:40 -0700177 report_errata ERRATA_A78_AE_1951502, cortex_a78_ae, 1951502
178
179 ldp x8, x30, [sp], #16
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100180 ret
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500181endfunc cortex_a78_ae_errata_report
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100182#endif
183
184 /* -------------------------------------------------------
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500185 * This function provides cortex_a78_ae specific
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100186 * register information for crash reporting.
187 * It needs to return with x6 pointing to
188 * a list of register names in ascii and
189 * x8 - x15 having values of registers to be
190 * reported.
191 * -------------------------------------------------------
192 */
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500193.section .rodata.cortex_a78_ae_regs, "aS"
194cortex_a78_ae_regs: /* The ascii list of register names to be reported */
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100195 .asciz "cpuectlr_el1", ""
196
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500197func cortex_a78_ae_cpu_reg_dump
198 adr x6, cortex_a78_ae_regs
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500199 mrs x8, CORTEX_A78_CPUECTLR_EL1
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100200 ret
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500201endfunc cortex_a78_ae_cpu_reg_dump
Artsem Artsemenkafea97f72019-09-16 15:11:21 +0100202
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500203declare_cpu_ops cortex_a78_ae, CORTEX_A78_AE_MIDR, \
Varun Wadekara3110ad2021-07-27 00:39:40 -0700204 cortex_a78_ae_reset_func, \
Jimmy Brisson7cc90c42020-09-30 15:34:51 -0500205 cortex_a78_ae_core_pwr_dwn