xref: /rk3399_ARM-atf/plat/nxp/common/aarch64/ls_helpers.S (revision b57d9d6f29d8dcb8d6b5792ea5a2ed313f2d4292)
1044ddf9eSPankaj Gupta/*
2044ddf9eSPankaj Gupta * Copyright 2018-2021 NXP
3044ddf9eSPankaj Gupta *
4044ddf9eSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause
5044ddf9eSPankaj Gupta *
6044ddf9eSPankaj Gupta */
7044ddf9eSPankaj Gupta
8044ddf9eSPankaj Gupta#include <asm_macros.S>
9*3ccc8ac3SJiafei Pan#include <cortex_a53.h>
10044ddf9eSPankaj Gupta#include <drivers/console.h>
11044ddf9eSPankaj Gupta#include <lib/cpus/aarch64/cortex_a72.h>
12044ddf9eSPankaj Gupta
13044ddf9eSPankaj Gupta#include <platform_def.h>
14044ddf9eSPankaj Gupta
15044ddf9eSPankaj Gupta
16044ddf9eSPankaj Gupta	.globl	plat_crash_console_init
17044ddf9eSPankaj Gupta	.globl	plat_crash_console_putc
18044ddf9eSPankaj Gupta	.globl	plat_crash_console_flush
19044ddf9eSPankaj Gupta	.globl  plat_core_pos
20044ddf9eSPankaj Gupta	.globl  plat_my_core_pos
21044ddf9eSPankaj Gupta	.globl  plat_core_mask
22044ddf9eSPankaj Gupta	.globl  plat_my_core_mask
23044ddf9eSPankaj Gupta	.globl  plat_core_pos_by_mpidr
24044ddf9eSPankaj Gupta	.globl _disable_ldstr_pfetch_A53
25044ddf9eSPankaj Gupta	.globl _disable_ldstr_pfetch_A72
26044ddf9eSPankaj Gupta	.global	_set_smmu_pagesz_64
27044ddf9eSPankaj Gupta
28044ddf9eSPankaj Gupta	/* int plat_crash_console_init(void)
29044ddf9eSPankaj Gupta	 * Function to initialize the crash console
30044ddf9eSPankaj Gupta	 * without a C Runtime to print crash report.
31044ddf9eSPankaj Gupta	 * Clobber list : x0 - x4
32044ddf9eSPankaj Gupta	 */
33044ddf9eSPankaj Gupta
34044ddf9eSPankaj Gupta	/* int plat_crash_console_init(void)
35044ddf9eSPankaj Gupta	 * Use normal console by default. Switch it to crash
36044ddf9eSPankaj Gupta	 * mode so serial consoles become active again.
37044ddf9eSPankaj Gupta	 * NOTE: This default implementation will only work for
38044ddf9eSPankaj Gupta	 * crashes that occur after a normal console (marked
39044ddf9eSPankaj Gupta	 * valid for the crash state) has been registered with
40044ddf9eSPankaj Gupta	 * the console framework. To debug crashes that occur
41044ddf9eSPankaj Gupta	 * earlier, the platform has to override these functions
42044ddf9eSPankaj Gupta	 * with an implementation that initializes a console
43044ddf9eSPankaj Gupta	 * driver with hardcoded parameters. See
44044ddf9eSPankaj Gupta	 * docs/porting-guide.rst for more information.
45044ddf9eSPankaj Gupta	 */
46044ddf9eSPankaj Guptafunc plat_crash_console_init
47044ddf9eSPankaj Gupta	mov	x3, x30
48044ddf9eSPankaj Gupta	mov	x0, #CONSOLE_FLAG_CRASH
49044ddf9eSPankaj Gupta	bl	console_switch_state
50044ddf9eSPankaj Gupta	mov	x0, #1
51044ddf9eSPankaj Gupta	ret	x3
52044ddf9eSPankaj Guptaendfunc plat_crash_console_init
53044ddf9eSPankaj Gupta
54044ddf9eSPankaj Gupta	/* void plat_crash_console_putc(int character)
55044ddf9eSPankaj Gupta	 * Output through the normal console by default.
56044ddf9eSPankaj Gupta	 */
57044ddf9eSPankaj Guptafunc plat_crash_console_putc
58044ddf9eSPankaj Gupta	b	console_putc
59044ddf9eSPankaj Guptaendfunc plat_crash_console_putc
60044ddf9eSPankaj Gupta
61044ddf9eSPankaj Gupta	/* void plat_crash_console_flush(void)
62044ddf9eSPankaj Gupta	 * Flush normal console by default.
63044ddf9eSPankaj Gupta	 */
64044ddf9eSPankaj Guptafunc plat_crash_console_flush
65044ddf9eSPankaj Gupta	b	console_flush
66044ddf9eSPankaj Guptaendfunc plat_crash_console_flush
67044ddf9eSPankaj Gupta
68044ddf9eSPankaj Gupta/* This function implements a part of the critical interface between the psci
69044ddf9eSPankaj Gupta * generic layer and the platform that allows the former to query the platform
70044ddf9eSPankaj Gupta * to convert an MPIDR to a unique linear index. An error code (-1) is returned
71044ddf9eSPankaj Gupta * in case the MPIDR is invalid.
72044ddf9eSPankaj Gupta */
73044ddf9eSPankaj Guptafunc plat_core_pos_by_mpidr
74044ddf9eSPankaj Gupta
75044ddf9eSPankaj Gupta	b	plat_core_pos
76044ddf9eSPankaj Gupta
77044ddf9eSPankaj Guptaendfunc plat_core_pos_by_mpidr
78044ddf9eSPankaj Gupta
79044ddf9eSPankaj Gupta#if (SYMMETRICAL_CLUSTERS)
80044ddf9eSPankaj Gupta/* unsigned int plat_my_core_mask(void)
81044ddf9eSPankaj Gupta *  generate a mask bit for this core
82044ddf9eSPankaj Gupta */
83044ddf9eSPankaj Guptafunc plat_my_core_mask
84044ddf9eSPankaj Gupta	mrs	x0, MPIDR_EL1
85044ddf9eSPankaj Gupta	b	plat_core_mask
86044ddf9eSPankaj Guptaendfunc plat_my_core_mask
87044ddf9eSPankaj Gupta
88044ddf9eSPankaj Gupta/* unsigned int plat_core_mask(u_register_t mpidr)
89044ddf9eSPankaj Gupta * generate a lsb-based mask bit for the core specified by mpidr in x0.
90044ddf9eSPankaj Gupta *
91044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core)
92044ddf9eSPankaj Gupta * mask = (1 << SoC core)
93044ddf9eSPankaj Gupta */
94044ddf9eSPankaj Guptafunc plat_core_mask
95044ddf9eSPankaj Gupta	mov	w1, wzr
96044ddf9eSPankaj Gupta	mov	w2, wzr
97044ddf9eSPankaj Gupta
98044ddf9eSPankaj Gupta	/* extract cluster */
99044ddf9eSPankaj Gupta	bfxil	w1, w0, #8, #8
100044ddf9eSPankaj Gupta	/* extract cpu # */
101044ddf9eSPankaj Gupta	bfxil	w2, w0, #0, #8
102044ddf9eSPankaj Gupta
103044ddf9eSPankaj Gupta	mov	w0, wzr
104044ddf9eSPankaj Gupta
105044ddf9eSPankaj Gupta	/* error checking */
106044ddf9eSPankaj Gupta	cmp	w1, #NUMBER_OF_CLUSTERS
107044ddf9eSPankaj Gupta	b.ge	1f
108044ddf9eSPankaj Gupta	cmp	w2, #CORES_PER_CLUSTER
109044ddf9eSPankaj Gupta	b.ge	1f
110044ddf9eSPankaj Gupta
111044ddf9eSPankaj Gupta	mov	w0, #CORES_PER_CLUSTER
112044ddf9eSPankaj Gupta	mul	w1, w1, w0
113044ddf9eSPankaj Gupta	add	w1, w1, w2
114044ddf9eSPankaj Gupta	mov	w2, #0x1
115044ddf9eSPankaj Gupta	lsl	w0, w2, w1
116044ddf9eSPankaj Gupta1:
117044ddf9eSPankaj Gupta	ret
118044ddf9eSPankaj Guptaendfunc plat_core_mask
119044ddf9eSPankaj Gupta
120044ddf9eSPankaj Gupta/*
121044ddf9eSPankaj Gupta * unsigned int plat_my_core_pos(void)
122044ddf9eSPankaj Gupta *  generate a linear core number for this core
123044ddf9eSPankaj Gupta */
124044ddf9eSPankaj Guptafunc plat_my_core_pos
125044ddf9eSPankaj Gupta	mrs	x0, MPIDR_EL1
126044ddf9eSPankaj Gupta	b	plat_core_pos
127044ddf9eSPankaj Guptaendfunc plat_my_core_pos
128044ddf9eSPankaj Gupta
129044ddf9eSPankaj Gupta/*
130044ddf9eSPankaj Gupta * unsigned int plat_core_pos(u_register_t mpidr)
131044ddf9eSPankaj Gupta * Generate a linear core number for the core specified by mpidr.
132044ddf9eSPankaj Gupta *
133044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core)
134044ddf9eSPankaj Gupta * Returns -1 if mpidr invalid
135044ddf9eSPankaj Gupta */
136044ddf9eSPankaj Guptafunc plat_core_pos
137044ddf9eSPankaj Gupta	mov	w1, wzr
138044ddf9eSPankaj Gupta	mov	w2, wzr
139044ddf9eSPankaj Gupta	bfxil	w1, w0, #8, #8	/* extract cluster */
140044ddf9eSPankaj Gupta	bfxil	w2, w0, #0, #8	/* extract cpu #   */
141044ddf9eSPankaj Gupta
142044ddf9eSPankaj Gupta	mov	w0, #-1
143044ddf9eSPankaj Gupta
144044ddf9eSPankaj Gupta	/* error checking */
145044ddf9eSPankaj Gupta	cmp	w1, #NUMBER_OF_CLUSTERS
146044ddf9eSPankaj Gupta	b.ge	1f
147044ddf9eSPankaj Gupta	cmp	w2, #CORES_PER_CLUSTER
148044ddf9eSPankaj Gupta	b.ge	1f
149044ddf9eSPankaj Gupta
150044ddf9eSPankaj Gupta	mov	w0, #CORES_PER_CLUSTER
151044ddf9eSPankaj Gupta	mul	w1, w1, w0
152044ddf9eSPankaj Gupta	add	w0, w1, w2
153044ddf9eSPankaj Gupta1:
154044ddf9eSPankaj Gupta	ret
155044ddf9eSPankaj Guptaendfunc plat_core_pos
156044ddf9eSPankaj Gupta
157044ddf9eSPankaj Gupta#endif
158044ddf9eSPankaj Gupta
159044ddf9eSPankaj Gupta/* this function disables the load-store prefetch of the calling core
160*3ccc8ac3SJiafei Pan * Note: this function is for A53 cores ONLY
161*3ccc8ac3SJiafei Pan * in:  none
162*3ccc8ac3SJiafei Pan * out: none
163*3ccc8ac3SJiafei Pan * uses x0
164*3ccc8ac3SJiafei Pan */
165*3ccc8ac3SJiafei Panfunc _disable_ldstr_pfetch_A53
166*3ccc8ac3SJiafei Pan	mrs	x0, CORTEX_A53_CPUACTLR_EL1
167*3ccc8ac3SJiafei Pan	tst	x0, #CORTEX_A53_CPUACTLR_EL1_L1PCTL
168*3ccc8ac3SJiafei Pan	b.ne	1f
169*3ccc8ac3SJiafei Pan	b	2f
170*3ccc8ac3SJiafei Pan
171*3ccc8ac3SJiafei Pan.align 6
172*3ccc8ac3SJiafei Pan1:
173*3ccc8ac3SJiafei Pan	dsb	sy
174*3ccc8ac3SJiafei Pan	isb
175*3ccc8ac3SJiafei Pan	bic	x0, x0, #CORTEX_A53_CPUACTLR_EL1_L1PCTL
176*3ccc8ac3SJiafei Pan	msr	CORTEX_A53_CPUACTLR_EL1, x0
177*3ccc8ac3SJiafei Pan	isb
178*3ccc8ac3SJiafei Pan
179*3ccc8ac3SJiafei Pan2:
180*3ccc8ac3SJiafei Pan	ret
181*3ccc8ac3SJiafei Panendfunc _disable_ldstr_pfetch_A53
182*3ccc8ac3SJiafei Pan
183*3ccc8ac3SJiafei Pan
184*3ccc8ac3SJiafei Pan/* this function disables the load-store prefetch of the calling core
185044ddf9eSPankaj Gupta * Note: this function is for A72 cores ONLY
186044ddf9eSPankaj Gupta * in:  none
187044ddf9eSPankaj Gupta * out: none
188044ddf9eSPankaj Gupta * uses x0
189044ddf9eSPankaj Gupta */
190044ddf9eSPankaj Guptafunc _disable_ldstr_pfetch_A72
191044ddf9eSPankaj Gupta
192044ddf9eSPankaj Gupta	mrs	x0, CORTEX_A72_CPUACTLR_EL1
193044ddf9eSPankaj Gupta	tst	x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH
194044ddf9eSPankaj Gupta	b.eq	1f
195044ddf9eSPankaj Gupta	b	2f
196044ddf9eSPankaj Gupta
197044ddf9eSPankaj Gupta.align 6
198044ddf9eSPankaj Gupta1:
199044ddf9eSPankaj Gupta	dsb	sy
200044ddf9eSPankaj Gupta	isb
201044ddf9eSPankaj Gupta	orr	x0, x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH
202044ddf9eSPankaj Gupta	msr	CORTEX_A72_CPUACTLR_EL1, x0
203044ddf9eSPankaj Gupta	isb
204044ddf9eSPankaj Gupta
205044ddf9eSPankaj Gupta2:
206044ddf9eSPankaj Gupta	ret
207044ddf9eSPankaj Guptaendfunc _disable_ldstr_pfetch_A72
208044ddf9eSPankaj Gupta
209044ddf9eSPankaj Gupta/*
210044ddf9eSPankaj Gupta * Function sets the SACR pagesize to 64k
211044ddf9eSPankaj Gupta */
212044ddf9eSPankaj Guptafunc _set_smmu_pagesz_64
213044ddf9eSPankaj Gupta
214044ddf9eSPankaj Gupta	ldr	x1, =NXP_SMMU_ADDR
215044ddf9eSPankaj Gupta	ldr	w0, [x1, #0x10]
216044ddf9eSPankaj Gupta	orr	w0, w0, #1 << 16	/* setting to 64K page */
217044ddf9eSPankaj Gupta	str	w0, [x1, #0x10]
218044ddf9eSPankaj Gupta
219044ddf9eSPankaj Gupta	ret
220044ddf9eSPankaj Guptaendfunc _set_smmu_pagesz_64
221