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