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