xref: /rk3399_ARM-atf/plat/nxp/common/aarch64/ls_helpers.S (revision 044ddf9ea3d4e313e2e923dab96745bb63050e90)
1*044ddf9eSPankaj Gupta/*
2*044ddf9eSPankaj Gupta * Copyright 2018-2021 NXP
3*044ddf9eSPankaj Gupta *
4*044ddf9eSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause
5*044ddf9eSPankaj Gupta *
6*044ddf9eSPankaj Gupta */
7*044ddf9eSPankaj Gupta
8*044ddf9eSPankaj Gupta#include <asm_macros.S>
9*044ddf9eSPankaj Gupta#include <drivers/console.h>
10*044ddf9eSPankaj Gupta#include <lib/cpus/aarch64/cortex_a72.h>
11*044ddf9eSPankaj Gupta
12*044ddf9eSPankaj Gupta#include <platform_def.h>
13*044ddf9eSPankaj Gupta
14*044ddf9eSPankaj Gupta
15*044ddf9eSPankaj Gupta	.globl	plat_crash_console_init
16*044ddf9eSPankaj Gupta	.globl	plat_crash_console_putc
17*044ddf9eSPankaj Gupta	.globl	plat_crash_console_flush
18*044ddf9eSPankaj Gupta	.globl  plat_core_pos
19*044ddf9eSPankaj Gupta	.globl  plat_my_core_pos
20*044ddf9eSPankaj Gupta	.globl  plat_core_mask
21*044ddf9eSPankaj Gupta	.globl  plat_my_core_mask
22*044ddf9eSPankaj Gupta	.globl  plat_core_pos_by_mpidr
23*044ddf9eSPankaj Gupta	.globl _disable_ldstr_pfetch_A53
24*044ddf9eSPankaj Gupta	.globl _disable_ldstr_pfetch_A72
25*044ddf9eSPankaj Gupta	.global	_set_smmu_pagesz_64
26*044ddf9eSPankaj Gupta
27*044ddf9eSPankaj Gupta	/* int plat_crash_console_init(void)
28*044ddf9eSPankaj Gupta	 * Function to initialize the crash console
29*044ddf9eSPankaj Gupta	 * without a C Runtime to print crash report.
30*044ddf9eSPankaj Gupta	 * Clobber list : x0 - x4
31*044ddf9eSPankaj Gupta	 */
32*044ddf9eSPankaj Gupta
33*044ddf9eSPankaj Gupta	/* int plat_crash_console_init(void)
34*044ddf9eSPankaj Gupta	 * Use normal console by default. Switch it to crash
35*044ddf9eSPankaj Gupta	 * mode so serial consoles become active again.
36*044ddf9eSPankaj Gupta	 * NOTE: This default implementation will only work for
37*044ddf9eSPankaj Gupta	 * crashes that occur after a normal console (marked
38*044ddf9eSPankaj Gupta	 * valid for the crash state) has been registered with
39*044ddf9eSPankaj Gupta	 * the console framework. To debug crashes that occur
40*044ddf9eSPankaj Gupta	 * earlier, the platform has to override these functions
41*044ddf9eSPankaj Gupta	 * with an implementation that initializes a console
42*044ddf9eSPankaj Gupta	 * driver with hardcoded parameters. See
43*044ddf9eSPankaj Gupta	 * docs/porting-guide.rst for more information.
44*044ddf9eSPankaj Gupta	 */
45*044ddf9eSPankaj Guptafunc plat_crash_console_init
46*044ddf9eSPankaj Gupta	mov	x3, x30
47*044ddf9eSPankaj Gupta	mov	x0, #CONSOLE_FLAG_CRASH
48*044ddf9eSPankaj Gupta	bl	console_switch_state
49*044ddf9eSPankaj Gupta	mov	x0, #1
50*044ddf9eSPankaj Gupta	ret	x3
51*044ddf9eSPankaj Guptaendfunc plat_crash_console_init
52*044ddf9eSPankaj Gupta
53*044ddf9eSPankaj Gupta	/* void plat_crash_console_putc(int character)
54*044ddf9eSPankaj Gupta	 * Output through the normal console by default.
55*044ddf9eSPankaj Gupta	 */
56*044ddf9eSPankaj Guptafunc plat_crash_console_putc
57*044ddf9eSPankaj Gupta	b	console_putc
58*044ddf9eSPankaj Guptaendfunc plat_crash_console_putc
59*044ddf9eSPankaj Gupta
60*044ddf9eSPankaj Gupta	/* void plat_crash_console_flush(void)
61*044ddf9eSPankaj Gupta	 * Flush normal console by default.
62*044ddf9eSPankaj Gupta	 */
63*044ddf9eSPankaj Guptafunc plat_crash_console_flush
64*044ddf9eSPankaj Gupta	b	console_flush
65*044ddf9eSPankaj Guptaendfunc plat_crash_console_flush
66*044ddf9eSPankaj Gupta
67*044ddf9eSPankaj Gupta/* This function implements a part of the critical interface between the psci
68*044ddf9eSPankaj Gupta * generic layer and the platform that allows the former to query the platform
69*044ddf9eSPankaj Gupta * to convert an MPIDR to a unique linear index. An error code (-1) is returned
70*044ddf9eSPankaj Gupta * in case the MPIDR is invalid.
71*044ddf9eSPankaj Gupta */
72*044ddf9eSPankaj Guptafunc plat_core_pos_by_mpidr
73*044ddf9eSPankaj Gupta
74*044ddf9eSPankaj Gupta	b	plat_core_pos
75*044ddf9eSPankaj Gupta
76*044ddf9eSPankaj Guptaendfunc plat_core_pos_by_mpidr
77*044ddf9eSPankaj Gupta
78*044ddf9eSPankaj Gupta#if (SYMMETRICAL_CLUSTERS)
79*044ddf9eSPankaj Gupta/* unsigned int plat_my_core_mask(void)
80*044ddf9eSPankaj Gupta *  generate a mask bit for this core
81*044ddf9eSPankaj Gupta */
82*044ddf9eSPankaj Guptafunc plat_my_core_mask
83*044ddf9eSPankaj Gupta	mrs	x0, MPIDR_EL1
84*044ddf9eSPankaj Gupta	b	plat_core_mask
85*044ddf9eSPankaj Guptaendfunc plat_my_core_mask
86*044ddf9eSPankaj Gupta
87*044ddf9eSPankaj Gupta/* unsigned int plat_core_mask(u_register_t mpidr)
88*044ddf9eSPankaj Gupta * generate a lsb-based mask bit for the core specified by mpidr in x0.
89*044ddf9eSPankaj Gupta *
90*044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core)
91*044ddf9eSPankaj Gupta * mask = (1 << SoC core)
92*044ddf9eSPankaj Gupta */
93*044ddf9eSPankaj Guptafunc plat_core_mask
94*044ddf9eSPankaj Gupta	mov	w1, wzr
95*044ddf9eSPankaj Gupta	mov	w2, wzr
96*044ddf9eSPankaj Gupta
97*044ddf9eSPankaj Gupta	/* extract cluster */
98*044ddf9eSPankaj Gupta	bfxil	w1, w0, #8, #8
99*044ddf9eSPankaj Gupta	/* extract cpu # */
100*044ddf9eSPankaj Gupta	bfxil	w2, w0, #0, #8
101*044ddf9eSPankaj Gupta
102*044ddf9eSPankaj Gupta	mov	w0, wzr
103*044ddf9eSPankaj Gupta
104*044ddf9eSPankaj Gupta	/* error checking */
105*044ddf9eSPankaj Gupta	cmp	w1, #NUMBER_OF_CLUSTERS
106*044ddf9eSPankaj Gupta	b.ge	1f
107*044ddf9eSPankaj Gupta	cmp	w2, #CORES_PER_CLUSTER
108*044ddf9eSPankaj Gupta	b.ge	1f
109*044ddf9eSPankaj Gupta
110*044ddf9eSPankaj Gupta	mov	w0, #CORES_PER_CLUSTER
111*044ddf9eSPankaj Gupta	mul	w1, w1, w0
112*044ddf9eSPankaj Gupta	add	w1, w1, w2
113*044ddf9eSPankaj Gupta	mov	w2, #0x1
114*044ddf9eSPankaj Gupta	lsl	w0, w2, w1
115*044ddf9eSPankaj Gupta1:
116*044ddf9eSPankaj Gupta	ret
117*044ddf9eSPankaj Guptaendfunc plat_core_mask
118*044ddf9eSPankaj Gupta
119*044ddf9eSPankaj Gupta/*
120*044ddf9eSPankaj Gupta * unsigned int plat_my_core_pos(void)
121*044ddf9eSPankaj Gupta *  generate a linear core number for this core
122*044ddf9eSPankaj Gupta */
123*044ddf9eSPankaj Guptafunc plat_my_core_pos
124*044ddf9eSPankaj Gupta	mrs	x0, MPIDR_EL1
125*044ddf9eSPankaj Gupta	b	plat_core_pos
126*044ddf9eSPankaj Guptaendfunc plat_my_core_pos
127*044ddf9eSPankaj Gupta
128*044ddf9eSPankaj Gupta/*
129*044ddf9eSPankaj Gupta * unsigned int plat_core_pos(u_register_t mpidr)
130*044ddf9eSPankaj Gupta * Generate a linear core number for the core specified by mpidr.
131*044ddf9eSPankaj Gupta *
132*044ddf9eSPankaj Gupta * SoC core = ((cluster * cpu_per_cluster) + core)
133*044ddf9eSPankaj Gupta * Returns -1 if mpidr invalid
134*044ddf9eSPankaj Gupta */
135*044ddf9eSPankaj Guptafunc plat_core_pos
136*044ddf9eSPankaj Gupta	mov	w1, wzr
137*044ddf9eSPankaj Gupta	mov	w2, wzr
138*044ddf9eSPankaj Gupta	bfxil	w1, w0, #8, #8	/* extract cluster */
139*044ddf9eSPankaj Gupta	bfxil	w2, w0, #0, #8	/* extract cpu #   */
140*044ddf9eSPankaj Gupta
141*044ddf9eSPankaj Gupta	mov	w0, #-1
142*044ddf9eSPankaj Gupta
143*044ddf9eSPankaj Gupta	/* error checking */
144*044ddf9eSPankaj Gupta	cmp	w1, #NUMBER_OF_CLUSTERS
145*044ddf9eSPankaj Gupta	b.ge	1f
146*044ddf9eSPankaj Gupta	cmp	w2, #CORES_PER_CLUSTER
147*044ddf9eSPankaj Gupta	b.ge	1f
148*044ddf9eSPankaj Gupta
149*044ddf9eSPankaj Gupta	mov	w0, #CORES_PER_CLUSTER
150*044ddf9eSPankaj Gupta	mul	w1, w1, w0
151*044ddf9eSPankaj Gupta	add	w0, w1, w2
152*044ddf9eSPankaj Gupta1:
153*044ddf9eSPankaj Gupta	ret
154*044ddf9eSPankaj Guptaendfunc plat_core_pos
155*044ddf9eSPankaj Gupta
156*044ddf9eSPankaj Gupta#endif
157*044ddf9eSPankaj Gupta
158*044ddf9eSPankaj Gupta/* this function disables the load-store prefetch of the calling core
159*044ddf9eSPankaj Gupta * Note: this function is for A72 cores ONLY
160*044ddf9eSPankaj Gupta * in:  none
161*044ddf9eSPankaj Gupta * out: none
162*044ddf9eSPankaj Gupta * uses x0
163*044ddf9eSPankaj Gupta */
164*044ddf9eSPankaj Guptafunc _disable_ldstr_pfetch_A72
165*044ddf9eSPankaj Gupta
166*044ddf9eSPankaj Gupta	mrs	x0, CORTEX_A72_CPUACTLR_EL1
167*044ddf9eSPankaj Gupta	tst	x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH
168*044ddf9eSPankaj Gupta	b.eq	1f
169*044ddf9eSPankaj Gupta	b	2f
170*044ddf9eSPankaj Gupta
171*044ddf9eSPankaj Gupta.align 6
172*044ddf9eSPankaj Gupta1:
173*044ddf9eSPankaj Gupta	dsb	sy
174*044ddf9eSPankaj Gupta	isb
175*044ddf9eSPankaj Gupta	orr	x0, x0, #CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH
176*044ddf9eSPankaj Gupta	msr	CORTEX_A72_CPUACTLR_EL1, x0
177*044ddf9eSPankaj Gupta	isb
178*044ddf9eSPankaj Gupta
179*044ddf9eSPankaj Gupta2:
180*044ddf9eSPankaj Gupta	ret
181*044ddf9eSPankaj Guptaendfunc _disable_ldstr_pfetch_A72
182*044ddf9eSPankaj Gupta
183*044ddf9eSPankaj Gupta/*
184*044ddf9eSPankaj Gupta * Function sets the SACR pagesize to 64k
185*044ddf9eSPankaj Gupta */
186*044ddf9eSPankaj Guptafunc _set_smmu_pagesz_64
187*044ddf9eSPankaj Gupta
188*044ddf9eSPankaj Gupta	ldr	x1, =NXP_SMMU_ADDR
189*044ddf9eSPankaj Gupta	ldr	w0, [x1, #0x10]
190*044ddf9eSPankaj Gupta	orr	w0, w0, #1 << 16	/* setting to 64K page */
191*044ddf9eSPankaj Gupta	str	w0, [x1, #0x10]
192*044ddf9eSPankaj Gupta
193*044ddf9eSPankaj Gupta	ret
194*044ddf9eSPankaj Guptaendfunc _set_smmu_pagesz_64
195