xref: /rk3399_ARM-atf/plat/brcm/board/stingray/aarch64/plat_helpers.S (revision dfe577a817d8384c313f0a184be75efeb3cd8445)
1717448d6SSheetal Tigadoli/*
2717448d6SSheetal Tigadoli * Copyright (c) 2015-2020, Broadcom
3717448d6SSheetal Tigadoli *
4717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause
5717448d6SSheetal Tigadoli */
6717448d6SSheetal Tigadoli
7717448d6SSheetal Tigadoli#include <arch.h>
8717448d6SSheetal Tigadoli#include <asm_macros.S>
9717448d6SSheetal Tigadoli#include <assert_macros.S>
10717448d6SSheetal Tigadoli#include <cpu_macros.S>
11717448d6SSheetal Tigadoli#include <cortex_a72.h>
12717448d6SSheetal Tigadoli#include <drivers/ti/uart/uart_16550.h>
13717448d6SSheetal Tigadoli
14717448d6SSheetal Tigadoli#include <platform_def.h>
15717448d6SSheetal Tigadoli
16717448d6SSheetal Tigadoli	.globl	plat_reset_handler
17717448d6SSheetal Tigadoli	.globl	platform_get_entrypoint
18717448d6SSheetal Tigadoli	.globl	plat_secondary_cold_boot_setup
19717448d6SSheetal Tigadoli	.globl	platform_mem_init
20717448d6SSheetal Tigadoli	.globl	platform_check_mpidr
21717448d6SSheetal Tigadoli	.globl	plat_crash_console_init
22717448d6SSheetal Tigadoli	.globl	plat_crash_console_putc
23717448d6SSheetal Tigadoli	.globl	plat_crash_console_flush
24717448d6SSheetal Tigadoli	.globl	plat_disable_acp
25717448d6SSheetal Tigadoli	.globl	plat_is_my_cpu_primary
26717448d6SSheetal Tigadoli	.globl	plat_my_core_pos
27717448d6SSheetal Tigadoli	.globl	platform_is_primary_cpu
28717448d6SSheetal Tigadoli	.globl	plat_brcm_calc_core_pos
29717448d6SSheetal Tigadoli	.globl	plat_get_my_entrypoint
30717448d6SSheetal Tigadoli
31717448d6SSheetal Tigadoli
32717448d6SSheetal Tigadoli	/* ------------------------------------------------------------
33717448d6SSheetal Tigadoli	 * void plat_l2_init(void);
34717448d6SSheetal Tigadoli	 *
35717448d6SSheetal Tigadoli	 * BL1 and BL2 run with one core, one cluster
36717448d6SSheetal Tigadoli	 * This is safe to disable cluster coherency
37717448d6SSheetal Tigadoli	 * to make use of the data cache MMU WB attribute
38717448d6SSheetal Tigadoli	 * for the SRAM.
39717448d6SSheetal Tigadoli	 *
40717448d6SSheetal Tigadoli	 * Set L2 Auxiliary Control Register
41717448d6SSheetal Tigadoli	 * --------------------------------------------------------------------
42717448d6SSheetal Tigadoli	 */
43717448d6SSheetal Tigadolifunc plat_l2_init
44717448d6SSheetal Tigadoli	mrs x0, CORTEX_A72_L2ACTLR_EL1
45717448d6SSheetal Tigadoli#if (IMAGE_BL1 || IMAGE_BL2) || defined(USE_SINGLE_CLUSTER)
46717448d6SSheetal Tigadoli	orr x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI
47717448d6SSheetal Tigadoli#else
48717448d6SSheetal Tigadoli	bic x0, x0, #CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI
49717448d6SSheetal Tigadoli#endif
50717448d6SSheetal Tigadoli	msr CORTEX_A72_L2ACTLR_EL1, x0
51717448d6SSheetal Tigadoli
52717448d6SSheetal Tigadoli	/* Set L2 Control Register */
53717448d6SSheetal Tigadoli	mrs x0, CORTEX_A72_L2CTLR_EL1
54717448d6SSheetal Tigadoli	mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_MASK << \
55717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
56717448d6SSheetal Tigadoli			(CORTEX_A72_L2_TAG_RAM_LATENCY_MASK << \
57717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT) | \
58717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \
59717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT))
60717448d6SSheetal Tigadoli	bic x0, x0, x1
61717448d6SSheetal Tigadoli	mov x1, #((CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES << \
62717448d6SSheetal Tigadoli			CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
63717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT) | \
64717448d6SSheetal Tigadoli			(U(0x1) << CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT))
65717448d6SSheetal Tigadoli	orr x0, x0, x1
66717448d6SSheetal Tigadoli	msr CORTEX_A72_L2CTLR_EL1, x0
67717448d6SSheetal Tigadoli
68717448d6SSheetal Tigadoli	isb
69717448d6SSheetal Tigadoli	ret
70717448d6SSheetal Tigadoliendfunc plat_l2_init
71717448d6SSheetal Tigadoli
72717448d6SSheetal Tigadoli	/* --------------------------------------------------------------------
73717448d6SSheetal Tigadoli	 * void plat_reset_handler(void);
74717448d6SSheetal Tigadoli	 *
75717448d6SSheetal Tigadoli	 * Before adding code in this function, refer to the guidelines in
76717448d6SSheetal Tigadoli	 * docs/firmware-design.md.
77717448d6SSheetal Tigadoli	 *
78717448d6SSheetal Tigadoli	 * --------------------------------------------------------------------
79717448d6SSheetal Tigadoli	 */
80717448d6SSheetal Tigadolifunc plat_reset_handler
81717448d6SSheetal Tigadoli	mov	x9, x30
82717448d6SSheetal Tigadoli	bl	plat_l2_init
83717448d6SSheetal Tigadoli	mov	x30, x9
84717448d6SSheetal Tigadoli	ret
85717448d6SSheetal Tigadoliendfunc plat_reset_handler
86717448d6SSheetal Tigadoli
87717448d6SSheetal Tigadoli	/* -----------------------------------------------------
88717448d6SSheetal Tigadoli	 * void platform_get_entrypoint (unsigned int mpid);
89717448d6SSheetal Tigadoli	 *
90717448d6SSheetal Tigadoli	 * Main job of this routine is to distinguish between
91717448d6SSheetal Tigadoli	 * a cold and warm boot.
92717448d6SSheetal Tigadoli	 * On a cold boot the secondaries first wait for the
93717448d6SSheetal Tigadoli	 * platform to be initialized after which they are
94717448d6SSheetal Tigadoli	 * hotplugged in. The primary proceeds to perform the
95717448d6SSheetal Tigadoli	 * platform initialization.
96717448d6SSheetal Tigadoli	 * -----------------------------------------------------
97717448d6SSheetal Tigadoli	 */
98717448d6SSheetal Tigadolifunc platform_get_entrypoint
99717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
100717448d6SSheetal Tigadoli	mov x0, #0
101717448d6SSheetal Tigadoli	ret
102717448d6SSheetal Tigadoliendfunc platform_get_entrypoint
103717448d6SSheetal Tigadoli
104717448d6SSheetal Tigadoli	/* -----------------------------------------------------
105717448d6SSheetal Tigadoli	 * void plat_secondary_cold_boot_setup (void);
106717448d6SSheetal Tigadoli	 *
107717448d6SSheetal Tigadoli	 * This function performs any platform specific actions
108717448d6SSheetal Tigadoli	 * needed for a secondary cpu after a cold reset e.g
109717448d6SSheetal Tigadoli	 * mark the cpu's presence, mechanism to place it in a
110717448d6SSheetal Tigadoli	 * holding pen etc.
111717448d6SSheetal Tigadoli	 * -----------------------------------------------------
112717448d6SSheetal Tigadoli	 */
113717448d6SSheetal Tigadolifunc plat_secondary_cold_boot_setup
114717448d6SSheetal Tigadoli	bl	plat_my_core_pos
115717448d6SSheetal Tigadoli	mov_imm	x1, SECONDARY_CPU_SPIN_BASE_ADDR
116717448d6SSheetal Tigadoli	add	x0, x1, x0, LSL #3
117717448d6SSheetal Tigadoli	mov	x1, #0
118717448d6SSheetal Tigadoli	str	x1, [x0]
119717448d6SSheetal Tigadoli
120717448d6SSheetal Tigadoli	/* Wait until the entrypoint gets populated */
121717448d6SSheetal Tigadolipoll_mailbox:
122717448d6SSheetal Tigadoli	ldr	x1, [x0]
123717448d6SSheetal Tigadoli	cbz	x1, 1f
124717448d6SSheetal Tigadoli	br	x1
125717448d6SSheetal Tigadoli1:
126717448d6SSheetal Tigadoli	wfe
127717448d6SSheetal Tigadoli	b	poll_mailbox
128717448d6SSheetal Tigadoliendfunc plat_secondary_cold_boot_setup
129717448d6SSheetal Tigadoli
130717448d6SSheetal Tigadoli
131717448d6SSheetal Tigadoli	/* -----------------------------------------------------
132717448d6SSheetal Tigadoli	 * void platform_mem_init(void);
133717448d6SSheetal Tigadoli	 *
134717448d6SSheetal Tigadoli	 * We don't need to carry out any memory initialization
135717448d6SSheetal Tigadoli	 * on CSS platforms. The Secure RAM is accessible straight away.
136717448d6SSheetal Tigadoli	 * -----------------------------------------------------
137717448d6SSheetal Tigadoli	 */
138717448d6SSheetal Tigadolifunc platform_mem_init
139717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
140717448d6SSheetal Tigadoli	ret
141717448d6SSheetal Tigadoliendfunc platform_mem_init
142717448d6SSheetal Tigadoli
143717448d6SSheetal Tigadoli	/* -----------------------------------------------------
144717448d6SSheetal Tigadoli	 * Placeholder function which should be redefined by
145717448d6SSheetal Tigadoli	 * each platform.
146717448d6SSheetal Tigadoli	 * -----------------------------------------------------
147717448d6SSheetal Tigadoli	 */
148717448d6SSheetal Tigadolifunc platform_check_mpidr
149717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
150717448d6SSheetal Tigadoli	mov	x0, xzr
151717448d6SSheetal Tigadoli	ret
152717448d6SSheetal Tigadoliendfunc platform_check_mpidr
153717448d6SSheetal Tigadoli
154717448d6SSheetal Tigadoli	/* ---------------------------------------------
155717448d6SSheetal Tigadoli	 * int plat_crash_console_init(void)
156717448d6SSheetal Tigadoli	 * Function to initialize the crash console
157717448d6SSheetal Tigadoli	 * without a C Runtime to print crash report.
158717448d6SSheetal Tigadoli	 * Clobber list : x0, x1, x2
159717448d6SSheetal Tigadoli	 * ---------------------------------------------
160717448d6SSheetal Tigadoli	 */
161717448d6SSheetal Tigadoli
162717448d6SSheetal Tigadolifunc plat_crash_console_init
163717448d6SSheetal Tigadoli	mov_imm	x0, BRCM_CRASH_CONSOLE_BASE
164717448d6SSheetal Tigadoli	mov_imm	x1, BRCM_CRASH_CONSOLE_REFCLK
165717448d6SSheetal Tigadoli	mov_imm	x2, BRCM_CRASH_CONSOLE_BAUDRATE
166717448d6SSheetal Tigadoli	b	console_16550_core_init
167717448d6SSheetal Tigadoli	ret
168717448d6SSheetal Tigadoliendfunc plat_crash_console_init
169717448d6SSheetal Tigadoli
170717448d6SSheetal Tigadoli	/* ---------------------------------------------
171717448d6SSheetal Tigadoli	 * int plat_crash_console_putc(void)
172717448d6SSheetal Tigadoli	 * Function to print a character on the crash
173717448d6SSheetal Tigadoli	 * console without a C Runtime.
174717448d6SSheetal Tigadoli	 * Clobber list : x1, x2, x3
175717448d6SSheetal Tigadoli	 * ---------------------------------------------
176717448d6SSheetal Tigadoli	 */
177717448d6SSheetal Tigadoli
178717448d6SSheetal Tigadolifunc plat_crash_console_putc
179717448d6SSheetal Tigadoli	mov_imm x1, BRCM_CRASH_CONSOLE_BASE
180717448d6SSheetal Tigadoli	b	console_16550_core_putc
181717448d6SSheetal Tigadoli	ret
182717448d6SSheetal Tigadoliendfunc plat_crash_console_putc
183717448d6SSheetal Tigadoli
184717448d6SSheetal Tigadoli	/* ---------------------------------------------
185*831b0e98SJimmy Brisson	 * void plat_crash_console_flush(void)
186717448d6SSheetal Tigadoli	 * Function to flush crash console
187717448d6SSheetal Tigadoli	 * Clobber list : x0, x1
188717448d6SSheetal Tigadoli	 * ---------------------------------------------
189717448d6SSheetal Tigadoli	 */
190717448d6SSheetal Tigadolifunc plat_crash_console_flush
191717448d6SSheetal Tigadoli	mov_imm x0, BRCM_CRASH_CONSOLE_BASE
192717448d6SSheetal Tigadoli	b	console_16550_core_flush
193717448d6SSheetal Tigadoli	ret
194717448d6SSheetal Tigadoliendfunc plat_crash_console_flush
195717448d6SSheetal Tigadoli
196717448d6SSheetal Tigadoli	/* -----------------------------------------------------
197717448d6SSheetal Tigadoli	 * Placeholder function which should be redefined by
198717448d6SSheetal Tigadoli	 * each platform. This function is allowed to use
199717448d6SSheetal Tigadoli	 * registers x0 - x17.
200717448d6SSheetal Tigadoli	 * -----------------------------------------------------
201717448d6SSheetal Tigadoli	 */
202717448d6SSheetal Tigadoli
203717448d6SSheetal Tigadolifunc plat_disable_acp
204717448d6SSheetal Tigadoli	/*TBD-STINGRAY*/
205717448d6SSheetal Tigadoli	ret
206717448d6SSheetal Tigadoliendfunc plat_disable_acp
207717448d6SSheetal Tigadoli
208717448d6SSheetal Tigadoli	/* -----------------------------------------------------
209717448d6SSheetal Tigadoli	 * unsigned int plat_is_my_cpu_primary (void);
210717448d6SSheetal Tigadoli	 *
211717448d6SSheetal Tigadoli	 * Find out whether the current cpu is the primary
212717448d6SSheetal Tigadoli	 * cpu (applicable only after a cold boot)
213717448d6SSheetal Tigadoli	 * -----------------------------------------------------
214717448d6SSheetal Tigadoli	 */
215717448d6SSheetal Tigadolifunc plat_is_my_cpu_primary
216717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
217717448d6SSheetal Tigadoli	b	platform_is_primary_cpu
218717448d6SSheetal Tigadoliendfunc plat_is_my_cpu_primary
219717448d6SSheetal Tigadoli
220717448d6SSheetal Tigadoli	/* -----------------------------------------------------
221717448d6SSheetal Tigadoli	 *  unsigned int plat_my_core_pos(void)
222717448d6SSheetal Tigadoli	 *  This function uses the plat_brcm_calc_core_pos()
223717448d6SSheetal Tigadoli	 *  definition to get the index of the calling CPU.
224717448d6SSheetal Tigadoli	 * -----------------------------------------------------
225717448d6SSheetal Tigadoli	 */
226717448d6SSheetal Tigadolifunc plat_my_core_pos
227717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
228717448d6SSheetal Tigadoli	b	plat_brcm_calc_core_pos
229717448d6SSheetal Tigadoliendfunc plat_my_core_pos
230717448d6SSheetal Tigadoli
231717448d6SSheetal Tigadoli	/* -----------------------------------------------------
232717448d6SSheetal Tigadoli	 * unsigned int platform_is_primary_cpu (void);
233717448d6SSheetal Tigadoli	 *
234717448d6SSheetal Tigadoli	 * Find out whether the current cpu is the primary
235717448d6SSheetal Tigadoli	 * cpu (applicable only after a cold boot)
236717448d6SSheetal Tigadoli	 * -----------------------------------------------------
237717448d6SSheetal Tigadoli	 */
238717448d6SSheetal Tigadolifunc platform_is_primary_cpu
239717448d6SSheetal Tigadoli	mov	x9, x30
240717448d6SSheetal Tigadoli	bl	plat_my_core_pos
241717448d6SSheetal Tigadoli	cmp	x0, #PRIMARY_CPU
242717448d6SSheetal Tigadoli	cset	x0, eq
243717448d6SSheetal Tigadoli	ret	x9
244717448d6SSheetal Tigadoliendfunc platform_is_primary_cpu
245717448d6SSheetal Tigadoli
246717448d6SSheetal Tigadoli	/* -----------------------------------------------------
247717448d6SSheetal Tigadoli	 *  unsigned int plat_brcm_calc_core_pos(uint64_t mpidr)
248717448d6SSheetal Tigadoli	 *  Helper function to calculate the core position.
249717448d6SSheetal Tigadoli	 *  With this function: CorePos = (ClusterId * 4) +
250717448d6SSheetal Tigadoli	 *  				  CoreId
251717448d6SSheetal Tigadoli	 * -----------------------------------------------------
252717448d6SSheetal Tigadoli	 */
253717448d6SSheetal Tigadolifunc plat_brcm_calc_core_pos
254717448d6SSheetal Tigadoli	and	x1, x0, #MPIDR_CPU_MASK
255717448d6SSheetal Tigadoli	and	x0, x0, #MPIDR_CLUSTER_MASK
256717448d6SSheetal Tigadoli	add	x0, x1, x0, LSR #7
257717448d6SSheetal Tigadoli	ret
258717448d6SSheetal Tigadoliendfunc plat_brcm_calc_core_pos
259717448d6SSheetal Tigadoli
260717448d6SSheetal Tigadolifunc plat_get_my_entrypoint
261717448d6SSheetal Tigadoli	mrs	x0, mpidr_el1
262717448d6SSheetal Tigadoli	b	platform_get_entrypoint
263717448d6SSheetal Tigadoliendfunc plat_get_my_entrypoint
264