1ed407be5SPali Rohár/*
2ed407be5SPali Rohár * (C) Copyright 2011-2012
3ed407be5SPali Rohár * Pali Rohár <pali.rohar@gmail.com>
4ed407be5SPali Rohár *
51a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
6ed407be5SPali Rohár */
7ed407be5SPali Rohár
8ed407be5SPali Rohár#include <config.h>
9ed407be5SPali Rohár
10ed407be5SPali Rohárrelocaddr:		/* address of this relocaddr section after coping */
11ed407be5SPali Rohár	.word .		/* address of section (calculated at compile time) */
12ed407be5SPali Rohár
13ed407be5SPali Rohárstartaddr:		/* address of u-boot after copying */
14ed407be5SPali Rohár	.word CONFIG_SYS_TEXT_BASE
15ed407be5SPali Rohár
16ed407be5SPali Rohárkernaddr:		/* address of kernel after copying */
17ed407be5SPali Rohár	.word KERNEL_ADDRESS
18ed407be5SPali Rohár
19ed407be5SPali Rohárkernsize:		/* maximal size of kernel image */
20ed407be5SPali Rohár	.word KERNEL_MAXSIZE
21ed407be5SPali Rohár
22ed407be5SPali Rohárkernoffs:		/* offset of kernel image in loaded u-boot */
23ed407be5SPali Rohár	.word KERNEL_OFFSET
24ed407be5SPali Rohár
25ed407be5SPali Rohárimagesize:		/* maximal size of image */
26ed407be5SPali Rohár	.word IMAGE_MAXSIZE
27ed407be5SPali Rohár
28ed407be5SPali Rohárih_magic:		/* IH_MAGIC in big endian from include/image.h */
29ed407be5SPali Rohár	.word 0x56190527
30ed407be5SPali Rohár
31ed407be5SPali Rohár/*
32ed407be5SPali Rohár * Routine: save_boot_params (called after reset from start.S)
33ed407be5SPali Rohár * Description: Copy attached kernel to address KERNEL_ADDRESS
34ed407be5SPali Rohár *              Copy u-boot to address CONFIG_SYS_TEXT_BASE
35ed407be5SPali Rohár *              Return to copied u-boot address
36ed407be5SPali Rohár */
37ed407be5SPali Rohár
38ed407be5SPali Rohár.global save_boot_params
39ed407be5SPali Rohársave_boot_params:
40*e11c6c27SSimon Glass	/* Get return address */
41*e11c6c27SSimon Glass	ldr	lr, =save_boot_params_ret
42ed407be5SPali Rohár
43ed407be5SPali Rohár/* Copy valid attached kernel to address KERNEL_ADDRESS */
44ed407be5SPali Rohár
45ed407be5SPali Rohárcopy_kernel_start:
46ed407be5SPali Rohár	adr	r0, relocaddr	/* r0 - address of section relocaddr */
47ed407be5SPali Rohár	ldr	r1, relocaddr	/* r1 - address of relocaddr after relocation */
48ed407be5SPali Rohár	cmp	r0, r1
49ed407be5SPali Rohár
50ed407be5SPali Rohár	/* r4 - calculated offset */
51ed407be5SPali Rohár	subhi	r4, r0, r1
52ed407be5SPali Rohár	sublo	r4, r1, r0
53ed407be5SPali Rohár
54ed407be5SPali Rohár	/* r0 - start of kernel before */
55ed407be5SPali Rohár	ldr	r0, startaddr
56ed407be5SPali Rohár	addhi	r0, r0, r4
57ed407be5SPali Rohár	sublo	r0, r0, r4
58ed407be5SPali Rohár	ldr	r1, kernoffs
59ed407be5SPali Rohár	add	r0, r0, r1
60ed407be5SPali Rohár
61ed407be5SPali Rohár	/* r3 - start of kernel after */
62ed407be5SPali Rohár	ldr	r3, kernaddr
63ed407be5SPali Rohár
64ed407be5SPali Rohár	/* r2 - end of kernel after */
65ed407be5SPali Rohár	ldr	r1, kernsize
66ed407be5SPali Rohár	add	r2, r3, r1
67ed407be5SPali Rohár
68ed407be5SPali Rohár	/* r1 - end of kernel before */
69ed407be5SPali Rohár	add	r1, r0, r1
70ed407be5SPali Rohár
71ed407be5SPali Rohár	/* remove header in target kernel */
72ed407be5SPali Rohár	mov	r5, #0
73ed407be5SPali Rohár	str	r5, [r3]
74ed407be5SPali Rohár
75ed407be5SPali Rohár	/* check for valid kernel uImage */
76ed407be5SPali Rohár	ldr	r4, [r0]	/* r4 - 4 bytes header of kernel */
77ed407be5SPali Rohár	ldr	r5, ih_magic	/* r5 - IH_MAGIC */
78ed407be5SPali Rohár	cmp	r4, r5
79ed407be5SPali Rohár	bne	copy_kernel_end	/* skip if invalid image */
80ed407be5SPali Rohár
81ed407be5SPali Rohárcopy_kernel_loop:
82ed407be5SPali Rohár	ldmdb	r1!, {r3 - r10}
83ed407be5SPali Rohár	stmdb	r2!, {r3 - r10}
84ed407be5SPali Rohár	cmp	r1, r0
85ed407be5SPali Rohár	bhi	copy_kernel_loop
86ed407be5SPali Rohár
87ed407be5SPali Rohárcopy_kernel_end:
88ed407be5SPali Rohár	mov	r5, #0
89ed407be5SPali Rohár	str	r5, [r0]	/* remove 4 bytes header of kernel */
90ed407be5SPali Rohár
91ed407be5SPali Rohár
92ed407be5SPali Rohár/* Fix u-boot code */
93ed407be5SPali Rohár
94ed407be5SPali Rohárfix_start:
95ed407be5SPali Rohár	adr	r0, relocaddr	/* r0 - address of section relocaddr */
96ed407be5SPali Rohár	ldr	r1, relocaddr	/* r1 - address of relocaddr after relocation */
97ed407be5SPali Rohár	cmp	r0, r1
98ed407be5SPali Rohár
99ed407be5SPali Rohár	beq	copy_uboot_end	/* skip if u-boot is on correct address */
100ed407be5SPali Rohár
101ed407be5SPali Rohár	/* r5 - calculated offset */
102ed407be5SPali Rohár	subhi	r5, r0, r1
103ed407be5SPali Rohár	sublo	r5, r1, r0
104ed407be5SPali Rohár
105ed407be5SPali Rohár	/* r6 - maximal u-boot size */
106ed407be5SPali Rohár	ldr	r6, imagesize
107ed407be5SPali Rohár
108ed407be5SPali Rohár	/* fix return address */
109ed407be5SPali Rohár	subhi	lr, lr, r5
110ed407be5SPali Rohár	addlo	lr, lr, r5
111ed407be5SPali Rohár
112ed407be5SPali Rohár	/* r1 - start of u-boot after */
113ed407be5SPali Rohár	ldr	r1, startaddr
114ed407be5SPali Rohár
115ed407be5SPali Rohár	/* r0 - start of u-boot before */
116ed407be5SPali Rohár	addhi	r0, r1, r5
117ed407be5SPali Rohár	sublo	r0, r1, r5
118ed407be5SPali Rohár
119ed407be5SPali Rohár	/* check if we need to move uboot copy code before calling it */
120ed407be5SPali Rohár	cmp	r5, r6
121ed407be5SPali Rohár	bhi	copy_uboot_start /* now coping u-boot code directly is safe */
122ed407be5SPali Rohár
123ed407be5SPali Rohár
124ed407be5SPali Rohárcopy_code_start:
125ed407be5SPali Rohár	/* r0 - start of u-boot before */
126ed407be5SPali Rohár	/* r1 - start of u-boot after */
127ed407be5SPali Rohár	/* r6 - maximal u-boot size */
128ed407be5SPali Rohár
129ed407be5SPali Rohár	/* r7 - maximal kernel size */
130ed407be5SPali Rohár	ldr	r7, kernsize
131ed407be5SPali Rohár
132ed407be5SPali Rohár	/* r4 - end of kernel before */
133ed407be5SPali Rohár	add	r4, r0, r6
134ed407be5SPali Rohár	add	r4, r4, r7
135ed407be5SPali Rohár
136ed407be5SPali Rohár	/* r5 - end of u-boot after */
137ed407be5SPali Rohár	ldr	r5, startaddr
138ed407be5SPali Rohár	add	r5, r5, r6
139ed407be5SPali Rohár
140ed407be5SPali Rohár	/* r2 - start of loop code after */
141ed407be5SPali Rohár	cmp	r4, r5		/* higher address (r4 or r5) */
142ed407be5SPali Rohár	movhs	r2, r4
143ed407be5SPali Rohár	movlo	r2, r5
144ed407be5SPali Rohár
145ed407be5SPali Rohár	/* r3 - end of loop code before */
146ed407be5SPali Rohár	adr	r3, end
147ed407be5SPali Rohár
148ed407be5SPali Rohár	/* r4 - end of loop code after */
149ed407be5SPali Rohár	adr	r4, copy_uboot_start
150ed407be5SPali Rohár	sub	r4, r3, r4
151ed407be5SPali Rohár	add	r4, r2, r4
152ed407be5SPali Rohár
153ed407be5SPali Rohárcopy_code_loop:
154ed407be5SPali Rohár	ldmdb	r3!, {r7 - r10}
155ed407be5SPali Rohár	stmdb	r4!, {r7 - r10}
156ed407be5SPali Rohár	cmp	r4, r2
157ed407be5SPali Rohár	bhi	copy_code_loop
158ed407be5SPali Rohár
159ed407be5SPali Rohárcopy_code_end:
160ed407be5SPali Rohár	mov	pc, r2
161ed407be5SPali Rohár
162ed407be5SPali Rohár
163ed407be5SPali Rohár/* Copy u-boot to address CONFIG_SYS_TEXT_BASE */
164ed407be5SPali Rohár
165ed407be5SPali Rohárcopy_uboot_start:
166ed407be5SPali Rohár	/* r0 - start of u-boot before */
167ed407be5SPali Rohár	/* r1 - start of u-boot after */
168ed407be5SPali Rohár	/* r6 - maximal u-boot size */
169ed407be5SPali Rohár
170ed407be5SPali Rohár	/* r2 - end of u-boot after */
171ed407be5SPali Rohár	add	r2, r1, r6
172ed407be5SPali Rohár
173ed407be5SPali Rohár	/* condition for copying from left to right */
174ed407be5SPali Rohár	cmp	r0, r1
175ed407be5SPali Rohár	addlo	r1, r0, r6	/* r1 - end of u-boot before */
176ed407be5SPali Rohár	blo	copy_uboot_loop_right
177ed407be5SPali Rohár
178ed407be5SPali Rohárcopy_uboot_loop_left:
179ed407be5SPali Rohár	ldmia	r0!, {r3 - r10}
180ed407be5SPali Rohár	stmia	r1!, {r3 - r10}
181ed407be5SPali Rohár	cmp	r1, r2
182ed407be5SPali Rohár	blo	copy_uboot_loop_left
183ed407be5SPali Rohár	b	copy_uboot_end
184ed407be5SPali Rohár
185ed407be5SPali Rohárcopy_uboot_loop_right:
186ed407be5SPali Rohár	ldmdb	r1!, {r3 - r10}
187ed407be5SPali Rohár	stmdb	r2!, {r3 - r10}
188ed407be5SPali Rohár	cmp	r1, r0
189ed407be5SPali Rohár	bhi	copy_uboot_loop_right
190ed407be5SPali Rohár
191ed407be5SPali Rohárcopy_uboot_end:
192ed407be5SPali Rohár	bx	lr
193ed407be5SPali Rohár
194ed407be5SPali Rohárend:
195