deadbat-alternate.patch
[u-boot-openmoko/mini2440.git] / board / dbau1x00 / lowlevel_init.S
blob14a78465f3659a0420bc18e42c3a5b85e2243315
1 /* Memory sub-system initialization code */
3 #include <config.h>
4 #include <version.h>
5 #include <asm/regdef.h>
6 #include <asm/au1x00.h>
7 #include <asm/mipsregs.h>
9 #define AU1500_SYS_ADDR         0xB1900000
10 #define sys_endian              0x0038
11 #define CP0_Config0             $16
12 #define CPU_SCALE               ((CFG_MHZ) / 12) /* CPU clock is a multiple of 12 MHz */
13 #define MEM_1MS                 ((CFG_MHZ) * 1000)
15         .text
16         .set noreorder
17         .set mips32
19         .globl  lowlevel_init
20 lowlevel_init:
21         /*
22          * Step 1) Establish CPU endian mode.
23          * Db1500-specific:
24          * Switch S1.1 Off(bit7 reads 1) is Little Endian
25          * Switch S1.1 On (bit7 reads 0) is Big Endian
26          */
27 #ifdef CONFIG_DBAU1550
28         li      t0, MEM_STCFG2
29         li      t1, 0x00000040
30         sw      t1, 0(t0)
32         li      t0, MEM_STTIME2
33         li      t1, 0x22080a20
34         sw      t1, 0(t0)
36         li      t0, MEM_STADDR2
37         li      t1, 0x10c03f00
38         sw      t1, 0(t0)
39 #else
40         li      t0, MEM_STCFG1
41         li      t1, 0x00000080
42         sw      t1, 0(t0)
44         li      t0, MEM_STTIME1
45         li      t1, 0x22080a20
46         sw      t1, 0(t0)
48         li      t0, MEM_STADDR1
49         li      t1, 0x10c03f00
50         sw      t1, 0(t0)
51 #endif
53         li      t0, DB1XX0_BCSR_ADDR
54         lw      t1,8(t0)
55         andi    t1,t1,0x80
56         beq     zero,t1,big_endian
57         nop
58 little_endian:
60         /* Change Au1 core to little endian */
61         li      t0, AU1500_SYS_ADDR
62         li      t1, 1
63         sw      t1, sys_endian(t0)
64         mfc0    t2, CP0_CONFIG
65         mtc0    t2, CP0_CONFIG
66         nop
67         nop
69         /* Big Endian is default so nothing to do but fall through */
71 big_endian:
73         /*
74          * Step 2) Establish Status Register
75          * (set BEV, clear ERL, clear EXL, clear IE)
76          */
77         li      t1, 0x00400000
78         mtc0    t1, CP0_STATUS
80         /*
81          * Step 3) Establish CP0 Config0
82          * (set OD, set K0=3)
83          */
84         li      t1, 0x00080003
85         mtc0    t1, CP0_CONFIG
87         /*
88          * Step 4) Disable Watchpoint facilities
89          */
90         li t1, 0x00000000
91         mtc0    t1, CP0_WATCHLO
92         mtc0    t1, CP0_IWATCHLO
93         /*
94          * Step 5) Disable the performance counters
95          */
96         mtc0    zero, CP0_PERFORMANCE
97         nop
99         /*
100          * Step 6) Establish EJTAG Debug register
101          */
102         mtc0    zero, CP0_DEBUG
103         nop
105         /*
106          * Step 7) Establish Cause
107          * (set IV bit)
108          */
109         li      t1, 0x00800000
110         mtc0    t1, CP0_CAUSE
112         /* Establish Wired (and Random) */
113         mtc0    zero, CP0_WIRED
114         nop
116 #ifdef CONFIG_DBAU1550
117         /* No workaround if running from ram */
118         lui     t0, 0xffc0
119         lui     t3, 0xbfc0
120         and     t1, ra, t0
121         bne     t1, t3, noCacheJump
122         nop
124         /*** From AMD YAMON ***/
125         /*
126          * Step 8) Initialize the caches
127          */
128         li              t0, (16*1024)
129         li              t1, 32
130         li              t2, 0x80000000
131         addu    t3, t0, t2
132 cacheloop:
133         cache   0, 0(t2)
134         cache   1, 0(t2)
135         addu    t2, t1
136         bne             t2, t3, cacheloop
137         nop
139         /* Save return address */
140         move            t3, ra
142         /* Run from cacheable space now */
143         bal             cachehere
144         nop
145 cachehere:
146         li              t1, ~0x20000000 /* convert to KSEG0 */
147         and             t0, ra, t1
148         addi    t0, 5*4                 /* 5 insns beyond cachehere */
149         jr              t0
150         nop
152         /* Restore return address */
153         move            ra, t3
155         /*
156          * Step 9) Initialize the TLB
157          */
158         li              t0, 0                   # index value
159         li              t1, 0x00000000          # entryhi value
160         li              t2, 32                  # 32 entries
162 tlbloop:
163         /* Probe TLB for matching EntryHi */
164         mtc0    t1, CP0_ENTRYHI
165         tlbp
166         nop
168         /* Examine Index[P], 1=no matching entry */
169         mfc0    t3, CP0_INDEX
170         li      t4, 0x80000000
171         and     t3, t4, t3
172         addiu   t1, t1, 1               # increment t1 (asid)
173         beq     zero, t3, tlbloop
174         nop
176         /* Initialize the TLB entry */
177         mtc0    t0, CP0_INDEX
178         mtc0    zero, CP0_ENTRYLO0
179         mtc0    zero, CP0_ENTRYLO1
180         mtc0    zero, CP0_PAGEMASK
181         tlbwi
183         /* Do it again */
184         addiu   t0, t0, 1
185         bne     t0, t2, tlbloop
186         nop
188 #endif /* CONFIG_DBAU1550 */
190         /* First setup pll:s to make serial work ok */
191         /* We have a 12 MHz crystal */
192         li      t0, SYS_CPUPLL
193         li      t1, CPU_SCALE  /* CPU clock */
194         sw      t1, 0(t0)
195         sync
196         nop
197         nop
199         /* wait 1mS for clocks to settle */
200         li      t1, MEM_1MS
201 1:      add     t1, -1
202         bne     t1, zero, 1b
203         nop
204         /* Setup AUX PLL */
205         li      t0, SYS_AUXPLL
206         li      t1, 0x20 /* 96 MHz */
207         sw      t1, 0(t0) /* aux pll */
208         sync
210 #ifdef CONFIG_DBAU1550
211         /*  Static memory controller */
212         /* RCE0 - can not change while fetching, do so from icache */
213         move            t2, ra /* Store return address */
214         bal             getAddr
215         nop
217 getAddr:
218         move            t1, ra
219         move            ra, t2 /* Move return addess back */
221         cache   0x14,0(t1)
222         cache   0x14,32(t1)
223         /*** /From YAMON ***/
225 noCacheJump:
226 #endif /* CONFIG_DBAU1550 */
228 #ifdef CONFIG_DBAU1550
229         li      t0, MEM_STTIME0
230         li      t1, 0x040181D7
231         sw      t1, 0(t0)
233         /* RCE0 AMD MirrorBit Flash (?) */
234         li      t0, MEM_STCFG0
235         li      t1, 0x00000003
236         sw      t1, 0(t0)
238         li      t0, MEM_STADDR0
239         li      t1, 0x11803E00
240         sw      t1, 0(t0)
241 #else /* CONFIG_DBAU1550 */
242         li      t0, MEM_STTIME0
243         li      t1, 0x040181D7
244         sw      t1, 0(t0)
246         /* RCE0 AMD 29LV640M MirrorBit Flash */
247         li      t0, MEM_STCFG0
248         li      t1, 0x00000013
249         sw      t1, 0(t0)
251         li      t0, MEM_STADDR0
252         li      t1, 0x11E03F80
253         sw      t1, 0(t0)
254 #endif /* CONFIG_DBAU1550 */
256         /* RCE1 CPLD Board Logic */
257         li      t0, MEM_STCFG1
258         li      t1, 0x00000080
259         sw      t1, 0(t0)
261         li      t0, MEM_STTIME1
262         li      t1, 0x22080a20
263         sw      t1, 0(t0)
265         li      t0, MEM_STADDR1
266         li      t1, 0x10c03f00
267         sw      t1, 0(t0)
269 #ifdef CONFIG_DBAU1550
270         /* RCE2 CPLD Board Logic */
271         li      t0, MEM_STCFG2
272         li      t1, 0x00000040
273         sw      t1, 0(t0)
275         li      t0, MEM_STTIME2
276         li      t1, 0x22080a20
277         sw      t1, 0(t0)
279         li      t0, MEM_STADDR2
280         li      t1, 0x10c03f00
281         sw      t1, 0(t0)
282 #else
283         li      t0, MEM_STCFG2
284         li      t1, 0x00000000
285         sw      t1, 0(t0)
287         li      t0, MEM_STTIME2
288         li      t1, 0x00000000
289         sw      t1, 0(t0)
291         li      t0, MEM_STADDR2
292         li      t1, 0x00000000
293         sw      t1, 0(t0)
294 #endif
296         /* RCE3 PCMCIA 250ns */
297         li      t0, MEM_STCFG3
298         li      t1, 0x00000002
299         sw      t1, 0(t0)
301         li      t0, MEM_STTIME3
302         li      t1, 0x280E3E07
303         sw      t1, 0(t0)
305         li      t0, MEM_STADDR3
306         li      t1, 0x10000000
307         sw      t1, 0(t0)
309         sync
311         /* Set peripherals to a known state */
312         li      t0, IC0_CFG0CLR
313         li      t1, 0xFFFFFFFF
314         sw      t1, 0(t0)
316         li      t0, IC0_CFG0CLR
317         sw      t1, 0(t0)
319         li      t0, IC0_CFG1CLR
320         sw      t1, 0(t0)
322         li      t0, IC0_CFG2CLR
323         sw      t1, 0(t0)
325         li      t0, IC0_SRCSET
326         sw      t1, 0(t0)
328         li      t0, IC0_ASSIGNSET
329         sw      t1, 0(t0)
331         li      t0, IC0_WAKECLR
332         sw      t1, 0(t0)
334         li      t0, IC0_RISINGCLR
335         sw      t1, 0(t0)
337         li      t0, IC0_FALLINGCLR
338         sw      t1, 0(t0)
340         li      t0, IC0_TESTBIT
341         li      t1, 0x00000000
342         sw      t1, 0(t0)
343         sync
345         li      t0, IC1_CFG0CLR
346         li      t1, 0xFFFFFFFF
347         sw      t1, 0(t0)
349         li      t0, IC1_CFG0CLR
350         sw      t1, 0(t0)
352         li      t0, IC1_CFG1CLR
353         sw      t1, 0(t0)
355         li      t0, IC1_CFG2CLR
356         sw      t1, 0(t0)
358         li      t0, IC1_SRCSET
359         sw      t1, 0(t0)
361         li      t0, IC1_ASSIGNSET
362         sw      t1, 0(t0)
364         li      t0, IC1_WAKECLR
365         sw      t1, 0(t0)
367         li      t0, IC1_RISINGCLR
368         sw      t1, 0(t0)
370         li      t0, IC1_FALLINGCLR
371         sw      t1, 0(t0)
373         li      t0, IC1_TESTBIT
374         li      t1, 0x00000000
375         sw      t1, 0(t0)
376         sync
378         li      t0, SYS_FREQCTRL0
379         li      t1, 0x00000000
380         sw      t1, 0(t0)
382         li      t0, SYS_FREQCTRL1
383         li      t1, 0x00000000
384         sw      t1, 0(t0)
386         li      t0, SYS_CLKSRC
387         li      t1, 0x00000000
388         sw      t1, 0(t0)
390         li      t0, SYS_PININPUTEN
391         li      t1, 0x00000000
392         sw      t1, 0(t0)
393         sync
395         li      t0, 0xB1100100
396         li      t1, 0x00000000
397         sw      t1, 0(t0)
399         li      t0, 0xB1400100
400         li      t1, 0x00000000
401         sw      t1, 0(t0)
404         li      t0, SYS_WAKEMSK
405         li      t1, 0x00000000
406         sw      t1, 0(t0)
408         li      t0, SYS_WAKESRC
409         li      t1, 0x00000000
410         sw      t1, 0(t0)
412         /* wait 1mS before setup */
413         li      t1, MEM_1MS
414 1:      add     t1, -1
415         bne     t1, zero, 1b
416         nop
418 #ifdef CONFIG_DBAU1550
419 /* SDCS 0,1,2 DDR SDRAM */
420         li      t0, MEM_SDMODE0
421         li      t1, 0x04276221
422         sw      t1, 0(t0)
424         li      t0, MEM_SDMODE1
425         li      t1, 0x04276221
426         sw      t1, 0(t0)
428         li      t0, MEM_SDMODE2
429         li      t1, 0x04276221
430         sw      t1, 0(t0)
432         li      t0, MEM_SDADDR0
433         li      t1, 0xe21003f0
434         sw      t1, 0(t0)
436         li      t0, MEM_SDADDR1
437         li      t1, 0xe21043f0
438         sw      t1, 0(t0)
440         li      t0, MEM_SDADDR2
441         li      t1, 0xe21083f0
442         sw      t1, 0(t0)
444         sync
446         li      t0, MEM_SDCONFIGA
447         li      t1, 0x9030060a /* Program refresh - disabled */
448         sw      t1, 0(t0)
449         sync
451         li      t0, MEM_SDCONFIGB
452         li      t1, 0x00028000
453         sw      t1, 0(t0)
454         sync
456         li      t0, MEM_SDPRECMD /* Precharge all */
457         li      t1, 0
458         sw      t1, 0(t0)
459         sync
461         li      t0, MEM_SDWRMD0
462         li      t1, 0x40000000
463         sw      t1, 0(t0)
464         sync
466         li      t0, MEM_SDWRMD1
467         li      t1, 0x40000000
468         sw      t1, 0(t0)
469         sync
471         li      t0, MEM_SDWRMD2
472         li      t1, 0x40000000
473         sw      t1, 0(t0)
474         sync
476         li      t0, MEM_SDWRMD0
477         li      t1, 0x00000063
478         sw      t1, 0(t0)
479         sync
481         li      t0, MEM_SDWRMD1
482         li      t1, 0x00000063
483         sw      t1, 0(t0)
484         sync
486         li      t0, MEM_SDWRMD2
487         li      t1, 0x00000063
488         sw      t1, 0(t0)
489         sync
491         li      t0, MEM_SDPRECMD /* Precharge all */
492         sw      zero, 0(t0)
493         sync
495         /* Issue 2 autoref */
496         li      t0, MEM_SDAUTOREF
497         sw      zero, 0(t0)
498         sync
500         li      t0, MEM_SDAUTOREF
501         sw      zero, 0(t0)
502         sync
504         /* Enable refresh */
505         li      t0, MEM_SDCONFIGA
506         li      t1, 0x9830060a /* Program refresh - enabled */
507         sw      t1, 0(t0)
508         sync
510 #else /* CONFIG_DBAU1550 */
511 /* SDCS 0,1 SDRAM */
512         li      t0, MEM_SDMODE0
513         li      t1, 0x005522AA
514         sw      t1, 0(t0)
516         li      t0, MEM_SDMODE1
517         li      t1, 0x005522AA
518         sw      t1, 0(t0)
520         li      t0, MEM_SDMODE2
521         li      t1, 0x00000000
522         sw      t1, 0(t0)
524         li      t0, MEM_SDADDR0
525         li      t1, 0x001003F8
526         sw      t1, 0(t0)
529         li      t0, MEM_SDADDR1
530         li      t1, 0x001023F8
531         sw      t1, 0(t0)
533         li      t0, MEM_SDADDR2
534         li      t1, 0x00000000
535         sw      t1, 0(t0)
537         sync
539         li      t0, MEM_SDREFCFG
540         li      t1, 0x64000C24 /* Disable */
541         sw      t1, 0(t0)
542         sync
544         li      t0, MEM_SDPRECMD
545         sw      zero, 0(t0)
546         sync
548         li      t0, MEM_SDAUTOREF
549         sw      zero, 0(t0)
550         sync
551         sw      zero, 0(t0)
552         sync
554         li      t0, MEM_SDREFCFG
555         li      t1, 0x66000C24 /* Enable */
556         sw      t1, 0(t0)
557         sync
559         li      t0, MEM_SDWRMD0
560         li      t1, 0x00000033
561         sw      t1, 0(t0)
562         sync
564         li      t0, MEM_SDWRMD1
565         li      t1, 0x00000033
566         sw      t1, 0(t0)
567         sync
569 #endif /* CONFIG_DBAU1550 */
570         /* wait 1mS after setup */
571         li      t1, MEM_1MS
572 1:      add     t1, -1
573         bne     t1, zero, 1b
574         nop
576         li      t0, SYS_PINFUNC
577         li      t1, 0x00008080
578         sw      t1, 0(t0)
580         li      t0, SYS_TRIOUTCLR
581         li      t1, 0x00001FFF
582         sw      t1, 0(t0)
584         li      t0, SYS_OUTPUTCLR
585         li      t1, 0x00008000
586         sw      t1, 0(t0)
587         sync
589         j       ra
590         nop