xref: /openbmc/u-boot/arch/arm/mach-mvebu/lowlevel_spl.S (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
2350b50eeSStefan Roese
3350b50eeSStefan Roese#include <config.h>
4350b50eeSStefan Roese#include <linux/linkage.h>
5350b50eeSStefan Roese
6944c7a31SStefan RoeseENTRY(save_boot_params)
7944c7a31SStefan Roese	stmfd	sp!, {r0 - r12, lr}	/* @ save registers on stack */
8944c7a31SStefan Roese	ldr	r12, =CONFIG_SPL_BOOTROM_SAVE
9944c7a31SStefan Roese	str	sp, [r12]
10944c7a31SStefan Roese	b	save_boot_params_ret
11944c7a31SStefan RoeseENDPROC(save_boot_params)
12944c7a31SStefan Roese
13944c7a31SStefan RoeseENTRY(return_to_bootrom)
14944c7a31SStefan Roese	ldr	r12, =CONFIG_SPL_BOOTROM_SAVE
15944c7a31SStefan Roese	ldr	sp, [r12]
16944c7a31SStefan Roese	mov	r0, #0x0		/* @ return value: 0x0 NO_ERR */
17944c7a31SStefan Roese	ldmfd	sp!, {r0 - r12, pc}	/* @ restore regs and return */
18944c7a31SStefan RoeseENDPROC(return_to_bootrom)
19350b50eeSStefan Roese
20350b50eeSStefan Roese/*
21350b50eeSStefan Roese * cache_inv - invalidate Cache line
22350b50eeSStefan Roese * r0 - dest
23350b50eeSStefan Roese */
24350b50eeSStefan Roese	.global cache_inv
25350b50eeSStefan Roese	.type  cache_inv, %function
26350b50eeSStefan Roese	cache_inv:
27350b50eeSStefan Roese
28350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
29350b50eeSStefan Roese
30350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c6, 1
31350b50eeSStefan Roese
32350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
33350b50eeSStefan Roese	bx      lr
34350b50eeSStefan Roese
35350b50eeSStefan Roese
36350b50eeSStefan Roese/*
37350b50eeSStefan Roese * flush_l1_v6 - l1 cache clean invalidate
38350b50eeSStefan Roese * r0 - dest
39350b50eeSStefan Roese */
40350b50eeSStefan Roese	.global flush_l1_v6
41350b50eeSStefan Roese	.type	flush_l1_v6, %function
42350b50eeSStefan Roese	flush_l1_v6:
43350b50eeSStefan Roese
44350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
45350b50eeSStefan Roese
46350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c10, 5	/* @ data memory barrier */
47350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c14, 1	/* @ clean & invalidate D line */
48350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c10, 4	/* @ data sync barrier */
49350b50eeSStefan Roese
50350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
51350b50eeSStefan Roese	bx      lr
52350b50eeSStefan Roese
53350b50eeSStefan Roese
54350b50eeSStefan Roese/*
55350b50eeSStefan Roese * flush_l1_v7 - l1 cache clean invalidate
56350b50eeSStefan Roese * r0 - dest
57350b50eeSStefan Roese */
58350b50eeSStefan Roese	.global flush_l1_v7
59350b50eeSStefan Roese	.type	flush_l1_v7, %function
60350b50eeSStefan Roese	flush_l1_v7:
61350b50eeSStefan Roese
62350b50eeSStefan Roese	stmfd   sp!, {r1-r12}
63350b50eeSStefan Roese
64350b50eeSStefan Roese	dmb				/* @data memory barrier */
65350b50eeSStefan Roese	mcr     p15, 0, r0, c7, c14, 1	/* @ clean & invalidate D line */
66350b50eeSStefan Roese	dsb				/* @data sync barrier */
67350b50eeSStefan Roese
68350b50eeSStefan Roese	ldmfd   sp!, {r1-r12}
69350b50eeSStefan Roese	bx      lr
70