xref: /rk3399_ARM-atf/plat/marvell/armada/common/aarch64/marvell_helpers.S (revision 076bb38df536591a809ed980212748ae261083d1)
1a2847172SGrzegorz Jaszczyk/*
2831b0e98SJimmy Brisson * Copyright (c) 2020, ARM Limited. All rights reserved.
3a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd.
4a2847172SGrzegorz Jaszczyk *
5a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier:     BSD-3-Clause
6a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses
7a2847172SGrzegorz Jaszczyk */
8a2847172SGrzegorz Jaszczyk
9a2847172SGrzegorz Jaszczyk#include <asm_macros.S>
10a2847172SGrzegorz Jaszczyk#include <cortex_a72.h>
11a2847172SGrzegorz Jaszczyk#ifndef PLAT_a3700
12a2847172SGrzegorz Jaszczyk#include <drivers/marvell/ccu.h>
13a2847172SGrzegorz Jaszczyk#include <drivers/marvell/cache_llc.h>
14a2847172SGrzegorz Jaszczyk#endif
15a2847172SGrzegorz Jaszczyk#include <marvell_def.h>
16a2847172SGrzegorz Jaszczyk#include <platform_def.h>
17a2847172SGrzegorz Jaszczyk
18a2847172SGrzegorz Jaszczyk	.weak	plat_marvell_calc_core_pos
19a2847172SGrzegorz Jaszczyk	.weak	plat_my_core_pos
20a2847172SGrzegorz Jaszczyk	.globl	plat_crash_console_init
21a2847172SGrzegorz Jaszczyk	.globl	plat_crash_console_putc
22a2847172SGrzegorz Jaszczyk	.globl	plat_crash_console_flush
23a2847172SGrzegorz Jaszczyk	.globl	platform_mem_init
24a2847172SGrzegorz Jaszczyk	.globl	disable_mmu_dcache
25a2847172SGrzegorz Jaszczyk	.globl	invalidate_tlb_all
26a2847172SGrzegorz Jaszczyk	.globl	platform_unmap_sram
27a2847172SGrzegorz Jaszczyk	.globl	disable_sram
28a2847172SGrzegorz Jaszczyk	.globl	disable_icache
29a2847172SGrzegorz Jaszczyk	.globl	invalidate_icache_all
30a2847172SGrzegorz Jaszczyk	.globl	marvell_exit_bootrom
31a2847172SGrzegorz Jaszczyk	.globl	ca72_l2_enable_unique_clean
32a2847172SGrzegorz Jaszczyk
33a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
34a2847172SGrzegorz Jaszczyk	 *  unsigned int plat_my_core_pos(void)
35a2847172SGrzegorz Jaszczyk	 *  This function uses the plat_marvell_calc_core_pos()
36a2847172SGrzegorz Jaszczyk	 *  definition to get the index of the calling CPU.
37a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
38a2847172SGrzegorz Jaszczyk	 */
39a2847172SGrzegorz Jaszczykfunc plat_my_core_pos
40a2847172SGrzegorz Jaszczyk	mrs	x0, mpidr_el1
41a2847172SGrzegorz Jaszczyk	b	plat_marvell_calc_core_pos
42a2847172SGrzegorz Jaszczykendfunc plat_my_core_pos
43a2847172SGrzegorz Jaszczyk
44a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
45a2847172SGrzegorz Jaszczyk	 *  unsigned int plat_marvell_calc_core_pos(uint64_t mpidr)
46a2847172SGrzegorz Jaszczyk	 *  Helper function to calculate the core position.
47a2847172SGrzegorz Jaszczyk	 *  With this function: CorePos = (ClusterId * 2) +
48a2847172SGrzegorz Jaszczyk	 *  				  CoreId
49a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
50a2847172SGrzegorz Jaszczyk	 */
51a2847172SGrzegorz Jaszczykfunc plat_marvell_calc_core_pos
52a2847172SGrzegorz Jaszczyk	and	x1, x0, #MPIDR_CPU_MASK
53a2847172SGrzegorz Jaszczyk	and	x0, x0, #MPIDR_CLUSTER_MASK
54a2847172SGrzegorz Jaszczyk	add	x0, x1, x0, LSR #7
55a2847172SGrzegorz Jaszczyk	ret
56a2847172SGrzegorz Jaszczykendfunc plat_marvell_calc_core_pos
57a2847172SGrzegorz Jaszczyk
58a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------
59a2847172SGrzegorz Jaszczyk	 * int plat_crash_console_init(void)
60a2847172SGrzegorz Jaszczyk	 * Function to initialize the crash console
61a2847172SGrzegorz Jaszczyk	 * without a C Runtime to print crash report.
62a2847172SGrzegorz Jaszczyk	 * Clobber list : x0, x1, x2
63a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------
64a2847172SGrzegorz Jaszczyk	 */
65a2847172SGrzegorz Jaszczykfunc plat_crash_console_init
66*5a91c439SPali Rohár#ifdef PLAT_a3700
67*5a91c439SPali Rohár	mov	x1, x30
68*5a91c439SPali Rohár	bl	get_ref_clk
69*5a91c439SPali Rohár	mov	x30, x1
70*5a91c439SPali Rohár	mov_imm	x1, 1000000
71*5a91c439SPali Rohár	mul	x1, x0, x1
72*5a91c439SPali Rohár#else
7331336258SPali Rohár	mov_imm	x1, PLAT_MARVELL_UART_CLK_IN_HZ
74*5a91c439SPali Rohár#endif
75*5a91c439SPali Rohár	mov_imm	x0, PLAT_MARVELL_UART_BASE
76a2847172SGrzegorz Jaszczyk	mov_imm	x2, MARVELL_CONSOLE_BAUDRATE
77a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
78a2847172SGrzegorz Jaszczyk	b	console_a3700_core_init
79a2847172SGrzegorz Jaszczyk#else
80a2847172SGrzegorz Jaszczyk	b	console_16550_core_init
81a2847172SGrzegorz Jaszczyk#endif
82a2847172SGrzegorz Jaszczykendfunc plat_crash_console_init
83a2847172SGrzegorz Jaszczyk
84a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------
85a2847172SGrzegorz Jaszczyk	 * int plat_crash_console_putc(int c)
86a2847172SGrzegorz Jaszczyk	 * Function to print a character on the crash
87a2847172SGrzegorz Jaszczyk	 * console without a C Runtime.
88a2847172SGrzegorz Jaszczyk	 * Clobber list : x1, x2
89a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------
90a2847172SGrzegorz Jaszczyk	 */
91a2847172SGrzegorz Jaszczykfunc plat_crash_console_putc
9231336258SPali Rohár	mov_imm	x1, PLAT_MARVELL_UART_BASE
93a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
94a2847172SGrzegorz Jaszczyk
95a2847172SGrzegorz Jaszczyk	b	console_a3700_core_putc
96a2847172SGrzegorz Jaszczyk#else
97a2847172SGrzegorz Jaszczyk	b	console_16550_core_putc
98a2847172SGrzegorz Jaszczyk#endif
99a2847172SGrzegorz Jaszczykendfunc plat_crash_console_putc
100a2847172SGrzegorz Jaszczyk
101a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------
102831b0e98SJimmy Brisson	 * void plat_crash_console_flush()
103a2847172SGrzegorz Jaszczyk	 * Function to force a write of all buffered
104a2847172SGrzegorz Jaszczyk	 * data that hasn't been output.
105831b0e98SJimmy Brisson	 * Out : void.
106a2847172SGrzegorz Jaszczyk	 * Clobber list : r0
107a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------
108a2847172SGrzegorz Jaszczyk	 */
109a2847172SGrzegorz Jaszczykfunc plat_crash_console_flush
11031336258SPali Rohár	mov_imm	x0, PLAT_MARVELL_UART_BASE
111a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
112a2847172SGrzegorz Jaszczyk	b	console_a3700_core_flush
113a2847172SGrzegorz Jaszczyk#else
114a2847172SGrzegorz Jaszczyk	b	console_16550_core_flush
115a2847172SGrzegorz Jaszczyk#endif
116a2847172SGrzegorz Jaszczykendfunc plat_crash_console_flush
117a2847172SGrzegorz Jaszczyk
118a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------------------------------
119a2847172SGrzegorz Jaszczyk	 * We don't need to carry out any memory initialization on ARM
120a2847172SGrzegorz Jaszczyk	 * platforms. The Secure RAM is accessible straight away.
121a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------------------------------
122a2847172SGrzegorz Jaszczyk	 */
123a2847172SGrzegorz Jaszczykfunc platform_mem_init
124a2847172SGrzegorz Jaszczyk	ret
125a2847172SGrzegorz Jaszczykendfunc platform_mem_init
126a2847172SGrzegorz Jaszczyk
127a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
128a2847172SGrzegorz Jaszczyk	 * Disable icache, dcache, and MMU
129a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
130a2847172SGrzegorz Jaszczyk	 */
131a2847172SGrzegorz Jaszczykfunc disable_mmu_dcache
132a2847172SGrzegorz Jaszczyk	mrs	x0, sctlr_el3
133a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x1		/* M bit - MMU */
134a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x4		/* C bit - Dcache L1 & L2 */
135a2847172SGrzegorz Jaszczyk	msr	sctlr_el3, x0
136a2847172SGrzegorz Jaszczyk	isb
137a2847172SGrzegorz Jaszczyk	b	mmu_off
138a2847172SGrzegorz Jaszczykmmu_off:
139a2847172SGrzegorz Jaszczyk	ret
140a2847172SGrzegorz Jaszczykendfunc disable_mmu_dcache
141a2847172SGrzegorz Jaszczyk
142a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
143a2847172SGrzegorz Jaszczyk	 * Disable all TLB entries
144a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
145a2847172SGrzegorz Jaszczyk	 */
146a2847172SGrzegorz Jaszczykfunc invalidate_tlb_all
147a2847172SGrzegorz Jaszczyk	tlbi	alle3
148a2847172SGrzegorz Jaszczyk	dsb	sy
149a2847172SGrzegorz Jaszczyk	isb
150a2847172SGrzegorz Jaszczyk	ret
151a2847172SGrzegorz Jaszczykendfunc invalidate_tlb_all
152a2847172SGrzegorz Jaszczyk
153a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
154a2847172SGrzegorz Jaszczyk	 * Disable the i cache
155a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
156a2847172SGrzegorz Jaszczyk	 */
157a2847172SGrzegorz Jaszczykfunc disable_icache
158a2847172SGrzegorz Jaszczyk	mrs 	x0, sctlr_el3
159a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x1000	/* I bit - Icache L1 & L2 */
160a2847172SGrzegorz Jaszczyk	msr	sctlr_el3, x0
161a2847172SGrzegorz Jaszczyk	isb
162a2847172SGrzegorz Jaszczyk	ret
163a2847172SGrzegorz Jaszczykendfunc disable_icache
164a2847172SGrzegorz Jaszczyk
165a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
166a2847172SGrzegorz Jaszczyk	 * Disable all of the i caches
167a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
168a2847172SGrzegorz Jaszczyk	 */
169a2847172SGrzegorz Jaszczykfunc invalidate_icache_all
170a2847172SGrzegorz Jaszczyk	ic	ialluis
171a2847172SGrzegorz Jaszczyk	isb	sy
172a2847172SGrzegorz Jaszczyk	ret
173a2847172SGrzegorz Jaszczykendfunc invalidate_icache_all
174a2847172SGrzegorz Jaszczyk
175a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
176a2847172SGrzegorz Jaszczyk	 * Clear the SRAM enabling bit to unmap SRAM
177a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
178a2847172SGrzegorz Jaszczyk	 */
179a2847172SGrzegorz Jaszczykfunc platform_unmap_sram
180a2847172SGrzegorz Jaszczyk	ldr	x0, =CCU_SRAM_WIN_CR
181a2847172SGrzegorz Jaszczyk	str	wzr, [x0]
182a2847172SGrzegorz Jaszczyk	ret
183a2847172SGrzegorz Jaszczykendfunc platform_unmap_sram
184a2847172SGrzegorz Jaszczyk
185a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
186a2847172SGrzegorz Jaszczyk	 * Disable the SRAM
187a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
188a2847172SGrzegorz Jaszczyk	 */
189a2847172SGrzegorz Jaszczykfunc disable_sram
190a2847172SGrzegorz Jaszczyk	/* Disable the line lockings. They must be disabled expictly
191a2847172SGrzegorz Jaszczyk	 * or the OS will have problems using the cache */
192a2847172SGrzegorz Jaszczyk	ldr	x1, =MASTER_LLC_TC0_LOCK
193a2847172SGrzegorz Jaszczyk	str	wzr, [x1]
194a2847172SGrzegorz Jaszczyk
195a2847172SGrzegorz Jaszczyk	/* Invalidate all ways */
196a2847172SGrzegorz Jaszczyk	ldr	w1, =LLC_WAY_MASK
197772aa5baSKonstantin Porotchkin	ldr	x0, =MASTER_LLC_INV_WAY
198a2847172SGrzegorz Jaszczyk	str	w1, [x0]
199a2847172SGrzegorz Jaszczyk
200a2847172SGrzegorz Jaszczyk	/* Finally disable LLC */
201a2847172SGrzegorz Jaszczyk	ldr	x0, =MASTER_LLC_CTRL
202a2847172SGrzegorz Jaszczyk	str	wzr, [x0]
203a2847172SGrzegorz Jaszczyk
204a2847172SGrzegorz Jaszczyk	ret
205a2847172SGrzegorz Jaszczykendfunc disable_sram
206a2847172SGrzegorz Jaszczyk
207a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
208a2847172SGrzegorz Jaszczyk	 * Operation when exit bootROM:
209a2847172SGrzegorz Jaszczyk	 * Disable the MMU
210a2847172SGrzegorz Jaszczyk	 * Disable and invalidate the dcache
211a2847172SGrzegorz Jaszczyk	 * Unmap and disable the SRAM
212a2847172SGrzegorz Jaszczyk	 * Disable and invalidate the icache
213a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
214a2847172SGrzegorz Jaszczyk	 */
215a2847172SGrzegorz Jaszczykfunc marvell_exit_bootrom
216a2847172SGrzegorz Jaszczyk	/* Save the system restore address */
217a2847172SGrzegorz Jaszczyk	mov	x28, x0
218a2847172SGrzegorz Jaszczyk
219a2847172SGrzegorz Jaszczyk	/* Close the caches and MMU */
220a2847172SGrzegorz Jaszczyk	bl	disable_mmu_dcache
221a2847172SGrzegorz Jaszczyk
222a2847172SGrzegorz Jaszczyk	/*
223a2847172SGrzegorz Jaszczyk	 * There is nothing important in the caches now,
224a2847172SGrzegorz Jaszczyk	 * so invalidate them instead of cleaning.
225a2847172SGrzegorz Jaszczyk	 */
226a2847172SGrzegorz Jaszczyk	adr	x0, __RW_START__
227a2847172SGrzegorz Jaszczyk	adr	x1, __RW_END__
228a2847172SGrzegorz Jaszczyk	sub	x1, x1, x0
229a2847172SGrzegorz Jaszczyk	bl	inv_dcache_range
230a2847172SGrzegorz Jaszczyk	bl	invalidate_tlb_all
231a2847172SGrzegorz Jaszczyk
232a2847172SGrzegorz Jaszczyk	/*
233a2847172SGrzegorz Jaszczyk	 * Clean the memory mapping of SRAM
234a2847172SGrzegorz Jaszczyk	 * the DDR mapping will remain to enable boot image to execute
235a2847172SGrzegorz Jaszczyk	 */
236a2847172SGrzegorz Jaszczyk	bl	platform_unmap_sram
237a2847172SGrzegorz Jaszczyk
238a2847172SGrzegorz Jaszczyk	/* Disable the SRAM */
239a2847172SGrzegorz Jaszczyk	bl	disable_sram
240a2847172SGrzegorz Jaszczyk
241a2847172SGrzegorz Jaszczyk	/* Disable and invalidate icache */
242a2847172SGrzegorz Jaszczyk	bl	disable_icache
243a2847172SGrzegorz Jaszczyk	bl	invalidate_icache_all
244a2847172SGrzegorz Jaszczyk
245a2847172SGrzegorz Jaszczyk	mov	x0, x28
246a2847172SGrzegorz Jaszczyk	br	x0
247a2847172SGrzegorz Jaszczykendfunc marvell_exit_bootrom
248a2847172SGrzegorz Jaszczyk
249a2847172SGrzegorz Jaszczyk	/*
250a2847172SGrzegorz Jaszczyk	 * Enable L2 UniqueClean evictions with data
251a2847172SGrzegorz Jaszczyk	 */
252a2847172SGrzegorz Jaszczykfunc ca72_l2_enable_unique_clean
253a2847172SGrzegorz Jaszczyk
254a2847172SGrzegorz Jaszczyk	mrs	x0, CORTEX_A72_L2ACTLR_EL1
255a2847172SGrzegorz Jaszczyk	orr	x0, x0, #CORTEX_A72_L2ACTLR_ENABLE_UNIQUE_CLEAN
256a2847172SGrzegorz Jaszczyk	msr	CORTEX_A72_L2ACTLR_EL1, x0
257a2847172SGrzegorz Jaszczyk
258a2847172SGrzegorz Jaszczyk	ret
259a2847172SGrzegorz Jaszczykendfunc ca72_l2_enable_unique_clean
260