xref: /rk3399_ARM-atf/plat/marvell/armada/common/aarch64/marvell_helpers.S (revision 831b0e9824e6c7cb07308830c12977acb79156c7)
1a2847172SGrzegorz Jaszczyk/*
2*831b0e98SJimmy 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
66a2847172SGrzegorz Jaszczyk	mov_imm	x0, PLAT_MARVELL_CRASH_UART_BASE
67a2847172SGrzegorz Jaszczyk	mov_imm	x1, PLAT_MARVELL_CRASH_UART_CLK_IN_HZ
68a2847172SGrzegorz Jaszczyk	mov_imm	x2, MARVELL_CONSOLE_BAUDRATE
69a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
70a2847172SGrzegorz Jaszczyk	b	console_a3700_core_init
71a2847172SGrzegorz Jaszczyk#else
72a2847172SGrzegorz Jaszczyk	b	console_16550_core_init
73a2847172SGrzegorz Jaszczyk#endif
74a2847172SGrzegorz Jaszczykendfunc plat_crash_console_init
75a2847172SGrzegorz Jaszczyk
76a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------
77a2847172SGrzegorz Jaszczyk	 * int plat_crash_console_putc(int c)
78a2847172SGrzegorz Jaszczyk	 * Function to print a character on the crash
79a2847172SGrzegorz Jaszczyk	 * console without a C Runtime.
80a2847172SGrzegorz Jaszczyk	 * Clobber list : x1, x2
81a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------
82a2847172SGrzegorz Jaszczyk	 */
83a2847172SGrzegorz Jaszczykfunc plat_crash_console_putc
84a2847172SGrzegorz Jaszczyk	mov_imm	x1, PLAT_MARVELL_CRASH_UART_BASE
85a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
86a2847172SGrzegorz Jaszczyk
87a2847172SGrzegorz Jaszczyk	b	console_a3700_core_putc
88a2847172SGrzegorz Jaszczyk#else
89a2847172SGrzegorz Jaszczyk	b	console_16550_core_putc
90a2847172SGrzegorz Jaszczyk#endif
91a2847172SGrzegorz Jaszczykendfunc plat_crash_console_putc
92a2847172SGrzegorz Jaszczyk
93a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------
94*831b0e98SJimmy Brisson	 * void plat_crash_console_flush()
95a2847172SGrzegorz Jaszczyk	 * Function to force a write of all buffered
96a2847172SGrzegorz Jaszczyk	 * data that hasn't been output.
97*831b0e98SJimmy Brisson	 * Out : void.
98a2847172SGrzegorz Jaszczyk	 * Clobber list : r0
99a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------
100a2847172SGrzegorz Jaszczyk	 */
101a2847172SGrzegorz Jaszczykfunc plat_crash_console_flush
102a2847172SGrzegorz Jaszczyk	mov_imm	x0, PLAT_MARVELL_CRASH_UART_BASE
103a2847172SGrzegorz Jaszczyk#ifdef PLAT_a3700
104a2847172SGrzegorz Jaszczyk	b	console_a3700_core_flush
105a2847172SGrzegorz Jaszczyk#else
106a2847172SGrzegorz Jaszczyk	b	console_16550_core_flush
107a2847172SGrzegorz Jaszczyk#endif
108a2847172SGrzegorz Jaszczykendfunc plat_crash_console_flush
109a2847172SGrzegorz Jaszczyk
110a2847172SGrzegorz Jaszczyk	/* ---------------------------------------------------------------------
111a2847172SGrzegorz Jaszczyk	 * We don't need to carry out any memory initialization on ARM
112a2847172SGrzegorz Jaszczyk	 * platforms. The Secure RAM is accessible straight away.
113a2847172SGrzegorz Jaszczyk	 * ---------------------------------------------------------------------
114a2847172SGrzegorz Jaszczyk	 */
115a2847172SGrzegorz Jaszczykfunc platform_mem_init
116a2847172SGrzegorz Jaszczyk	ret
117a2847172SGrzegorz Jaszczykendfunc platform_mem_init
118a2847172SGrzegorz Jaszczyk
119a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
120a2847172SGrzegorz Jaszczyk	 * Disable icache, dcache, and MMU
121a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
122a2847172SGrzegorz Jaszczyk	 */
123a2847172SGrzegorz Jaszczykfunc disable_mmu_dcache
124a2847172SGrzegorz Jaszczyk	mrs	x0, sctlr_el3
125a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x1		/* M bit - MMU */
126a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x4		/* C bit - Dcache L1 & L2 */
127a2847172SGrzegorz Jaszczyk	msr	sctlr_el3, x0
128a2847172SGrzegorz Jaszczyk	isb
129a2847172SGrzegorz Jaszczyk	b	mmu_off
130a2847172SGrzegorz Jaszczykmmu_off:
131a2847172SGrzegorz Jaszczyk	ret
132a2847172SGrzegorz Jaszczykendfunc disable_mmu_dcache
133a2847172SGrzegorz Jaszczyk
134a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
135a2847172SGrzegorz Jaszczyk	 * Disable all TLB entries
136a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
137a2847172SGrzegorz Jaszczyk	 */
138a2847172SGrzegorz Jaszczykfunc invalidate_tlb_all
139a2847172SGrzegorz Jaszczyk	tlbi	alle3
140a2847172SGrzegorz Jaszczyk	dsb	sy
141a2847172SGrzegorz Jaszczyk	isb
142a2847172SGrzegorz Jaszczyk	ret
143a2847172SGrzegorz Jaszczykendfunc invalidate_tlb_all
144a2847172SGrzegorz Jaszczyk
145a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
146a2847172SGrzegorz Jaszczyk	 * Disable the i cache
147a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
148a2847172SGrzegorz Jaszczyk	 */
149a2847172SGrzegorz Jaszczykfunc disable_icache
150a2847172SGrzegorz Jaszczyk	mrs 	x0, sctlr_el3
151a2847172SGrzegorz Jaszczyk	bic	x0, x0, 0x1000	/* I bit - Icache L1 & L2 */
152a2847172SGrzegorz Jaszczyk	msr	sctlr_el3, x0
153a2847172SGrzegorz Jaszczyk	isb
154a2847172SGrzegorz Jaszczyk	ret
155a2847172SGrzegorz Jaszczykendfunc disable_icache
156a2847172SGrzegorz Jaszczyk
157a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
158a2847172SGrzegorz Jaszczyk	 * Disable all of the i caches
159a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
160a2847172SGrzegorz Jaszczyk	 */
161a2847172SGrzegorz Jaszczykfunc invalidate_icache_all
162a2847172SGrzegorz Jaszczyk	ic	ialluis
163a2847172SGrzegorz Jaszczyk	isb	sy
164a2847172SGrzegorz Jaszczyk	ret
165a2847172SGrzegorz Jaszczykendfunc invalidate_icache_all
166a2847172SGrzegorz Jaszczyk
167a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
168a2847172SGrzegorz Jaszczyk	 * Clear the SRAM enabling bit to unmap SRAM
169a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
170a2847172SGrzegorz Jaszczyk	 */
171a2847172SGrzegorz Jaszczykfunc platform_unmap_sram
172a2847172SGrzegorz Jaszczyk	ldr	x0, =CCU_SRAM_WIN_CR
173a2847172SGrzegorz Jaszczyk	str	wzr, [x0]
174a2847172SGrzegorz Jaszczyk	ret
175a2847172SGrzegorz Jaszczykendfunc platform_unmap_sram
176a2847172SGrzegorz Jaszczyk
177a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
178a2847172SGrzegorz Jaszczyk	 * Disable the SRAM
179a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
180a2847172SGrzegorz Jaszczyk	 */
181a2847172SGrzegorz Jaszczykfunc disable_sram
182a2847172SGrzegorz Jaszczyk	/* Disable the line lockings. They must be disabled expictly
183a2847172SGrzegorz Jaszczyk	 * or the OS will have problems using the cache */
184a2847172SGrzegorz Jaszczyk	ldr	x1, =MASTER_LLC_TC0_LOCK
185a2847172SGrzegorz Jaszczyk	str	wzr, [x1]
186a2847172SGrzegorz Jaszczyk
187a2847172SGrzegorz Jaszczyk	/* Invalidate all ways */
188a2847172SGrzegorz Jaszczyk	ldr	w1, =LLC_WAY_MASK
189772aa5baSKonstantin Porotchkin	ldr	x0, =MASTER_LLC_INV_WAY
190a2847172SGrzegorz Jaszczyk	str	w1, [x0]
191a2847172SGrzegorz Jaszczyk
192a2847172SGrzegorz Jaszczyk	/* Finally disable LLC */
193a2847172SGrzegorz Jaszczyk	ldr	x0, =MASTER_LLC_CTRL
194a2847172SGrzegorz Jaszczyk	str	wzr, [x0]
195a2847172SGrzegorz Jaszczyk
196a2847172SGrzegorz Jaszczyk	ret
197a2847172SGrzegorz Jaszczykendfunc disable_sram
198a2847172SGrzegorz Jaszczyk
199a2847172SGrzegorz Jaszczyk	/* -----------------------------------------------------
200a2847172SGrzegorz Jaszczyk	 * Operation when exit bootROM:
201a2847172SGrzegorz Jaszczyk	 * Disable the MMU
202a2847172SGrzegorz Jaszczyk	 * Disable and invalidate the dcache
203a2847172SGrzegorz Jaszczyk	 * Unmap and disable the SRAM
204a2847172SGrzegorz Jaszczyk	 * Disable and invalidate the icache
205a2847172SGrzegorz Jaszczyk	 * -----------------------------------------------------
206a2847172SGrzegorz Jaszczyk	 */
207a2847172SGrzegorz Jaszczykfunc marvell_exit_bootrom
208a2847172SGrzegorz Jaszczyk	/* Save the system restore address */
209a2847172SGrzegorz Jaszczyk	mov	x28, x0
210a2847172SGrzegorz Jaszczyk
211a2847172SGrzegorz Jaszczyk	/* Close the caches and MMU */
212a2847172SGrzegorz Jaszczyk	bl	disable_mmu_dcache
213a2847172SGrzegorz Jaszczyk
214a2847172SGrzegorz Jaszczyk	/*
215a2847172SGrzegorz Jaszczyk	 * There is nothing important in the caches now,
216a2847172SGrzegorz Jaszczyk	 * so invalidate them instead of cleaning.
217a2847172SGrzegorz Jaszczyk	 */
218a2847172SGrzegorz Jaszczyk	adr	x0, __RW_START__
219a2847172SGrzegorz Jaszczyk	adr	x1, __RW_END__
220a2847172SGrzegorz Jaszczyk	sub	x1, x1, x0
221a2847172SGrzegorz Jaszczyk	bl	inv_dcache_range
222a2847172SGrzegorz Jaszczyk	bl	invalidate_tlb_all
223a2847172SGrzegorz Jaszczyk
224a2847172SGrzegorz Jaszczyk	/*
225a2847172SGrzegorz Jaszczyk	 * Clean the memory mapping of SRAM
226a2847172SGrzegorz Jaszczyk	 * the DDR mapping will remain to enable boot image to execute
227a2847172SGrzegorz Jaszczyk	 */
228a2847172SGrzegorz Jaszczyk	bl	platform_unmap_sram
229a2847172SGrzegorz Jaszczyk
230a2847172SGrzegorz Jaszczyk	/* Disable the SRAM */
231a2847172SGrzegorz Jaszczyk	bl	disable_sram
232a2847172SGrzegorz Jaszczyk
233a2847172SGrzegorz Jaszczyk	/* Disable and invalidate icache */
234a2847172SGrzegorz Jaszczyk	bl	disable_icache
235a2847172SGrzegorz Jaszczyk	bl	invalidate_icache_all
236a2847172SGrzegorz Jaszczyk
237a2847172SGrzegorz Jaszczyk	mov	x0, x28
238a2847172SGrzegorz Jaszczyk	br	x0
239a2847172SGrzegorz Jaszczykendfunc marvell_exit_bootrom
240a2847172SGrzegorz Jaszczyk
241a2847172SGrzegorz Jaszczyk	/*
242a2847172SGrzegorz Jaszczyk	 * Enable L2 UniqueClean evictions with data
243a2847172SGrzegorz Jaszczyk	 */
244a2847172SGrzegorz Jaszczykfunc ca72_l2_enable_unique_clean
245a2847172SGrzegorz Jaszczyk
246a2847172SGrzegorz Jaszczyk	mrs	x0, CORTEX_A72_L2ACTLR_EL1
247a2847172SGrzegorz Jaszczyk	orr	x0, x0, #CORTEX_A72_L2ACTLR_ENABLE_UNIQUE_CLEAN
248a2847172SGrzegorz Jaszczyk	msr	CORTEX_A72_L2ACTLR_EL1, x0
249a2847172SGrzegorz Jaszczyk
250a2847172SGrzegorz Jaszczyk	ret
251a2847172SGrzegorz Jaszczykendfunc ca72_l2_enable_unique_clean
252