summaryrefslogtreecommitdiff
path: root/arch/arm/imx-common/vf610m4bootldr.S
blob: 991d31fa87267c2b67ed8cd69c197d30a8b198e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * Freescale Vybrid VF6xx M4 boot loader
 *
 * Enable PC/PS-Bus cache and get device tree pointer from Vybrid specific
 * argument register (PERSISTENT_ARG1)
 *
 * Copyright (c) 2014-2015 Stefan Agner <stefan@agner.ch>
 *
 */

#define	LMEM_PC_BASE	0xe0082000
#define	LMEM_PS_BASE	0xe0082800
#define LMEM_PXCCR	0x0
#define	SRC_BASE	0x4006e000
#define SRC_GPR2	0x28
#define SRC_GPR3	0x2c
	.thumb
	.align
main:
	.macro invalidate_cache, base
	.local invalidate_cache
	/* GO, INVW1 & INVW0 */
	mov	r3, #0x85
	lsl	r3, r3, #24

	/* ENCACHE */
	mov	r1, #0x1
	orr	r3, r1
	str	r3, [ \base, #LMEM_PXCCR ]

	ldr	r3, =0x1
	lsl	r3, r3, #31
1:
	ldr	r2, [ \base, #LMEM_PXCCR ]
	and	r2, r2, r3
	bne	1b
	.endm

	ldr	r0, lmem_ps_base
	invalidate_cache r0
	ldr	r0, lmem_pc_base
	invalidate_cache r0

	ldr	r0, src_base
	ldr	r1, machine_id		@ Machine ID
	ldr	r2, [ r0, #SRC_GPR3 ] 	@ DT pointer from argument register
	mov	r0, #0x0
	b	end

	.align

machine_id:
	.long	0xffffffff
src_base:
	.long	SRC_BASE
lmem_pc_base:
	.long	LMEM_PC_BASE
lmem_ps_base:
	.long	LMEM_PS_BASE
	.align 7
end: