xref: /rk3399_rockchip-uboot/arch/arm/mach-mvebu/lowlevel_spl.S (revision f46c25583a73042edf432b209ee4b93bc3f7e762)
1350b50eeSStefan Roese/*
2350b50eeSStefan Roese * SPDX-License-Identifier:	GPL-2.0+
3350b50eeSStefan Roese */
4350b50eeSStefan Roese
5350b50eeSStefan Roese#include <config.h>
6350b50eeSStefan Roese#include <linux/linkage.h>
7350b50eeSStefan Roese
8*944c7a31SStefan RoeseENTRY(save_boot_params)
9*944c7a31SStefan Roese	stmfd	sp!, {r0 - r12, lr}	/* @ save registers on stack */
10*944c7a31SStefan Roese	ldr	r12, =CONFIG_SPL_BOOTROM_SAVE
11*944c7a31SStefan Roese	str	sp, [r12]
12*944c7a31SStefan Roese	b	save_boot_params_ret
13*944c7a31SStefan RoeseENDPROC(save_boot_params)
14*944c7a31SStefan Roese
15*944c7a31SStefan RoeseENTRY(return_to_bootrom)
16*944c7a31SStefan Roese	ldr	r12, =CONFIG_SPL_BOOTROM_SAVE
17*944c7a31SStefan Roese	ldr	sp, [r12]
18*944c7a31SStefan Roese	mov	r0, #0x0		/* @ return value: 0x0 NO_ERR */
19*944c7a31SStefan Roese	ldmfd	sp!, {r0 - r12, pc}	/* @ restore regs and return */
20*944c7a31SStefan RoeseENDPROC(return_to_bootrom)
21350b50eeSStefan Roese
22350b50eeSStefan Roese/*
23350b50eeSStefan Roese * cache_inv - invalidate Cache line
24350b50eeSStefan Roese * r0 - dest
25350b50eeSStefan Roese */
26350b50eeSStefan Roese	.global cache_inv
27350b50eeSStefan Roese	.type  cache_inv, %function
28350b50eeSStefan Roese	cache_inv:
29350b50eeSStefan Roese
30350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
31350b50eeSStefan Roese
32350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c6, 1
33350b50eeSStefan Roese
34350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
35350b50eeSStefan Roese	bx      lr
36350b50eeSStefan Roese
37350b50eeSStefan Roese
38350b50eeSStefan Roese/*
39350b50eeSStefan Roese * flush_l1_v6 - l1 cache clean invalidate
40350b50eeSStefan Roese * r0 - dest
41350b50eeSStefan Roese */
42350b50eeSStefan Roese	.global flush_l1_v6
43350b50eeSStefan Roese	.type	flush_l1_v6, %function
44350b50eeSStefan Roese	flush_l1_v6:
45350b50eeSStefan Roese
46350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
47350b50eeSStefan Roese
48350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c10, 5	/* @ data memory barrier */
49350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c14, 1	/* @ clean & invalidate D line */
50350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c10, 4	/* @ data sync barrier */
51350b50eeSStefan Roese
52350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
53350b50eeSStefan Roese	bx      lr
54350b50eeSStefan Roese
55350b50eeSStefan Roese
56350b50eeSStefan Roese/*
57350b50eeSStefan Roese * flush_l1_v7 - l1 cache clean invalidate
58350b50eeSStefan Roese * r0 - dest
59350b50eeSStefan Roese */
60350b50eeSStefan Roese	.global flush_l1_v7
61350b50eeSStefan Roese	.type	flush_l1_v7, %function
62350b50eeSStefan Roese	flush_l1_v7:
63350b50eeSStefan Roese
64350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
65350b50eeSStefan Roese
66350b50eeSStefan Roese	dmb				/* @data memory barrier */
67350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c14, 1	/* @ clean & invalidate D line */
68350b50eeSStefan Roese	dsb				/* @data sync barrier */
69350b50eeSStefan Roese
70350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
71350b50eeSStefan Roese	bx      lr
72