xref: /arm-trusted-firmware/lib/cpus/aarch64/cortex_a55.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <common/bl_common.h>
10*91f16700Schasinglulu#include <cortex_a55.h>
11*91f16700Schasinglulu#include <cpu_macros.S>
12*91f16700Schasinglulu#include <plat_macros.S>
13*91f16700Schasinglulu
14*91f16700Schasinglulu/* Hardware handled coherency */
15*91f16700Schasinglulu#if HW_ASSISTED_COHERENCY == 0
16*91f16700Schasinglulu#error "Cortex-A55 must be compiled with HW_ASSISTED_COHERENCY enabled"
17*91f16700Schasinglulu#endif
18*91f16700Schasinglulu
19*91f16700Schasinglulu	.globl cortex_a55_reset_func
20*91f16700Schasinglulu	.globl cortex_a55_core_pwr_dwn
21*91f16700Schasinglulu
22*91f16700Schasinglulu/* ERRATA_DSU_798953:
23*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a55
24*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata
25*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework.
26*91f16700Schasinglulu */
27*91f16700Schasinglulu.equ check_erratum_cortex_a55_798953, check_errata_dsu_798953
28*91f16700Schasinglulu.equ erratum_cortex_a55_798953_wa, errata_dsu_798953_wa
29*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(798953), ERRATA_DSU_798953, APPLY_AT_RESET
30*91f16700Schasinglulu
31*91f16700Schasinglulu/* ERRATA_DSU_936184:
32*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a55
33*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata
34*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework.
35*91f16700Schasinglulu */
36*91f16700Schasinglulu.equ check_erratum_cortex_a55_936184, check_errata_dsu_936184
37*91f16700Schasinglulu.equ erratum_cortex_a55_936184_wa, errata_dsu_936184_wa
38*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(936184), ERRATA_DSU_936184, APPLY_AT_RESET
39*91f16700Schasinglulu
40*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(768277), ERRATA_A55_768277
41*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_DUAL_ISSUE
42*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(768277)
43*91f16700Schasinglulu
44*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(768277), CPU_REV(0, 0)
45*91f16700Schasinglulu
46*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(778703), ERRATA_A55_778703
47*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUECTLR_EL1, CORTEX_A55_CPUECTLR_EL1_L1WSCTL
48*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_WRITE_STREAMING
49*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(778703)
50*91f16700Schasinglulu
51*91f16700Schasinglulucheck_erratum_custom_start cortex_a55, ERRATUM(778703)
52*91f16700Schasinglulu	mov	x16, x30
53*91f16700Schasinglulu	mov	x1, #0x00
54*91f16700Schasinglulu	bl	cpu_rev_var_ls
55*91f16700Schasinglulu	/*
56*91f16700Schasinglulu	 * Check that no private L2 cache is configured
57*91f16700Schasinglulu	 */
58*91f16700Schasinglulu	mrs	x1, CORTEX_A55_CLIDR_EL1
59*91f16700Schasinglulu	and	x1, x1, CORTEX_A55_CLIDR_EL1_CTYPE3
60*91f16700Schasinglulu	cmp	x1, #0
61*91f16700Schasinglulu	mov	x2, #ERRATA_NOT_APPLIES
62*91f16700Schasinglulu	csel	x0, x0, x2, eq
63*91f16700Schasinglulu	ret	x16
64*91f16700Schasinglulucheck_erratum_custom_end cortex_a55, ERRATUM(778703)
65*91f16700Schasinglulu
66*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(798797), ERRATA_A55_798797
67*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_L1_PAGEWALKS
68*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(798797)
69*91f16700Schasinglulu
70*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(798797), CPU_REV(0, 0)
71*91f16700Schasinglulu
72*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(846532), ERRATA_A55_846532
73*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_DUAL_ISSUE
74*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(846532)
75*91f16700Schasinglulu
76*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(846532), CPU_REV(0, 1)
77*91f16700Schasinglulu
78*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(903758), ERRATA_A55_903758
79*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_L1_PAGEWALKS
80*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(903758)
81*91f16700Schasinglulu
82*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(903758), CPU_REV(0, 1)
83*91f16700Schasinglulu
84*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(1221012), ERRATA_A55_1221012
85*91f16700Schasinglulu	mov	x0, #0x0020
86*91f16700Schasinglulu	movk	x0, #0x0850, lsl #16
87*91f16700Schasinglulu	msr	CPUPOR_EL3, x0
88*91f16700Schasinglulu	mov	x0, #0x0000
89*91f16700Schasinglulu	movk	x0, #0x1FF0, lsl #16
90*91f16700Schasinglulu	movk	x0, #0x2, lsl #32
91*91f16700Schasinglulu	msr	CPUPMR_EL3, x0
92*91f16700Schasinglulu	mov	x0, #0x03fd
93*91f16700Schasinglulu	movk	x0, #0x0110, lsl #16
94*91f16700Schasinglulu	msr	CPUPCR_EL3, x0
95*91f16700Schasinglulu	mov	x0, #0x1
96*91f16700Schasinglulu	msr	CPUPSELR_EL3, x0
97*91f16700Schasinglulu	mov	x0, #0x0040
98*91f16700Schasinglulu	movk	x0, #0x08D0, lsl #16
99*91f16700Schasinglulu	msr	CPUPOR_EL3, x0
100*91f16700Schasinglulu	mov	x0, #0x0040
101*91f16700Schasinglulu	movk	x0, #0x1FF0, lsl #16
102*91f16700Schasinglulu	movk	x0, #0x2, lsl #32
103*91f16700Schasinglulu	msr	CPUPMR_EL3, x0
104*91f16700Schasinglulu	mov	x0, #0x03fd
105*91f16700Schasinglulu	movk	x0, #0x0110, lsl #16
106*91f16700Schasinglulu	msr	CPUPCR_EL3, x0
107*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(1221012)
108*91f16700Schasinglulu
109*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(1221012), CPU_REV(1, 0)
110*91f16700Schasinglulu
111*91f16700Schasinglulucheck_erratum_chosen cortex_a55, ERRATUM(1530923), ERRATA_A55_1530923
112*91f16700Schasinglulu
113*91f16700Schasinglulu/* erratum has no workaround in the cpu. Generic code must take care */
114*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(1530923), ERRATA_A55_1530923, NO_APPLY_AT_RESET
115*91f16700Schasinglulu
116*91f16700Schasinglulucpu_reset_func_start cortex_a55
117*91f16700Schasinglulucpu_reset_func_end cortex_a55
118*91f16700Schasinglulu
119*91f16700Schasingluluerrata_report_shim cortex_a55
120*91f16700Schasinglulu
121*91f16700Schasinglulu	/* ---------------------------------------------
122*91f16700Schasinglulu	 * HW will do the cache maintenance while powering down
123*91f16700Schasinglulu	 * ---------------------------------------------
124*91f16700Schasinglulu	 */
125*91f16700Schasinglulufunc cortex_a55_core_pwr_dwn
126*91f16700Schasinglulu	sysreg_bit_set CORTEX_A55_CPUPWRCTLR_EL1, CORTEX_A55_CORE_PWRDN_EN_MASK
127*91f16700Schasinglulu	isb
128*91f16700Schasinglulu	ret
129*91f16700Schasingluluendfunc cortex_a55_core_pwr_dwn
130*91f16700Schasinglulu
131*91f16700Schasinglulu	/* ---------------------------------------------
132*91f16700Schasinglulu	 * This function provides cortex_a55 specific
133*91f16700Schasinglulu	 * register information for crash reporting.
134*91f16700Schasinglulu	 * It needs to return with x6 pointing to
135*91f16700Schasinglulu	 * a list of register names in ascii and
136*91f16700Schasinglulu	 * x8 - x15 having values of registers to be
137*91f16700Schasinglulu	 * reported.
138*91f16700Schasinglulu	 * ---------------------------------------------
139*91f16700Schasinglulu	 */
140*91f16700Schasinglulu.section .rodata.cortex_a55_regs, "aS"
141*91f16700Schasinglulucortex_a55_regs:  /* The ascii list of register names to be reported */
142*91f16700Schasinglulu	.asciz	"cpuectlr_el1", ""
143*91f16700Schasinglulu
144*91f16700Schasinglulufunc cortex_a55_cpu_reg_dump
145*91f16700Schasinglulu	adr	x6, cortex_a55_regs
146*91f16700Schasinglulu	mrs	x8, CORTEX_A55_CPUECTLR_EL1
147*91f16700Schasinglulu	ret
148*91f16700Schasingluluendfunc cortex_a55_cpu_reg_dump
149*91f16700Schasinglulu
150*91f16700Schasingluludeclare_cpu_ops cortex_a55, CORTEX_A55_MIDR, \
151*91f16700Schasinglulu	cortex_a55_reset_func, \
152*91f16700Schasinglulu	cortex_a55_core_pwr_dwn
153