Reclaim .iram areas in DRAM by overlapping their load addresses with the uninitialize...
[kugel-rb.git] / firmware / target / coldfire / crt0.S
blobbc8a370823f6e8e6001d7bd480750c923e2dae17
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2002 by Linus Nielsen Feltzing
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18  * KIND, either express or implied.
19  *
20  ****************************************************************************/
21 #include "config.h"
22 #include "cpu.h"
24     .section .init.text,"ax",@progbits
26     .global    start
27 start:
29     move.w  #0x2700,%sr
31     move.l  #vectors,%d0
32     movec.l %d0,%vbr
33         
34     move.l  #MBAR+1,%d0
35     movec.l %d0,%mbar
36         
37     move.l  #MBAR2+1,%d0
38     movec.l %d0,%mbar2
40     lea     MBAR,%a0
41     lea     MBAR2,%a1
42         
43     clr.l  (0x180,%a1)  /* PLLCR = 0 */
45     /* 64K DMA-capable SRAM at 0x10000000
46        DMA is enabled and has priority in both banks
47        All types of accesses are allowed
48        (We might want to restrict that to save power) */
49     move.l  #0x10000e01,%d0
50     movec.l %d0,%rambar1
52     /* 32K Non-DMA SRAM at 0x10010000
53        All types of accesses are allowed
54        (We might want to restrict that to save power) */
55     move.l  #0x10010001,%d0
56     movec.l %d0,%rambar0
58     /* Chip select 0 - Flash ROM */
59     moveq.l #0x00,%d0      /* CSAR0 - Base = 0x00000000 */
60     move.l  %d0,(0x080,%a0)
61     move.l  #FLASH_SIZE-0x10000+1,%d0 /* CSMR0 - All access */
62     move.l  %d0,(0x084,%a0)
63     move.l  #0x00000180,%d0 /* CSCR0 - no wait states, 16 bits, no bursts */
64     move.l  %d0,(0x088,%a0)
65         
66 #ifndef IAUDIO_M3
67     /* Chip select 1 - LCD controller */
68     move.l  #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */
69     move.l  %d0,(0x08c,%a0)
70     moveq.l #0x1,%d0        /* CSMR1 - 64K */
71     move.l  %d0,(0x090,%a0)
72     move.l  #0x00000180,%d0 /* CSCR1 - no wait states, 16 bits, no bursts */
73     move.l  %d0,(0x094,%a0)
74 #endif
75         
76     /* Chip select 2 - ATA controller */
77     move.l  #0x20000000,%d0 /* CSAR2 - Base = 0x20000000 */
78     move.l  %d0,(0x098,%a0)
79     moveq.l #0x1,%d0        /* CSMR2 - 64K */
80     move.l  %d0,(0x09c,%a0)
81     move.l  #0x00000080,%d0 /* CSCR2 - no wait states, 16 bits, no bursts */
82     move.l  %d0,(0x0a0,%a0) /* wait states are handled by the coldfire
83                              * IDE interface logic. */
85 #if defined(CONFIG_USBOTG) && CONFIG_USBOTG == USBOTG_ISP1362
86     /* Chip select 3 - USBOTG controller */
87     move.l  #0xc0000000,%d0 /* CSAR3 - Base = 0xc0000000 */
88     move.l  %d0,(0x0a4,%a0)
89     moveq.l #0x1,%d0        /* CSMR3 - 64K */
90     move.l  %d0,(0x0a8,%a0)
91     move.l  #0x00000180,%d0 /* CSCR3 - no wait states, 16 bits, no bursts */
92     move.l  %d0,(0x0ac,%a0)
93 #endif
95 #ifdef BOOTLOADER
96     /* Check if we have a Rockbox ROM image */
97     lea     0x00100000,%a2
98     move.l  (%a2),%d0
99     move.l  #FLASH_MAGIC,%d1
100     cmp.l   %d0,%d1
101     beq.b   .imagefound
102     
103     /* Check for RAM image */
104     lea     0x00001000,%a2
105     move.l  (%a2),%d0
106     move.l  #FLASH_MAGIC,%d1
107     cmp.l   %d0,%d1
108     beq.b   .imagefound
109     
110     /* Not either ROM or RAM image was found, so original firmware
111        should be still present. */
113     /* Check if the cookie is present. */
114     lea     0x10017ffc,%a2
115     move.l  (%a2),%d0
116     move.l  #0xc0015a17,%d1
117     cmp.l   %d0,%d1
118     bne.b   .nocookie
119     
120     /* The cookie is not reset. This must mean that the boot loader
121        has crashed. Let's start the original firmware immediately. */
122     lea     0x10017ffc,%a2
123     clr.l   (%a2)
124     jmp     8
125         
126 .nocookie:
127     /* Set the cookie */
128     move.l  %d1,(%a2)
129 .imagefound:
131     /* Set up the DRAM controller. The refresh is based on the 11.2896MHz
132        clock (5.6448MHz bus frequency). We haven't yet started the PLL */
133 #if MEM < 32
134     move.w  #0x8004,%d0 /* DCR - Synchronous, 80 cycle refresh */
135 #else
136     move.w  #0x8001,%d0 /* DCR - Synchronous, 32 cycle refresh */
137 #endif
138     move.w  %d0,(0x100,%a0)
140     /* Note on 32Mbyte models:
141        We place the SDRAM on an 0x1000000 (16M) offset because
142        the 5249 BGA chip has a fault which disables the use of A24. The
143        suggested workaround by FreeScale is to offset the base address by
144        half the DRAM size and increase the mask to the double.
145        In our case this means that we set the base address 16M ahead and
146        use a 64M mask.
147     */
148 #if MEM < 32
149     move.l  #0x31002324,%d0 /* DACR0 - Base 0x31000000, Banks on 21 and up,
150                                CAS latency 2, Page mode, No refresh yet */
151     move.l  %d0,(0x108,%a0)
152     move.l  #0x00fc0001,%d0 /* Size: 16M */
153     move.l  %d0,(0x10c,%a0) /* DMR0 - 32Mb */
154 #else
155     move.l  #0x31002524,%d0 /* DACR0 - Base 0x31000000, Banks on 23 and up,
156                                CAS latency 2, Page mode, No refresh yet */
157     move.l  %d0,(0x108,%a0)
158     move.l  #0x03fc0001,%d0 /* Size: 64M because of workaround above */
159     move.l  %d0,(0x10c,%a0) /* DMR0 - 32Mb */
160 #endif
162     /* Precharge */
163     moveq.l #8,%d0
164     or.l    %d0,(0x108,%a0) /* DACR0[IP] = 1, next access will issue a
165                                Precharge command */
166     move.l  #0xabcd1234,%d0
167     move.l  %d0,0x31000000  /* Issue precharge command */
169     move.l  #0x8000,%d0
170     or.l    %d0,(0x108,%a0) /* Enable refresh */
172     /* Let it refresh */
173     move.l  #500,%d0
174 .delayloop:
175     subq.l  #1,%d0
176     bne.b   .delayloop
178     /* Mode Register init */
179     moveq.l #0x40,%d0       /* DACR0[IMRS] = 1, next access will set the
180                                Mode Register */
181     or.l    %d0,(0x108,%a0)
183     move.l  #0xabcd1234,%d0
184     move.l  %d0,0x31000800  /* A11=1 means CASL=2 (connected to SDRAM A5). */
186     /* DACR0[IMRS] gets deactivated by the SDRAM controller */
187     
188     /* Check if we have a Rockbox ROM image. For RAM image only cookie is
189        not set at all. But we could support also RAM images loading. */
190     lea     0x00100000,%a2
191     move.l  (%a2),%d0
192     move.l  #FLASH_MAGIC,%d1
193     cmp.l   %d0,%d1
194     bne.b   .noromimage
195     
196     /* Check again if the cookie is present. */
197     lea     0x10017ffc,%a2
198     move.l  (%a2),%d0
199     move.l  #0xc0015a17,%d1
200     cmp.l   %d0,%d1
201     bne.b   .nocookie2
202     
203     /* We have found Rockbox in ROM!
204        Clear the cookie and load the ROM image */
205     lea     0x10017ffc,%a2
206     clr.l   (%a2)
207     lea     0x00100028+4,%a2
208     move.l  (%a2),%sp
209     lea     0x00100028+8,%a2
210     move.l  (%a2),%d0
211     move.l  %d0,%a2
212     jmp     (%a2)
213     
214 .nocookie2:
215     /* Set the cookie */
216     move.l  %d1,(%a2)
217 .noromimage:
219 #endif /* BOOTLOADER */
221     /* Invalicate cache */
222     move.l  #0x01000000,%d0
223     movec.l %d0,%cacr
224         
225     /* Enable cache, default=non-cacheable, no buffered writes */
226     move.l  #0x80000000,%d0
227     movec.l %d0,%cacr
229     /* Cache enabled in SDRAM only, buffered writes enabled */
230     move.l  #0x3103c020,%d0
231     movec.l %d0,%acr0
232     /* Buffered writes enabled for the LCD */
233     move.l  #0xf000c060,%d0
234     movec.l %d0,%acr1
236 #ifndef BOOTLOADER
237     /* .iram copy is done first since it is reclaimed for other
238      * uninitialized sections */
240     /* copy the .iram section */
241     lea     _iramcopy,%a2
242     lea     _iramstart,%a3
243     lea     _iramend,%a4
244     bra.b   .iramstart
245 .iramloop:
246     move.l  (%a2)+,(%a3)+
247 .iramstart:
248     cmp.l   %a3,%a4
249     bhi.b   .iramloop
251     /* zero out .ibss */
252     lea     _iedata,%a2
253     lea     _iend,%a4
254     bra.b   .iedatastart
255 .iedataloop:
256     clr.l   (%a2)+
257 .iedatastart:
258     cmp.l   %a2,%a4
259     bhi.b   .iedataloop
260 #endif /* !BOOTLOADER */
262 #ifdef IRIVER_H300_SERIES
263     /* Set KEEP_ACT before doing the lengthy copy and zero-fill operations */
264     move.l #0x00080000,%d0
265     or.l %d0,(0xb4,%a1)
266     or.l %d0,(0xb8,%a1)
267     or.l %d0,(0xbc,%a1)
268 #endif
270     /* zero out bss */
271     lea     _edata,%a2
272     lea     _end,%a4
273     bra.b   .edatastart
274 .edataloop:
275     clr.l   (%a2)+
276 .edatastart:
277     cmp.l   %a2,%a4
278     bhi.b   .edataloop
280     /* copy the .data section */
281     lea     _datacopy,%a2
282     lea     _datastart,%a3
283     cmp.l   %a2,%a3
284     beq.b   .nodatacopy   /* Don't copy if src and dest are equal */
285     lea     _dataend,%a4
286     bra.b   .datastart
287 .dataloop:
288     move.l  (%a2)+,(%a3)+
289 .datastart:
290     cmp.l   %a3,%a4
291     bhi.b   .dataloop
292 .nodatacopy:
294     /* Munge the main stack */
295     lea     stackbegin,%a2
296     lea     stackend,%a4
297     move.l  %a4,%sp
298     move.l  #0xdeadbeef,%d0
299 .mungeloop:
300     move.l  %d0,(%a2)+
301     cmp.l   %a2,%a4
302     bhi.b   .mungeloop
304     jsr     main
305 .hoo:
306     bra.b   .hoo
308     .section .resetvectors
309 vectors:
310     .long   stackend
311     .long   start