~ubuntu-branches/ubuntu/maverick/u-boot-omap3/maverick

« back to all changes in this revision

Viewing changes to cpu/mcf5445x/start.S

  • Committer: Bazaar Package Importer
  • Author(s): Oliver Grawert
  • Date: 2010-03-22 15:06:23 UTC
  • Revision ID: james.westby@ubuntu.com-20100322150623-i21g8rgiyl5dohag
Tags: upstream-2010.3git20100315
ImportĀ upstreamĀ versionĀ 2010.3git20100315

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2003   Josef Baumgartner <josef.baumgartner@telex.de>
 
3
 * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
 
4
 *
 
5
 * See file CREDITS for list of people who contributed to this
 
6
 * project.
 
7
 *
 
8
 * This program is free software; you can redistribute it and/or
 
9
 * modify it under the terms of the GNU General Public License as
 
10
 * published by the Free Software Foundation; either version 2 of
 
11
 * the License, or (at your option) any later version.
 
12
 *
 
13
 * This program is distributed in the hope that it will be useful,
 
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
 * GNU General Public License for more details.
 
17
 *
 
18
 * You should have received a copy of the GNU General Public License
 
19
 * along with this program; if not, write to the Free Software
 
20
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 
21
 * MA 02111-1307 USA
 
22
 */
 
23
 
 
24
#include <config.h>
 
25
#include <timestamp.h>
 
26
#include "version.h"
 
27
 
 
28
#ifndef  CONFIG_IDENT_STRING
 
29
#define  CONFIG_IDENT_STRING ""
 
30
#endif
 
31
 
 
32
/* last three long word reserved for cache status */
 
33
#define CACR_STATUS     (CONFIG_SYS_INIT_RAM_ADDR+CONFIG_SYS_INIT_RAM_END-12)
 
34
#define ICACHE_STATUS   (CONFIG_SYS_INIT_RAM_ADDR+CONFIG_SYS_INIT_RAM_END- 8)
 
35
#define DCACHE_STATUS   (CONFIG_SYS_INIT_RAM_ADDR+CONFIG_SYS_INIT_RAM_END- 4)
 
36
 
 
37
#define _START  _start
 
38
#define _FAULT  _fault
 
39
 
 
40
#define SAVE_ALL                                                \
 
41
        move.w  #0x2700,%sr;            /* disable intrs */     \
 
42
        subl    #60,%sp;                /* space for 15 regs */ \
 
43
        moveml  %d0-%d7/%a0-%a6,%sp@;
 
44
 
 
45
#define RESTORE_ALL                                             \
 
46
        moveml  %sp@,%d0-%d7/%a0-%a6;                           \
 
47
        addl    #60,%sp;                /* space for 15 regs */ \
 
48
        rte;
 
49
 
 
50
#if defined(CONFIG_CF_SBF)
 
51
#define ASM_DRAMINIT    (asm_dram_init - TEXT_BASE + CONFIG_SYS_INIT_RAM_ADDR)
 
52
#define ASM_SBF_IMG_HDR (asm_sbf_img_hdr - TEXT_BASE + CONFIG_SYS_INIT_RAM_ADDR)
 
53
#endif
 
54
 
 
55
.text
 
56
 
 
57
/*
 
58
 *      Vector table. This is used for initial platform startup.
 
59
 *      These vectors are to catch any un-intended traps.
 
60
 */
 
61
_vectors:
 
62
#if defined(CONFIG_CF_SBF)
 
63
 
 
64
INITSP: .long   0               /* Initial SP   */
 
65
INITPC: .long   ASM_DRAMINIT    /* Initial PC   */
 
66
 
 
67
#else
 
68
 
 
69
INITSP:         .long   0       /* Initial SP   */
 
70
INITPC:         .long   _START  /* Initial PC           */
 
71
 
 
72
#endif
 
73
 
 
74
vector02:       .long   _FAULT  /* Access Error         */
 
75
vector03:       .long   _FAULT  /* Address Error        */
 
76
vector04:       .long   _FAULT  /* Illegal Instruction  */
 
77
vector05:       .long   _FAULT  /* Reserved             */
 
78
vector06:       .long   _FAULT  /* Reserved             */
 
79
vector07:       .long   _FAULT  /* Reserved             */
 
80
vector08:       .long   _FAULT  /* Privilege Violation  */
 
81
vector09:       .long   _FAULT  /* Trace                */
 
82
vector0A:       .long   _FAULT  /* Unimplemented A-Line */
 
83
vector0B:       .long   _FAULT  /* Unimplemented F-Line */
 
84
vector0C:       .long   _FAULT  /* Debug Interrupt      */
 
85
vector0D:       .long   _FAULT  /* Reserved             */
 
86
vector0E:       .long   _FAULT  /* Format Error         */
 
87
vector0F:       .long   _FAULT  /* Unitialized Int.     */
 
88
 
 
89
/* Reserved */
 
90
vector10_17:
 
91
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
92
 
 
93
vector18:       .long   _FAULT  /* Spurious Interrupt   */
 
94
vector19:       .long   _FAULT  /* Autovector Level 1   */
 
95
vector1A:       .long   _FAULT  /* Autovector Level 2   */
 
96
vector1B:       .long   _FAULT  /* Autovector Level 3   */
 
97
vector1C:       .long   _FAULT  /* Autovector Level 4   */
 
98
vector1D:       .long   _FAULT  /* Autovector Level 5   */
 
99
vector1E:       .long   _FAULT  /* Autovector Level 6   */
 
100
vector1F:       .long   _FAULT  /* Autovector Level 7   */
 
101
 
 
102
#if !defined(CONFIG_CF_SBF)
 
103
 
 
104
/* TRAP #0 - #15 */
 
105
vector20_2F:
 
106
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
107
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
108
 
 
109
/* Reserved     */
 
110
vector30_3F:
 
111
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
112
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
113
 
 
114
vector64_127:
 
115
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
116
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
117
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
118
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
119
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
120
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
121
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
122
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
123
 
 
124
vector128_191:
 
125
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
126
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
127
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
128
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
129
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
130
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
131
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
132
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
133
 
 
134
vector192_255:
 
135
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
136
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
137
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
138
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
139
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
140
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
141
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
142
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
143
#endif
 
144
 
 
145
#if defined(CONFIG_CF_SBF)
 
146
        /* Image header: chksum 4 bytes, len 4 bytes, img dest 4 bytes */
 
147
asm_sbf_img_hdr:
 
148
        .long   0x00000000      /* checksum, not yet implemented */
 
149
        .long   0x00030000      /* image length */
 
150
        .long   TEXT_BASE       /* image to be relocated at */
 
151
 
 
152
asm_dram_init:
 
153
        move.w #0x2700,%sr              /* Mask off Interrupt */
 
154
 
 
155
        move.l  #CONFIG_SYS_INIT_RAM_ADDR, %d0
 
156
        movec   %d0, %VBR
 
157
 
 
158
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
 
159
        movec   %d0, %RAMBAR1
 
160
 
 
161
        /* initialize general use internal ram */
 
162
        move.l #0, %d0
 
163
        move.l #(CACR_STATUS), %a1      /* CACR */
 
164
        move.l #(ICACHE_STATUS), %a2    /* icache */
 
165
        move.l #(DCACHE_STATUS), %a3    /* dcache */
 
166
        move.l %d0, (%a1)
 
167
        move.l %d0, (%a2)
 
168
        move.l %d0, (%a3)
 
169
 
 
170
        /* invalidate and disable cache */
 
171
        move.l  #0x01004100, %d0        /* Invalidate cache cmd */
 
172
        movec   %d0, %CACR              /* Invalidate cache */
 
173
        move.l  #0, %d0
 
174
        movec   %d0, %ACR0
 
175
        movec   %d0, %ACR1
 
176
        movec   %d0, %ACR2
 
177
        movec   %d0, %ACR3
 
178
 
 
179
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
 
180
        clr.l %sp@-
 
181
 
 
182
        /* Must disable global address */
 
183
        move.l  #0xFC008000, %a1
 
184
        move.l  #(CONFIG_SYS_CS0_BASE), (%a1)
 
185
        move.l  #0xFC008008, %a1
 
186
        move.l  #(CONFIG_SYS_CS0_CTRL), (%a1)
 
187
        move.l  #0xFC008004, %a1
 
188
        move.l  #(CONFIG_SYS_CS0_MASK), (%a1)
 
189
 
 
190
        /* Dram Initialization a1, a2, and d0 */
 
191
        /* mscr sdram */
 
192
        move.l  #0xFC0A4074, %a1
 
193
        move.b  #(CONFIG_SYS_SDRAM_DRV_STRENGTH), (%a1)
 
194
        nop
 
195
 
 
196
        /* SDRAM Chip 0 and 1 */
 
197
        move.l  #0xFC0B8110, %a1
 
198
        move.l  #0xFC0B8114, %a2
 
199
 
 
200
        /* calculate the size */
 
201
        move.l  #0x13, %d1
 
202
        move.l  #(CONFIG_SYS_SDRAM_SIZE), %d2
 
203
#ifdef CONFIG_SYS_SDRAM_BASE1
 
204
        lsr.l   #1, %d2
 
205
#endif
 
206
 
 
207
dramsz_loop:
 
208
        lsr.l   #1, %d2
 
209
        add.l   #1, %d1
 
210
        cmp.l   #1, %d2
 
211
        bne     dramsz_loop
 
212
 
 
213
        /* SDRAM Chip 0 and 1 */
 
214
        move.l  #(CONFIG_SYS_SDRAM_BASE), (%a1)
 
215
        or.l    %d1, (%a1)
 
216
#ifdef CONFIG_SYS_SDRAM_BASE1
 
217
        move.l  #(CONFIG_SYS_SDRAM_BASE1), (%a2)
 
218
        or.l    %d1, (%a2)
 
219
#endif
 
220
        nop
 
221
 
 
222
        /* dram cfg1 and cfg2 */
 
223
        move.l  #0xFC0B8008, %a1
 
224
        move.l  #(CONFIG_SYS_SDRAM_CFG1), (%a1)
 
225
        nop
 
226
        move.l  #0xFC0B800C, %a2
 
227
        move.l  #(CONFIG_SYS_SDRAM_CFG2), (%a2)
 
228
        nop
 
229
 
 
230
        move.l  #0xFC0B8000, %a1        /* Mode */
 
231
        move.l  #0xFC0B8004, %a2        /* Ctrl */
 
232
 
 
233
        /* Issue PALL */
 
234
        move.l  #(CONFIG_SYS_SDRAM_CTRL + 2), (%a2)
 
235
        nop
 
236
 
 
237
#ifdef CONFIG_M54455EVB
 
238
        /* Issue LEMR */
 
239
        move.l  #(CONFIG_SYS_SDRAM_EMOD + 0x408), (%a1)
 
240
        nop
 
241
        move.l  #(CONFIG_SYS_SDRAM_MODE + 0x300), (%a1)
 
242
        nop
 
243
#endif
 
244
 
 
245
        move.l  #1000, %d1
 
246
        jsr     asm_delay
 
247
 
 
248
        /* Issue PALL */
 
249
        move.l  #(CONFIG_SYS_SDRAM_CTRL + 2), (%a2)
 
250
        nop
 
251
 
 
252
        /* Perform two refresh cycles */
 
253
        move.l  #(CONFIG_SYS_SDRAM_CTRL + 4), %d0
 
254
        nop
 
255
        move.l  %d0, (%a2)
 
256
        move.l  %d0, (%a2)
 
257
        nop
 
258
 
 
259
#ifdef CONFIG_M54455EVB
 
260
        move.l  #(CONFIG_SYS_SDRAM_MODE + 0x200), (%a1)
 
261
        nop
 
262
#elif defined(CONFIG_M54451EVB)
 
263
        /* Issue LEMR */
 
264
        move.l  #(CONFIG_SYS_SDRAM_MODE), (%a1)
 
265
        nop
 
266
        move.l  #(CONFIG_SYS_SDRAM_EMOD), (%a1)
 
267
#endif
 
268
 
 
269
        move.l  #500, %d1
 
270
        jsr     asm_delay
 
271
 
 
272
        move.l  #(CONFIG_SYS_SDRAM_CTRL), %d1
 
273
        and.l   #0x7FFFFFFF, %d1
 
274
#ifdef CONFIG_M54455EVB
 
275
        or.l    #0x10000C00, %d1
 
276
#elif defined(CONFIG_M54451EVB)
 
277
        or.l    #0x10000C00, %d1
 
278
#endif
 
279
        move.l  %d1, (%a2)
 
280
        nop
 
281
 
 
282
        move.l  #2000, %d1
 
283
        jsr     asm_delay
 
284
 
 
285
        /*
 
286
         * DSPI Initialization
 
287
         * a0 - general, sram - 0x80008000 - 32, see M54455EVB.h
 
288
         * a1 - dspi status
 
289
         * a2 - dtfr
 
290
         * a3 - drfr
 
291
         * a4 - Dst addr
 
292
         */
 
293
        /* Enable pins for DSPI mode - chip-selects are enabled later */
 
294
asm_dspi_init:
 
295
        move.l  #0xFC0A4063, %a0
 
296
        move.b  #0x7F, (%a0)
 
297
 
 
298
        /* Configure DSPI module */
 
299
        move.l  #0xFC05C000, %a0
 
300
        move.l  #0x80FF0C00, (%a0)      /* Master, clear TX/RX FIFO */
 
301
 
 
302
        move.l  #0xFC05C00C, %a0
 
303
        move.l  #0x3E000011, (%a0)
 
304
 
 
305
        move.l  #0xFC05C034, %a2        /* dtfr */
 
306
        move.l  #0xFC05C03B, %a3        /* drfr */
 
307
 
 
308
        move.l  #(ASM_SBF_IMG_HDR + 4), %a1
 
309
        move.l  (%a1)+, %d5
 
310
        move.l  (%a1), %a4
 
311
 
 
312
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_SBFHDR_DATA_OFFSET), %a0
 
313
        move.l  #(CONFIG_SYS_SBFHDR_SIZE), %d4
 
314
 
 
315
        move.l  #0xFC05C02C, %a1        /* dspi status */
 
316
 
 
317
        /* Issue commands and address */
 
318
        move.l  #0x8002000B, %d2        /* Fast Read Cmd */
 
319
        jsr     asm_dspi_wr_status
 
320
        jsr     asm_dspi_rd_status
 
321
 
 
322
        move.l  #0x80020000, %d2        /* Address byte 2 */
 
323
        jsr     asm_dspi_wr_status
 
324
        jsr     asm_dspi_rd_status
 
325
 
 
326
        move.l  #0x80020000, %d2        /* Address byte 1 */
 
327
        jsr     asm_dspi_wr_status
 
328
        jsr     asm_dspi_rd_status
 
329
 
 
330
        move.l  #0x80020000, %d2        /* Address byte 0 */
 
331
        jsr     asm_dspi_wr_status
 
332
        jsr     asm_dspi_rd_status
 
333
 
 
334
        move.l  #0x80020000, %d2        /* Dummy Wr and Rd */
 
335
        jsr     asm_dspi_wr_status
 
336
        jsr     asm_dspi_rd_status
 
337
 
 
338
        /* Transfer serial boot header to sram */
 
339
asm_dspi_rd_loop1:
 
340
        move.l  #0x80020000, %d2
 
341
        jsr     asm_dspi_wr_status
 
342
        jsr     asm_dspi_rd_status
 
343
 
 
344
        move.b  %d1, (%a0)              /* read, copy to dst */
 
345
 
 
346
        add.l   #1, %a0                 /* inc dst by 1 */
 
347
        sub.l   #1, %d4                 /* dec cnt by 1 */
 
348
        bne     asm_dspi_rd_loop1
 
349
 
 
350
        /* Transfer u-boot from serial flash to memory */
 
351
asm_dspi_rd_loop2:
 
352
        move.l  #0x80020000, %d2
 
353
        jsr     asm_dspi_wr_status
 
354
        jsr     asm_dspi_rd_status
 
355
 
 
356
        move.b  %d1, (%a4)              /* read, copy to dst */
 
357
 
 
358
        add.l   #1, %a4                 /* inc dst by 1 */
 
359
        sub.l   #1, %d5                 /* dec cnt by 1 */
 
360
        bne     asm_dspi_rd_loop2
 
361
 
 
362
        move.l  #0x00020000, %d2        /* Terminate */
 
363
        jsr     asm_dspi_wr_status
 
364
        jsr     asm_dspi_rd_status
 
365
 
 
366
        /* jump to memory and execute */
 
367
        move.l  #(TEXT_BASE + 0x400), %a0
 
368
        jmp     (%a0)
 
369
 
 
370
asm_dspi_wr_status:
 
371
        move.l  (%a1), %d0              /* status */
 
372
        and.l   #0x0000F000, %d0
 
373
        cmp.l   #0x00003000, %d0
 
374
        bgt     asm_dspi_wr_status
 
375
 
 
376
        move.l  %d2, (%a2)
 
377
        rts
 
378
 
 
379
asm_dspi_rd_status:
 
380
        move.l  (%a1), %d0              /* status */
 
381
        and.l   #0x000000F0, %d0
 
382
        lsr.l   #4, %d0
 
383
        cmp.l   #0, %d0
 
384
        beq     asm_dspi_rd_status
 
385
 
 
386
        move.b  (%a3), %d1
 
387
        rts
 
388
 
 
389
asm_delay:
 
390
        nop
 
391
        subq.l  #1, %d1
 
392
        bne     asm_delay
 
393
        rts
 
394
#endif                  /* CONFIG_CF_SBF */
 
395
 
 
396
        .text
 
397
        . = 0x400
 
398
        .globl  _start
 
399
_start:
 
400
#if !defined(CONFIG_CF_SBF)
 
401
        nop
 
402
        nop
 
403
        move.w #0x2700,%sr              /* Mask off Interrupt */
 
404
 
 
405
        /* Set vector base register at the beginning of the Flash */
 
406
        move.l  #CONFIG_SYS_FLASH_BASE, %d0
 
407
        movec   %d0, %VBR
 
408
 
 
409
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
 
410
        movec   %d0, %RAMBAR1
 
411
 
 
412
        /* initialize general use internal ram */
 
413
        move.l #0, %d0
 
414
        move.l #(CACR_STATUS), %a1      /* CACR */
 
415
        move.l #(ICACHE_STATUS), %a2    /* icache */
 
416
        move.l #(DCACHE_STATUS), %a3    /* dcache */
 
417
        move.l %d0, (%a1)
 
418
        move.l %d0, (%a2)
 
419
        move.l %d0, (%a3)
 
420
 
 
421
        /* invalidate and disable cache */
 
422
        move.l  #0x01004100, %d0        /* Invalidate cache cmd */
 
423
        movec   %d0, %CACR              /* Invalidate cache */
 
424
        move.l  #0, %d0
 
425
        movec   %d0, %ACR0
 
426
        movec   %d0, %ACR1
 
427
        movec   %d0, %ACR2
 
428
        movec   %d0, %ACR3
 
429
 
 
430
        /* set stackpointer to end of internal ram to get some stackspace for
 
431
           the first c-code */
 
432
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
 
433
        clr.l %sp@-
 
434
#endif
 
435
 
 
436
        move.l #__got_start, %a5        /* put relocation table address to a5 */
 
437
 
 
438
        bsr cpu_init_f                  /* run low-level CPU init code (from flash) */
 
439
        bsr board_init_f                /* run low-level board init code (from flash) */
 
440
 
 
441
        /* board_init_f() does not return */
 
442
 
 
443
/*------------------------------------------------------------------------------*/
 
444
 
 
445
/*
 
446
 * void relocate_code (addr_sp, gd, addr_moni)
 
447
 *
 
448
 * This "function" does not return, instead it continues in RAM
 
449
 * after relocating the monitor code.
 
450
 *
 
451
 * r3 = dest
 
452
 * r4 = src
 
453
 * r5 = length in bytes
 
454
 * r6 = cachelinesize
 
455
 */
 
456
        .globl  relocate_code
 
457
relocate_code:
 
458
        link.w %a6,#0
 
459
        move.l 8(%a6), %sp              /* set new stack pointer */
 
460
 
 
461
        move.l 12(%a6), %d0             /* Save copy of Global Data pointer */
 
462
        move.l 16(%a6), %a0             /* Save copy of Destination Address */
 
463
 
 
464
        move.l #CONFIG_SYS_MONITOR_BASE, %a1
 
465
        move.l #__init_end, %a2
 
466
        move.l %a0, %a3
 
467
 
 
468
        /* copy the code to RAM */
 
469
1:
 
470
        move.l (%a1)+, (%a3)+
 
471
        cmp.l  %a1,%a2
 
472
        bgt.s    1b
 
473
 
 
474
/*
 
475
 * We are done. Do not return, instead branch to second part of board
 
476
 * initialization, now running from RAM.
 
477
 */
 
478
        move.l  %a0, %a1
 
479
        add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
 
480
        jmp     (%a1)
 
481
 
 
482
in_ram:
 
483
 
 
484
clear_bss:
 
485
        /*
 
486
         * Now clear BSS segment
 
487
         */
 
488
        move.l  %a0, %a1
 
489
        add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
 
490
        move.l  %a0, %d1
 
491
        add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
 
492
6:
 
493
        clr.l   (%a1)+
 
494
        cmp.l   %a1,%d1
 
495
        bgt.s   6b
 
496
 
 
497
        /*
 
498
         * fix got table in RAM
 
499
         */
 
500
        move.l  %a0, %a1
 
501
        add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
 
502
        move.l  %a1,%a5                 /* * fix got pointer register a5 */
 
503
 
 
504
        move.l  %a0, %a2
 
505
        add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
 
506
 
 
507
7:
 
508
        move.l  (%a1),%d1
 
509
        sub.l   #_start,%d1
 
510
        add.l   %a0,%d1
 
511
        move.l  %d1,(%a1)+
 
512
        cmp.l   %a2, %a1
 
513
        bne     7b
 
514
 
 
515
        /* calculate relative jump to board_init_r in ram */
 
516
        move.l %a0, %a1
 
517
        add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
 
518
 
 
519
        /* set parameters for board_init_r */
 
520
        move.l %a0,-(%sp)               /* dest_addr */
 
521
        move.l %d0,-(%sp)               /* gd */
 
522
        jsr     (%a1)
 
523
 
 
524
/*------------------------------------------------------------------------------*/
 
525
/* exception code */
 
526
        .globl _fault
 
527
_fault:
 
528
        bra _fault
 
529
        .globl  _exc_handler
 
530
 
 
531
_exc_handler:
 
532
        SAVE_ALL
 
533
        movel   %sp,%sp@-
 
534
        bsr exc_handler
 
535
        addql   #4,%sp
 
536
        RESTORE_ALL
 
537
 
 
538
        .globl  _int_handler
 
539
_int_handler:
 
540
        SAVE_ALL
 
541
        movel   %sp,%sp@-
 
542
        bsr int_handler
 
543
        addql   #4,%sp
 
544
        RESTORE_ALL
 
545
 
 
546
/*------------------------------------------------------------------------------*/
 
547
/* cache functions */
 
548
        .globl  icache_enable
 
549
icache_enable:
 
550
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
551
        move.l  (%a1), %d1
 
552
 
 
553
        move.l  #0x00040100, %d0        /* Invalidate icache */
 
554
        movec   %d0, %CACR
 
555
 
 
556
        move.l  #(CONFIG_SYS_SDRAM_BASE + 0xC000), %d0  /* Setup icache */
 
557
        movec   %d0, %ACR2
 
558
 
 
559
        move.l  #0x04088020, %d0        /* Enable bcache and icache */
 
560
        movec   %d0, %CACR
 
561
 
 
562
        move.l #(ICACHE_STATUS), %a1
 
563
        moveq   #1, %d0
 
564
        move.l  %d0, (%a1)
 
565
        rts
 
566
 
 
567
        .globl  icache_disable
 
568
icache_disable:
 
569
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
570
        move.l  (%a1), %d0
 
571
 
 
572
        move.l  #0xFFF77BFF, %d0
 
573
        or.l    #0x00040100, %d0        /* Setup cache mask */
 
574
        movec   %d0, %CACR              /* Invalidate icache */
 
575
        clr.l   %d0
 
576
        movec   %d0, %ACR2
 
577
        movec   %d0, %ACR3
 
578
 
 
579
        move.l #(ICACHE_STATUS), %a1
 
580
        moveq   #0, %d0
 
581
        move.l  %d0, (%a1)
 
582
        rts
 
583
 
 
584
        .globl  icache_status
 
585
icache_status:
 
586
        move.l #(ICACHE_STATUS), %a1
 
587
        move.l  (%a1), %d0
 
588
        rts
 
589
 
 
590
        .globl  icache_invalid
 
591
icache_invalid:
 
592
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
593
        move.l  (%a1), %d0
 
594
 
 
595
        move.l  #0x00040100, %d0        /* Invalidate icache */
 
596
        movec   %d0, %CACR              /* Enable and invalidate cache */
 
597
        rts
 
598
 
 
599
        .globl  dcache_enable
 
600
dcache_enable:
 
601
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
602
        move.l  (%a1), %d1
 
603
 
 
604
        move.l  #0x01040100, %d0
 
605
        movec   %d0, %CACR              /* Invalidate dcache */
 
606
 
 
607
        move.l  #0x80088020, %d0        /* Enable bcache and icache */
 
608
        movec   %d0, %CACR
 
609
 
 
610
        move.l #(DCACHE_STATUS), %a1
 
611
        moveq   #1, %d0
 
612
        move.l  %d0, (%a1)
 
613
        rts
 
614
 
 
615
        .globl  dcache_disable
 
616
dcache_disable:
 
617
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
618
        move.l  (%a1), %d0
 
619
 
 
620
        and.l   #0x7FFFFFFF, %d0
 
621
        or.l    #0x01000000, %d0        /* Setup cache mask */
 
622
        movec   %d0, %CACR              /* Disable dcache */
 
623
        clr.l   %d0
 
624
        movec   %d0, %ACR0
 
625
        movec   %d0, %ACR1
 
626
 
 
627
        move.l #(DCACHE_STATUS), %a1
 
628
        moveq   #0, %d0
 
629
        move.l  %d0, (%a1)
 
630
        rts
 
631
 
 
632
        .globl  dcache_invalid
 
633
dcache_invalid:
 
634
        move.l #(CACR_STATUS), %a1      /* read CACR Status */
 
635
        move.l  (%a1), %d0
 
636
 
 
637
        move.l  #0x81088020, %d0        /* Setup cache mask */
 
638
        movec   %d0, %CACR              /* Enable and invalidate cache */
 
639
        rts
 
640
 
 
641
        .globl  dcache_status
 
642
dcache_status:
 
643
        move.l #(DCACHE_STATUS), %a1
 
644
        move.l  (%a1), %d0
 
645
        rts
 
646
 
 
647
/*------------------------------------------------------------------------------*/
 
648
 
 
649
        .globl  version_string
 
650
version_string:
 
651
        .ascii U_BOOT_VERSION
 
652
        .ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
 
653
        .ascii CONFIG_IDENT_STRING, "\0"
 
654
        .align 4