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