xref: /rk3399_ARM-atf/plat/brcm/board/stingray/aarch64/plat_helpers.S (revision 717448d622b13233e15aa43767fc8aa2f007486c)
1*717448d6SSheetal Tigadoli/*
2*717448d6SSheetal Tigadoli * Copyright (c) 2015-2020, Broadcom
3*717448d6SSheetal Tigadoli *
4*717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause
5*717448d6SSheetal Tigadoli */
6*717448d6SSheetal Tigadoli
7*717448d6SSheetal Tigadoli#include <arch.h>
8*717448d6SSheetal Tigadoli#include <asm_macros.S>
9*717448d6SSheetal Tigadoli#include <assert_macros.S>
10*717448d6SSheetal Tigadoli#include <cpu_macros.S>
11*717448d6SSheetal Tigadoli#include <cortex_a72.h>
12*717448d6SSheetal Tigadoli#include <drivers/ti/uart/uart_16550.h>
13*717448d6SSheetal Tigadoli
14*717448d6SSheetal Tigadoli#include <platform_def.h>
15*717448d6SSheetal Tigadoli
16*717448d6SSheetal Tigadoli	.globl	plat_reset_handler
17*717448d6SSheetal Tigadoli	.globl	platform_get_entrypoint
18*717448d6SSheetal Tigadoli	.globl	plat_secondary_cold_boot_setup
19*717448d6SSheetal Tigadoli	.globl	platform_mem_init
20*717448d6SSheetal Tigadoli	.globl	platform_check_mpidr
21*717448d6SSheetal Tigadoli	.globl	plat_crash_console_init
22*717448d6SSheetal Tigadoli	.globl	plat_crash_console_putc
23*717448d6SSheetal Tigadoli	.globl	plat_crash_console_flush
24*717448d6SSheetal Tigadoli	.globl	plat_disable_acp
25*717448d6SSheetal Tigadoli	.globl	plat_is_my_cpu_primary
26*717448d6SSheetal Tigadoli	.globl	plat_my_core_pos
27*717448d6SSheetal Tigadoli	.globl	platform_is_primary_cpu
28*717448d6SSheetal Tigadoli	.globl	plat_brcm_calc_core_pos
29*717448d6SSheetal Tigadoli	.globl	plat_get_my_entrypoint
30*717448d6SSheetal Tigadoli
31*717448d6SSheetal Tigadoli
32*717448d6SSheetal Tigadoli	/* ------------------------------------------------------------
33*717448d6SSheetal Tigadoli	 * void plat_l2_init(void);
34*717448d6SSheetal Tigadoli	 *
35*717448d6SSheetal Tigadoli	 * BL1 and BL2 run with one core, one cluster
36*717448d6SSheetal Tigadoli	 * This is safe to disable cluster coherency
37*717448d6SSheetal Tigadoli	 * to make use of the data cache MMU WB attribute
38*717448d6SSheetal Tigadoli	 * for the SRAM.
39*717448d6SSheetal Tigadoli	 *
40*717448d6SSheetal Tigadoli	 * Set L2 Auxiliary Control Register
41*717448d6SSheetal Tigadoli	 * --------------------------------------------------------------------
42*717448d6SSheetal Tigadoli	 */
43*717448d6SSheetal Tigadolifunc plat_l2_init
44*717448d6SSheetal Tigadoli	mrs x0, CORTEX_A72_L2ACTLR_EL1
45*717448d6SSheetal Tigadoli#if (IMAGE_BL1 || IMAGE_BL2) || defined(USE_SINGLE_CLUSTER)
46*717448d6SSheetal Tigadoli	orr x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI
47*717448d6SSheetal Tigadoli#else
48*717448d6SSheetal Tigadoli	bic x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI
49*717448d6SSheetal Tigadoli#endif
50*717448d6SSheetal Tigadoli	msr CORTEX_A72_L2ACTLR_EL1, x0
51*717448d6SSheetal Tigadoli
52*717448d6SSheetal Tigadoli	/* Set L2 Control Register */
53*717448d6SSheetal Tigadoli	mrs x0, CORTEX_A72_L2CTLR_EL1
54*717448d6SSheetal Tigadoli	mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_MASK << \
55*717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
56*717448d6SSheetal Tigadoli			(CORTEX_A72_L2_TAG_RAM_LATENCY_MASK << \
57*717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT) | \
58*717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \
59*717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT))
60*717448d6SSheetal Tigadoli	bic x0, x0, x1
61*717448d6SSheetal Tigadoli	mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << \
62*717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
63*717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \
64*717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT))
65*717448d6SSheetal Tigadoli	orr x0, x0, x1
66*717448d6SSheetal Tigadoli	msr CORTEX_A72_L2CTLR_EL1, x0
67*717448d6SSheetal Tigadoli
68*717448d6SSheetal Tigadoli	isb
69*717448d6SSheetal Tigadoli	ret
70*717448d6SSheetal Tigadoliendfunc plat_l2_init
71*717448d6SSheetal Tigadoli
72*717448d6SSheetal Tigadoli	/* --------------------------------------------------------------------
73*717448d6SSheetal Tigadoli	 * void plat_reset_handler(void);
74*717448d6SSheetal Tigadoli	 *
75*717448d6SSheetal Tigadoli	 * Before adding code in this function, refer to the guidelines in
76*717448d6SSheetal Tigadoli	 * docs/firmware-design.md.
77*717448d6SSheetal Tigadoli	 *
78*717448d6SSheetal Tigadoli	 * --------------------------------------------------------------------
79*717448d6SSheetal Tigadoli	 */
80*717448d6SSheetal Tigadolifunc plat_reset_handler
81*717448d6SSheetal Tigadoli	mov	x9, x30
82*717448d6SSheetal Tigadoli	bl	plat_l2_init
83*717448d6SSheetal Tigadoli	mov	x30, x9
84*717448d6SSheetal Tigadoli	ret
85*717448d6SSheetal Tigadoliendfunc plat_reset_handler
86*717448d6SSheetal Tigadoli
87*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
88*717448d6SSheetal Tigadoli	 * void platform_get_entrypoint (unsigned int mpid);
89*717448d6SSheetal Tigadoli	 *
90*717448d6SSheetal Tigadoli	 * Main job of this routine is to distinguish between
91*717448d6SSheetal Tigadoli	 * a cold and warm boot.
92*717448d6SSheetal Tigadoli	 * On a cold boot the secondaries first wait for the
93*717448d6SSheetal Tigadoli	 * platform to be initialized after which they are
94*717448d6SSheetal Tigadoli	 * hotplugged in. The primary proceeds to perform the
95*717448d6SSheetal Tigadoli	 * platform initialization.
96*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
97*717448d6SSheetal Tigadoli	 */
98*717448d6SSheetal Tigadolifunc platform_get_entrypoint
99*717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
100*717448d6SSheetal Tigadoli	mov x0, #0
101*717448d6SSheetal Tigadoli	ret
102*717448d6SSheetal Tigadoliendfunc platform_get_entrypoint
103*717448d6SSheetal Tigadoli
104*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
105*717448d6SSheetal Tigadoli	 * void plat_secondary_cold_boot_setup (void);
106*717448d6SSheetal Tigadoli	 *
107*717448d6SSheetal Tigadoli	 * This function performs any platform specific actions
108*717448d6SSheetal Tigadoli	 * needed for a secondary cpu after a cold reset e.g
109*717448d6SSheetal Tigadoli	 * mark the cpu's presence, mechanism to place it in a
110*717448d6SSheetal Tigadoli	 * holding pen etc.
111*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
112*717448d6SSheetal Tigadoli	 */
113*717448d6SSheetal Tigadolifunc plat_secondary_cold_boot_setup
114*717448d6SSheetal Tigadoli	bl	plat_my_core_pos
115*717448d6SSheetal Tigadoli	mov_imm	x1, SECONDARY_CPU_SPIN_BASE_ADDR
116*717448d6SSheetal Tigadoli	add	x0, x1, x0, LSL #3
117*717448d6SSheetal Tigadoli	mov	x1, #0
118*717448d6SSheetal Tigadoli	str	x1, [x0]
119*717448d6SSheetal Tigadoli
120*717448d6SSheetal Tigadoli	/* Wait until the entrypoint gets populated */
121*717448d6SSheetal Tigadolipoll_mailbox:
122*717448d6SSheetal Tigadoli	ldr	x1, [x0]
123*717448d6SSheetal Tigadoli	cbz	x1, 1f
124*717448d6SSheetal Tigadoli	br	x1
125*717448d6SSheetal Tigadoli1:
126*717448d6SSheetal Tigadoli	wfe
127*717448d6SSheetal Tigadoli	b	poll_mailbox
128*717448d6SSheetal Tigadoliendfunc plat_secondary_cold_boot_setup
129*717448d6SSheetal Tigadoli
130*717448d6SSheetal Tigadoli
131*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
132*717448d6SSheetal Tigadoli	 * void platform_mem_init(void);
133*717448d6SSheetal Tigadoli	 *
134*717448d6SSheetal Tigadoli	 * We don't need to carry out any memory initialization
135*717448d6SSheetal Tigadoli	 * on CSS platforms. The Secure RAM is accessible straight away.
136*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
137*717448d6SSheetal Tigadoli	 */
138*717448d6SSheetal Tigadolifunc platform_mem_init
139*717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
140*717448d6SSheetal Tigadoli	ret
141*717448d6SSheetal Tigadoliendfunc platform_mem_init
142*717448d6SSheetal Tigadoli
143*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
144*717448d6SSheetal Tigadoli	 * Placeholder function which should be redefined by
145*717448d6SSheetal Tigadoli	 * each platform.
146*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
147*717448d6SSheetal Tigadoli	 */
148*717448d6SSheetal Tigadolifunc platform_check_mpidr
149*717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
150*717448d6SSheetal Tigadoli	mov	x0, xzr
151*717448d6SSheetal Tigadoli	ret
152*717448d6SSheetal Tigadoliendfunc platform_check_mpidr
153*717448d6SSheetal Tigadoli
154*717448d6SSheetal Tigadoli	/* ---------------------------------------------
155*717448d6SSheetal Tigadoli	 * int plat_crash_console_init(void)
156*717448d6SSheetal Tigadoli	 * Function to initialize the crash console
157*717448d6SSheetal Tigadoli	 * without a C Runtime to print crash report.
158*717448d6SSheetal Tigadoli	 * Clobber list : x0, x1, x2
159*717448d6SSheetal Tigadoli	 * ---------------------------------------------
160*717448d6SSheetal Tigadoli	 */
161*717448d6SSheetal Tigadoli
162*717448d6SSheetal Tigadolifunc plat_crash_console_init
163*717448d6SSheetal Tigadoli	mov_imm	x0, BRCM_CRASH_CONSOLE_BASE
164*717448d6SSheetal Tigadoli	mov_imm	x1, BRCM_CRASH_CONSOLE_REFCLK
165*717448d6SSheetal Tigadoli	mov_imm	x2, BRCM_CRASH_CONSOLE_BAUDRATE
166*717448d6SSheetal Tigadoli	b	console_16550_core_init
167*717448d6SSheetal Tigadoli	ret
168*717448d6SSheetal Tigadoliendfunc plat_crash_console_init
169*717448d6SSheetal Tigadoli
170*717448d6SSheetal Tigadoli	/* ---------------------------------------------
171*717448d6SSheetal Tigadoli	 * int plat_crash_console_putc(void)
172*717448d6SSheetal Tigadoli	 * Function to print a character on the crash
173*717448d6SSheetal Tigadoli	 * console without a C Runtime.
174*717448d6SSheetal Tigadoli	 * Clobber list : x1, x2, x3
175*717448d6SSheetal Tigadoli	 * ---------------------------------------------
176*717448d6SSheetal Tigadoli	 */
177*717448d6SSheetal Tigadoli
178*717448d6SSheetal Tigadolifunc plat_crash_console_putc
179*717448d6SSheetal Tigadoli	mov_imm x1, BRCM_CRASH_CONSOLE_BASE
180*717448d6SSheetal Tigadoli	b	console_16550_core_putc
181*717448d6SSheetal Tigadoli	ret
182*717448d6SSheetal Tigadoliendfunc plat_crash_console_putc
183*717448d6SSheetal Tigadoli
184*717448d6SSheetal Tigadoli	/* ---------------------------------------------
185*717448d6SSheetal Tigadoli	 * int plat_crash_console_flush(void)
186*717448d6SSheetal Tigadoli	 * Function to flush crash console
187*717448d6SSheetal Tigadoli	 * Clobber list : x0, x1
188*717448d6SSheetal Tigadoli	 * ---------------------------------------------
189*717448d6SSheetal Tigadoli	 */
190*717448d6SSheetal Tigadolifunc plat_crash_console_flush
191*717448d6SSheetal Tigadoli	mov_imm x0, BRCM_CRASH_CONSOLE_BASE
192*717448d6SSheetal Tigadoli	b	console_16550_core_flush
193*717448d6SSheetal Tigadoli	ret
194*717448d6SSheetal Tigadoliendfunc plat_crash_console_flush
195*717448d6SSheetal Tigadoli
196*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
197*717448d6SSheetal Tigadoli	 * Placeholder function which should be redefined by
198*717448d6SSheetal Tigadoli	 * each platform. This function is allowed to use
199*717448d6SSheetal Tigadoli	 * registers x0 - x17.
200*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
201*717448d6SSheetal Tigadoli	 */
202*717448d6SSheetal Tigadoli
203*717448d6SSheetal Tigadolifunc plat_disable_acp
204*717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
205*717448d6SSheetal Tigadoli	ret
206*717448d6SSheetal Tigadoliendfunc plat_disable_acp
207*717448d6SSheetal Tigadoli
208*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
209*717448d6SSheetal Tigadoli	 * unsigned int plat_is_my_cpu_primary (void);
210*717448d6SSheetal Tigadoli	 *
211*717448d6SSheetal Tigadoli	 * Find out whether the current cpu is the primary
212*717448d6SSheetal Tigadoli	 * cpu (applicable only after a cold boot)
213*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
214*717448d6SSheetal Tigadoli	 */
215*717448d6SSheetal Tigadolifunc plat_is_my_cpu_primary
216*717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
217*717448d6SSheetal Tigadoli	b	platform_is_primary_cpu
218*717448d6SSheetal Tigadoliendfunc plat_is_my_cpu_primary
219*717448d6SSheetal Tigadoli
220*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
221*717448d6SSheetal Tigadoli	 *  unsigned int plat_my_core_pos(void)
222*717448d6SSheetal Tigadoli	 *  This function uses the plat_brcm_calc_core_pos()
223*717448d6SSheetal Tigadoli	 *  definition to get the index of the calling CPU.
224*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
225*717448d6SSheetal Tigadoli	 */
226*717448d6SSheetal Tigadolifunc plat_my_core_pos
227*717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
228*717448d6SSheetal Tigadoli	b	plat_brcm_calc_core_pos
229*717448d6SSheetal Tigadoliendfunc plat_my_core_pos
230*717448d6SSheetal Tigadoli
231*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
232*717448d6SSheetal Tigadoli	 * unsigned int platform_is_primary_cpu (void);
233*717448d6SSheetal Tigadoli	 *
234*717448d6SSheetal Tigadoli	 * Find out whether the current cpu is the primary
235*717448d6SSheetal Tigadoli	 * cpu (applicable only after a cold boot)
236*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
237*717448d6SSheetal Tigadoli	 */
238*717448d6SSheetal Tigadolifunc platform_is_primary_cpu
239*717448d6SSheetal Tigadoli	mov	x9, x30
240*717448d6SSheetal Tigadoli	bl	plat_my_core_pos
241*717448d6SSheetal Tigadoli	cmp	x0, #PRIMARY_CPU
242*717448d6SSheetal Tigadoli	cset	x0, eq
243*717448d6SSheetal Tigadoli	ret	x9
244*717448d6SSheetal Tigadoliendfunc platform_is_primary_cpu
245*717448d6SSheetal Tigadoli
246*717448d6SSheetal Tigadoli	/* -----------------------------------------------------
247*717448d6SSheetal Tigadoli	 *  unsigned int plat_brcm_calc_core_pos(uint64_t mpidr)
248*717448d6SSheetal Tigadoli	 *  Helper function to calculate the core position.
249*717448d6SSheetal Tigadoli	 *  With this function: CorePos = (ClusterId * 4) +
250*717448d6SSheetal Tigadoli	 *  				  CoreId
251*717448d6SSheetal Tigadoli	 * -----------------------------------------------------
252*717448d6SSheetal Tigadoli	 */
253*717448d6SSheetal Tigadolifunc plat_brcm_calc_core_pos
254*717448d6SSheetal Tigadoli	and	x1, x0, #MPIDR_CPU_MASK
255*717448d6SSheetal Tigadoli	and	x0, x0, #MPIDR_CLUSTER_MASK
256*717448d6SSheetal Tigadoli	add	x0, x1, x0, LSR #7
257*717448d6SSheetal Tigadoli	ret
258*717448d6SSheetal Tigadoliendfunc plat_brcm_calc_core_pos
259*717448d6SSheetal Tigadoli
260*717448d6SSheetal Tigadolifunc plat_get_my_entrypoint
261*717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
262*717448d6SSheetal Tigadoli	b	platform_get_entrypoint
263*717448d6SSheetal Tigadoliendfunc plat_get_my_entrypoint
264