Merge branch 'master' of git://git.denx.de/u-boot-mmc
[platform/kernel/u-boot.git] / arch / m68k / cpu / mcf5445x / start.S
1 /*
2  * Copyright (C) 2003   Josef Baumgartner <josef.baumgartner@telex.de>
3  * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
4  *
5  * Copyright 2010-2012 Freescale Semiconductor, Inc.
6  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  */
10
11 #include <common.h>
12 #include <asm-offsets.h>
13 #include <config.h>
14 #include <timestamp.h>
15 #include "version.h"
16 #include <asm/cache.h>
17
18 #define _START  _start
19 #define _FAULT  _fault
20
21 #define SAVE_ALL                                                \
22         move.w  #0x2700,%sr;            /* disable intrs */     \
23         subl    #60,%sp;                /* space for 15 regs */ \
24         moveml  %d0-%d7/%a0-%a6,%sp@;
25
26 #define RESTORE_ALL                                             \
27         moveml  %sp@,%d0-%d7/%a0-%a6;                           \
28         addl    #60,%sp;                /* space for 15 regs */ \
29         rte;
30
31 #if defined(CONFIG_SERIAL_BOOT)
32 #define ASM_DRAMINIT    (asm_dram_init - CONFIG_SYS_TEXT_BASE + \
33         CONFIG_SYS_INIT_RAM_ADDR)
34 #define ASM_DRAMINIT_N  (asm_dram_init - CONFIG_SYS_TEXT_BASE)
35 #define ASM_SBF_IMG_HDR (asm_sbf_img_hdr - CONFIG_SYS_TEXT_BASE + \
36         CONFIG_SYS_INIT_RAM_ADDR)
37 #endif
38
39 .text
40
41 /*
42  * Vector table. This is used for initial platform startup.
43  * These vectors are to catch any un-intended traps.
44  */
45 _vectors:
46 #if defined(CONFIG_SERIAL_BOOT)
47
48 INITSP: .long   0                       /* Initial SP   */
49 #ifdef CONFIG_CF_SBF
50 INITPC: .long   ASM_DRAMINIT            /* Initial PC   */
51 #endif
52 #ifdef CONFIG_SYS_NAND_BOOT
53 INITPC: .long   ASM_DRAMINIT_N          /* Initial PC   */
54 #endif
55
56 #else
57
58 INITSP: .long   0                       /* Initial SP   */
59 INITPC: .long   _START                  /* Initial PC   */
60
61 #endif
62
63 vector02_0F:
64 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
65 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
66
67 /* Reserved */
68 vector10_17:
69 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
70
71 vector18_1F:
72 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
73
74 #if !defined(CONFIG_SERIAL_BOOT)
75
76 /* TRAP #0 - #15 */
77 vector20_2F:
78 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
80
81 /* Reserved     */
82 vector30_3F:
83 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
84 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
85
86 vector64_127:
87 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
88 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
89 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
90 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
91 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
92 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
93 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
94 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
95
96 vector128_191:
97 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
98 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
99 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
100 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
101 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
102 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
103 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
104 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
105
106 vector192_255:
107 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
108 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
109 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
110 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
111 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
112 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
113 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
114 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
115 #endif
116
117 #if defined(CONFIG_SERIAL_BOOT)
118         /* Image header: chksum 4 bytes, len 4 bytes, img dest 4 bytes */
119 asm_sbf_img_hdr:
120         .long   0x00000000              /* checksum, not yet implemented */
121         .long   0x00040000              /* image length */
122         .long   CONFIG_SYS_TEXT_BASE    /* image to be relocated at */
123
124 asm_dram_init:
125         move.w  #0x2700,%sr             /* Mask off Interrupt */
126
127 #ifdef CONFIG_SYS_NAND_BOOT
128         /* for assembly stack */
129         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
130         movec   %d0, %RAMBAR1
131
132         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
133         clr.l   %sp@-
134 #endif
135
136 #ifdef CONFIG_CF_SBF
137         move.l  #CONFIG_SYS_INIT_RAM_ADDR, %d0
138         movec   %d0, %VBR
139
140         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
141         movec   %d0, %RAMBAR1
142
143         /* initialize general use internal ram */
144         move.l  #0, %d0
145         move.l  #(ICACHE_STATUS), %a1   /* icache */
146         move.l  #(DCACHE_STATUS), %a2   /* dcache */
147         move.l  %d0, (%a1)
148         move.l  %d0, (%a2)
149
150         /* invalidate and disable cache */
151         move.l  #(CONFIG_SYS_ICACHE_INV + CONFIG_SYS_DCACHE_INV), %d0
152         movec   %d0, %CACR              /* Invalidate cache */
153         move.l  #0, %d0
154         movec   %d0, %ACR0
155         movec   %d0, %ACR1
156         movec   %d0, %ACR2
157         movec   %d0, %ACR3
158
159         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
160         clr.l   %sp@-
161
162 #ifdef CONFIG_SYS_CS0_BASE
163         /* Must disable global address */
164         move.l  #0xFC008000, %a1
165         move.l  #(CONFIG_SYS_CS0_BASE), (%a1)
166         move.l  #0xFC008008, %a1
167         move.l  #(CONFIG_SYS_CS0_CTRL), (%a1)
168         move.l  #0xFC008004, %a1
169         move.l  #(CONFIG_SYS_CS0_MASK), (%a1)
170 #endif
171 #endif /* CONFIG_CF_SBF */
172
173 #ifdef CONFIG_MCF5441x
174         /* TC: enable all peripherals,
175         in the future only enable certain peripherals */
176         move.l  #0xFC04002D, %a1
177
178 #if defined(CONFIG_CF_SBF)
179         move.b  #23, (%a1)              /* dspi */
180 #endif
181 #endif  /* CONFIG_MCF5441x */
182
183         /* mandatory board level ddr-sdram init,
184          * for both 5441x and 5445x
185          */
186         bsr     sbf_dram_init
187
188 #ifdef CONFIG_CF_SBF
189         /*
190          * DSPI Initialization
191          * a0 - general, sram - 0x80008000 - 32, see M54455EVB.h
192          * a1 - dspi status
193          * a2 - dtfr
194          * a3 - drfr
195          * a4 - Dst addr
196          */
197         /* Enable pins for DSPI mode - chip-selects are enabled later */
198 asm_dspi_init:
199 #ifdef CONFIG_MCF5441x
200         move.l  #0xEC09404E, %a1
201         move.l  #0xEC09404F, %a2
202         move.b  #0xFF, (%a1)
203         move.b  #0x80, (%a2)
204 #endif
205
206 #ifdef CONFIG_MCF5445x
207         move.l  #0xFC0A4063, %a0
208         move.b  #0x7F, (%a0)
209 #endif
210         /* Configure DSPI module */
211         move.l  #0xFC05C000, %a0
212         move.l  #0x80FF0C00, (%a0)      /* Master, clear TX/RX FIFO */
213
214         move.l  #0xFC05C00C, %a0
215 #ifdef CONFIG_MCF5441x
216         move.l  #0x3E000016, (%a0)
217 #endif
218 #ifdef CONFIG_MCF5445x
219         move.l  #0x3E000011, (%a0)
220 #endif
221
222         move.l  #0xFC05C034, %a2        /* dtfr */
223         move.l  #0xFC05C03B, %a3        /* drfr */
224
225         move.l  #(ASM_SBF_IMG_HDR + 4), %a1
226         move.l  (%a1)+, %d5
227         move.l  (%a1), %a4
228
229         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_SBFHDR_DATA_OFFSET), %a0
230         move.l  #(CONFIG_SYS_SBFHDR_SIZE), %d4
231
232         move.l  #0xFC05C02C, %a1        /* dspi status */
233
234         /* Issue commands and address */
235         move.l  #0x8002000B, %d2        /* Fast Read Cmd */
236         jsr     asm_dspi_wr_status
237         jsr     asm_dspi_rd_status
238
239         move.l  #0x80020000, %d2        /* Address byte 2 */
240         jsr     asm_dspi_wr_status
241         jsr     asm_dspi_rd_status
242
243         move.l  #0x80020000, %d2        /* Address byte 1 */
244         jsr     asm_dspi_wr_status
245         jsr     asm_dspi_rd_status
246
247         move.l  #0x80020000, %d2        /* Address byte 0 */
248         jsr     asm_dspi_wr_status
249         jsr     asm_dspi_rd_status
250
251         move.l  #0x80020000, %d2        /* Dummy Wr and Rd */
252         jsr     asm_dspi_wr_status
253         jsr     asm_dspi_rd_status
254
255         /* Transfer serial boot header to sram */
256 asm_dspi_rd_loop1:
257         move.l  #0x80020000, %d2
258         jsr     asm_dspi_wr_status
259         jsr     asm_dspi_rd_status
260
261         move.b  %d1, (%a0)              /* read, copy to dst */
262
263         add.l   #1, %a0                 /* inc dst by 1 */
264         sub.l   #1, %d4                 /* dec cnt by 1 */
265         bne     asm_dspi_rd_loop1
266
267         /* Transfer u-boot from serial flash to memory */
268 asm_dspi_rd_loop2:
269         move.l  #0x80020000, %d2
270         jsr     asm_dspi_wr_status
271         jsr     asm_dspi_rd_status
272
273         move.b  %d1, (%a4)              /* read, copy to dst */
274
275         add.l   #1, %a4                 /* inc dst by 1 */
276         sub.l   #1, %d5                 /* dec cnt by 1 */
277         bne     asm_dspi_rd_loop2
278
279         move.l  #0x00020000, %d2        /* Terminate */
280         jsr     asm_dspi_wr_status
281         jsr     asm_dspi_rd_status
282
283         /* jump to memory and execute */
284         move.l  #(CONFIG_SYS_TEXT_BASE + 0x400), %a0
285         jmp     (%a0)
286
287 asm_dspi_wr_status:
288         move.l  (%a1), %d0              /* status */
289         and.l   #0x0000F000, %d0
290         cmp.l   #0x00003000, %d0
291         bgt     asm_dspi_wr_status
292
293         move.l  %d2, (%a2)
294         rts
295
296 asm_dspi_rd_status:
297         move.l  (%a1), %d0              /* status */
298         and.l   #0x000000F0, %d0
299         lsr.l   #4, %d0
300         cmp.l   #0, %d0
301         beq     asm_dspi_rd_status
302
303         move.b  (%a3), %d1
304         rts
305 #endif /* CONFIG_CF_SBF */
306
307 #ifdef CONFIG_SYS_NAND_BOOT
308         /* copy 4 boot pages to dram as soon as possible */
309         /* each page is 996 bytes (1056 total with 60 ECC bytes */
310         move.l  #0x00000000, %a1        /* src */
311         move.l  #CONFIG_SYS_TEXT_BASE, %a2              /* dst */
312         move.l  #0x3E0, %d0             /* sz in long */
313
314 asm_boot_nand_copy:
315         move.l  (%a1)+, (%a2)+
316         subq.l  #1, %d0
317         bne     asm_boot_nand_copy
318
319         /* jump to memory and execute */
320         move.l  #(asm_nand_init), %a0
321         jmp     (%a0)
322
323 asm_nand_init:
324         /* exit nand boot-mode */
325         move.l  #0xFC0FFF30, %a1
326         or.l    #0x00000040, %d1
327         move.l  %d1, (%a1)
328
329         /* initialize general use internal ram */
330         move.l  #0, %d0
331         move.l  #(CACR_STATUS), %a1     /* CACR */
332         move.l  #(ICACHE_STATUS), %a2   /* icache */
333         move.l  #(DCACHE_STATUS), %a3   /* dcache */
334         move.l  %d0, (%a1)
335         move.l  %d0, (%a2)
336         move.l  %d0, (%a3)
337
338         /* invalidate and disable cache */
339         move.l  #0x01004100, %d0        /* Invalidate cache cmd */
340         movec   %d0, %CACR              /* Invalidate cache */
341         move.l  #0, %d0
342         movec   %d0, %ACR0
343         movec   %d0, %ACR1
344         movec   %d0, %ACR2
345         movec   %d0, %ACR3
346
347 #ifdef CONFIG_SYS_CS0_BASE
348         /* Must disable global address */
349         move.l  #0xFC008000, %a1
350         move.l  #(CONFIG_SYS_CS0_BASE), (%a1)
351         move.l  #0xFC008008, %a1
352         move.l  #(CONFIG_SYS_CS0_CTRL), (%a1)
353         move.l  #0xFC008004, %a1
354         move.l  #(CONFIG_SYS_CS0_MASK), (%a1)
355 #endif
356
357         /* NAND port configuration */
358         move.l  #0xEC094048, %a1
359         move.b  #0xFD, (%a1)+
360         move.b  #0x5F, (%a1)+
361         move.b  #0x04, (%a1)+
362
363         /* reset nand */
364         move.l  #0xFC0FFF38, %a1        /* isr */
365         move.l  #0x000e0000, (%a1)
366         move.l  #0xFC0FFF08, %a2
367         move.l  #0x00000000, (%a2)+     /* car */
368         move.l  #0x11000000, (%a2)+     /* rar */
369         move.l  #0x00000000, (%a2)+     /* rpt */
370         move.l  #0x00000000, (%a2)+     /* rai */
371         move.l  #0xFC0FFF2c, %a2        /* cfg */
372         move.l  #0x00000000, (%a2)+     /* secsz */
373         move.l  #0x000e0681, (%a2)+
374         move.l  #0xFC0FFF04, %a2        /* cmd2 */
375         move.l  #0xFF404001, (%a2)
376         move.l  #0x000e0000, (%a1)
377
378         move.l  #0x2000, %d1
379         bsr     asm_delay
380
381         /* setup nand */
382         move.l  #0xFC0FFF00, %a1
383         move.l  #0x30700000, (%a1)+     /* cmd1 */
384         move.l  #0x007EF000, (%a1)+     /* cmd2 */
385
386         move.l  #0xFC0FFF2C, %a1
387         move.l  #0x00000841, (%a1)+     /* secsz */
388         move.l  #0x000e0681, (%a1)+     /* cfg */
389
390         move.l  #100, %d4               /* 100 pages ~200KB */
391         move.l  #4, %d2                 /* start at 4 */
392         move.l  #0xFC0FFF04, %a0        /* cmd2 */
393         move.l  #0xFC0FFF0C, %a1        /* rar */
394         move.l  #(CONFIG_SYS_TEXT_BASE + 0xF80), %a2
395
396 asm_nand_read:
397         move.l  #0x11000000, %d0        /* rar */
398         or.l    %d2, %d0
399         move.l  %d0, (%a1)
400         add.l   #1, %d2
401
402         move.l  (%a0), %d0              /* cmd2 */
403         or.l    #1, %d0
404         move.l  %d0, (%a0)
405
406         move.l  #0x200, %d1
407         bsr     asm_delay
408
409 asm_nand_chk_status:
410         move.l  #0xFC0FFF38, %a4        /* isr */
411         move.l  (%a4), %d0
412         and.l   #0x40000000, %d0
413         tst.l   %d0
414         beq     asm_nand_chk_status
415
416         move.l  #0xFC0FFF38, %a4        /* isr */
417         move.l  (%a4), %d0
418         or.l    #0x000E0000, %d0
419         move.l  %d0, (%a4)
420
421         move.l  #0x200, %d3
422         move.l  #0xFC0FC000, %a3        /* buf 1 */
423 asm_nand_copy:
424         move.l  (%a3)+, (%a2)+
425         subq.l  #1, %d3
426         bgt     asm_nand_copy
427
428         subq.l  #1, %d4
429         bgt     asm_nand_read
430
431         /* jump to memory and execute */
432         move.l  #(CONFIG_SYS_TEXT_BASE + 0x400), %a0
433         jmp     (%a0)
434
435 #endif                  /* CONFIG_SYS_NAND_BOOT */
436
437 .globl asm_delay
438 asm_delay:
439         nop
440         subq.l  #1, %d1
441         bne     asm_delay
442         rts
443 #endif                  /* CONFIG_CF_SBF || CONFIG_NAND_U_BOOT */
444
445 .text
446         . = 0x400
447 .globl _start
448 _start:
449 #if !defined(CONFIG_SERIAL_BOOT)
450         nop
451         nop
452         move.w  #0x2700,%sr             /* Mask off Interrupt */
453
454         /* Set vector base register at the beginning of the Flash */
455         move.l  #CONFIG_SYS_FLASH_BASE, %d0
456         movec   %d0, %VBR
457
458         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
459         movec   %d0, %RAMBAR1
460
461         /* initialize general use internal ram */
462         move.l  #0, %d0
463         move.l  #(ICACHE_STATUS), %a1   /* icache */
464         move.l  #(DCACHE_STATUS), %a2   /* dcache */
465         move.l  %d0, (%a1)
466         move.l  %d0, (%a2)
467
468         /* invalidate and disable cache */
469         move.l  #(CONFIG_SYS_ICACHE_INV + CONFIG_SYS_DCACHE_INV), %d0
470         movec   %d0, %CACR              /* Invalidate cache */
471         move.l  #0, %d0
472         movec   %d0, %ACR0
473         movec   %d0, %ACR1
474         movec   %d0, %ACR2
475         movec   %d0, %ACR3
476 #else
477         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
478         movec   %d0, %RAMBAR1
479 #endif
480
481         /* put relocation table address to a5 */
482         move.l  #__got_start, %a5
483
484         /* setup stack initially on top of internal static ram  */
485         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
486
487         /*
488          * if configured, malloc_f arena will be reserved first,
489          * then (and always) gd struct space will be reserved
490          */
491         move.l  %sp, -(%sp)
492         move.l  #board_init_f_alloc_reserve, %a1
493         jsr     (%a1)
494
495         /* update stack and frame-pointers */
496         move.l  %d0, %sp
497         move.l  %sp, %fp
498
499         /* initialize reserved area */
500         move.l  %d0, -(%sp)
501         move.l  #board_init_f_init_reserve, %a1
502         jsr     (%a1)
503
504         /* run low-level CPU init code (from flash) */
505         move.l  #cpu_init_f, %a1
506         jsr     (%a1)
507
508         /* run low-level board init code (from flash) */
509         clr.l   %sp@-
510         move.l  #board_init_f, %a1
511         jsr     (%a1)
512
513         /* board_init_f() does not return */
514
515 /******************************************************************************/
516
517 /*
518  * void relocate_code (addr_sp, gd, addr_moni)
519  *
520  * This "function" does not return, instead it continues in RAM
521  * after relocating the monitor code.
522  *
523  * r3 = dest
524  * r4 = src
525  * r5 = length in bytes
526  * r6 = cachelinesize
527  */
528 .globl relocate_code
529 relocate_code:
530         link.w  %a6,#0
531         move.l  8(%a6), %sp             /* set new stack pointer */
532
533         move.l  12(%a6), %d0            /* Save copy of Global Data pointer */
534         move.l  16(%a6), %a0            /* Save copy of Destination Address */
535
536         move.l  #CONFIG_SYS_MONITOR_BASE, %a1
537         move.l  #__init_end, %a2
538         move.l  %a0, %a3
539
540         /* copy the code to RAM */
541 1:
542         move.l  (%a1)+, (%a3)+
543         cmp.l   %a1,%a2
544         bgt.s   1b
545
546 /*
547  * We are done. Do not return, instead branch to second part of board
548  * initialization, now running from RAM.
549  */
550         move.l  %a0, %a1
551         add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
552         jmp     (%a1)
553
554 in_ram:
555
556 clear_bss:
557         /*
558          * Now clear BSS segment
559          */
560         move.l  %a0, %a1
561         add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
562         move.l  %a0, %d1
563         add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
564 6:
565         clr.l   (%a1)+
566         cmp.l   %a1,%d1
567         bgt.s   6b
568
569         /*
570          * fix got table in RAM
571          */
572         move.l  %a0, %a1
573         add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
574         move.l  %a1,%a5                 /* fix got pointer register a5 */
575
576         move.l  %a0, %a2
577         add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
578
579 7:
580         move.l  (%a1),%d1
581         sub.l   #_start,%d1
582         add.l   %a0,%d1
583         move.l  %d1,(%a1)+
584         cmp.l   %a2, %a1
585         bne     7b
586
587         /* calculate relative jump to board_init_r in ram */
588         move.l  %a0, %a1
589         add.l   #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
590
591         /* set parameters for board_init_r */
592         move.l  %a0,-(%sp)              /* dest_addr */
593         move.l  %d0,-(%sp)              /* gd */
594         jsr     (%a1)
595
596 /******************************************************************************/
597
598 /* exception code */
599 .globl _fault
600 _fault:
601         bra     _fault
602
603 .globl _exc_handler
604 _exc_handler:
605         SAVE_ALL
606         movel   %sp,%sp@-
607         bsr     exc_handler
608         addql   #4,%sp
609         RESTORE_ALL
610
611 .globl _int_handler
612 _int_handler:
613         SAVE_ALL
614         movel   %sp,%sp@-
615         bsr     int_handler
616         addql   #4,%sp
617         RESTORE_ALL
618
619 /******************************************************************************/
620
621 .globl version_string
622 version_string:
623 .ascii U_BOOT_VERSION_STRING, "\0"
624 .align 4