xref: /rk3399_rockchip-uboot/board/nokia/rx51/lowlevel_init.S (revision 6f43ba70d15e15a08c25b3d956c70addb6740737)
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	/* r1 - start of u-boot after */
109ed407be5SPali Rohár	ldr	r1, startaddr
110ed407be5SPali Rohár
111ed407be5SPali Rohár	/* r0 - start of u-boot before */
112ed407be5SPali Rohár	addhi	r0, r1, r5
113ed407be5SPali Rohár	sublo	r0, r1, r5
114ed407be5SPali Rohár
115ed407be5SPali Rohár	/* check if we need to move uboot copy code before calling it */
116ed407be5SPali Rohár	cmp	r5, r6
117ed407be5SPali Rohár	bhi	copy_uboot_start /* now coping u-boot code directly is safe */
118ed407be5SPali Rohár
119ed407be5SPali Rohár
120ed407be5SPali Rohárcopy_code_start:
121ed407be5SPali Rohár	/* r0 - start of u-boot before */
122ed407be5SPali Rohár	/* r1 - start of u-boot after */
123ed407be5SPali Rohár	/* r6 - maximal u-boot size */
124ed407be5SPali Rohár
125ed407be5SPali Rohár	/* r7 - maximal kernel size */
126ed407be5SPali Rohár	ldr	r7, kernsize
127ed407be5SPali Rohár
128ed407be5SPali Rohár	/* r4 - end of kernel before */
129ed407be5SPali Rohár	add	r4, r0, r6
130ed407be5SPali Rohár	add	r4, r4, r7
131ed407be5SPali Rohár
132ed407be5SPali Rohár	/* r5 - end of u-boot after */
133ed407be5SPali Rohár	ldr	r5, startaddr
134ed407be5SPali Rohár	add	r5, r5, r6
135ed407be5SPali Rohár
136ed407be5SPali Rohár	/* r2 - start of loop code after */
137ed407be5SPali Rohár	cmp	r4, r5		/* higher address (r4 or r5) */
138ed407be5SPali Rohár	movhs	r2, r4
139ed407be5SPali Rohár	movlo	r2, r5
140ed407be5SPali Rohár
141ed407be5SPali Rohár	/* r3 - end of loop code before */
142ed407be5SPali Rohár	adr	r3, end
143ed407be5SPali Rohár
144ed407be5SPali Rohár	/* r4 - end of loop code after */
145ed407be5SPali Rohár	adr	r4, copy_uboot_start
146ed407be5SPali Rohár	sub	r4, r3, r4
147ed407be5SPali Rohár	add	r4, r2, r4
148ed407be5SPali Rohár
149ed407be5SPali Rohárcopy_code_loop:
150ed407be5SPali Rohár	ldmdb	r3!, {r7 - r10}
151ed407be5SPali Rohár	stmdb	r4!, {r7 - r10}
152ed407be5SPali Rohár	cmp	r4, r2
153ed407be5SPali Rohár	bhi	copy_code_loop
154ed407be5SPali Rohár
155ed407be5SPali Rohárcopy_code_end:
156ed407be5SPali Rohár	mov	pc, r2
157ed407be5SPali Rohár
158ed407be5SPali Rohár
159ed407be5SPali Rohár/* Copy u-boot to address CONFIG_SYS_TEXT_BASE */
160ed407be5SPali Rohár
161ed407be5SPali Rohárcopy_uboot_start:
162ed407be5SPali Rohár	/* r0 - start of u-boot before */
163ed407be5SPali Rohár	/* r1 - start of u-boot after */
164ed407be5SPali Rohár	/* r6 - maximal u-boot size */
165ed407be5SPali Rohár
166ed407be5SPali Rohár	/* r2 - end of u-boot after */
167ed407be5SPali Rohár	add	r2, r1, r6
168ed407be5SPali Rohár
169ed407be5SPali Rohár	/* condition for copying from left to right */
170ed407be5SPali Rohár	cmp	r0, r1
171ed407be5SPali Rohár	addlo	r1, r0, r6	/* r1 - end of u-boot before */
172ed407be5SPali Rohár	blo	copy_uboot_loop_right
173ed407be5SPali Rohár
174ed407be5SPali Rohárcopy_uboot_loop_left:
175ed407be5SPali Rohár	ldmia	r0!, {r3 - r10}
176ed407be5SPali Rohár	stmia	r1!, {r3 - r10}
177ed407be5SPali Rohár	cmp	r1, r2
178ed407be5SPali Rohár	blo	copy_uboot_loop_left
179ed407be5SPali Rohár	b	copy_uboot_end
180ed407be5SPali Rohár
181ed407be5SPali Rohárcopy_uboot_loop_right:
182ed407be5SPali Rohár	ldmdb	r1!, {r3 - r10}
183ed407be5SPali Rohár	stmdb	r2!, {r3 - r10}
184ed407be5SPali Rohár	cmp	r1, r0
185ed407be5SPali Rohár	bhi	copy_uboot_loop_right
186ed407be5SPali Rohár
187ed407be5SPali Rohárcopy_uboot_end:
188ed407be5SPali Rohár	bx	lr
189ed407be5SPali Rohár
190ed407be5SPali Rohárend:
191