xref: /OK3568_Linux_fs/u-boot/board/pb1x00/lowlevel_init.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* Memory sub-system initialization code */
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun#include <config.h>
4*4882a593Smuzhiyun#include <mach/au1x00.h>
5*4882a593Smuzhiyun#include <asm/regdef.h>
6*4882a593Smuzhiyun#include <asm/mipsregs.h>
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#define AU1500_SYS_ADDR		0xB1900000
9*4882a593Smuzhiyun#define sys_endian		0x0038
10*4882a593Smuzhiyun#define CP0_Config0		$16
11*4882a593Smuzhiyun#define MEM_1MS			((396000000/1000000) * 1000)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun	.text
14*4882a593Smuzhiyun	.set noreorder
15*4882a593Smuzhiyun	.set mips32
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun	.globl	lowlevel_init
18*4882a593Smuzhiyunlowlevel_init:
19*4882a593Smuzhiyun	/*
20*4882a593Smuzhiyun	 * Step 1) Establish CPU endian mode.
21*4882a593Smuzhiyun	 * NOTE: A fair amount of code is necessary on the Pb1000 to
22*4882a593Smuzhiyun	 * obtain the value of Switch S8.1 which is used to determine
23*4882a593Smuzhiyun	 * endian at run-time.
24*4882a593Smuzhiyun	 */
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	/* RCE1 */
27*4882a593Smuzhiyun	li		t0, MEM_STCFG1
28*4882a593Smuzhiyun	li		t1, 0x00000083
29*4882a593Smuzhiyun	sw		t1, 0(t0)
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun	li		t0, MEM_STTIME1
32*4882a593Smuzhiyun	li		t1, 0x33030A10
33*4882a593Smuzhiyun	sw		t1, 0(t0)
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun	li		t0, MEM_STADDR1
36*4882a593Smuzhiyun	li		t1, 0x11803E40
37*4882a593Smuzhiyun	sw		t1, 0(t0)
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	/* Set DSTRB bits so switch will read correctly */
40*4882a593Smuzhiyun	li		t1, 0xBE00000C
41*4882a593Smuzhiyun	lw		t2, 0(t1)
42*4882a593Smuzhiyun	or		t2, t2, 0x00000300
43*4882a593Smuzhiyun	sw		t2, 0(t1)
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	/* Check switch setting */
46*4882a593Smuzhiyun	li		t1, 0xBE000014
47*4882a593Smuzhiyun	lw		t2, 0(t1)
48*4882a593Smuzhiyun	and		t2, t2, 0x00000100
49*4882a593Smuzhiyun	bne		t2, zero, big_endian
50*4882a593Smuzhiyun	nop
51*4882a593Smuzhiyun
52*4882a593Smuzhiyunlittle_endian:
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun	/* Change Au1 core to little endian */
55*4882a593Smuzhiyun	li	t0, AU1500_SYS_ADDR
56*4882a593Smuzhiyun	li	t1, 1
57*4882a593Smuzhiyun	sw	t1, sys_endian(t0)
58*4882a593Smuzhiyun	mfc0	t2, CP0_CONFIG
59*4882a593Smuzhiyun	mtc0	t2, CP0_CONFIG
60*4882a593Smuzhiyun	nop
61*4882a593Smuzhiyun	nop
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	/* Big Endian is default so nothing to do but fall through */
64*4882a593Smuzhiyun
65*4882a593Smuzhiyunbig_endian:
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun	/*
68*4882a593Smuzhiyun	 * Step 2) Establish Status Register
69*4882a593Smuzhiyun	 * (set BEV, clear ERL, clear EXL, clear IE)
70*4882a593Smuzhiyun	 */
71*4882a593Smuzhiyun	li	t1, 0x00400000
72*4882a593Smuzhiyun	mtc0	t1, CP0_STATUS
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun	/*
75*4882a593Smuzhiyun	 * Step 3) Establish CP0 Config0
76*4882a593Smuzhiyun	 * (set OD, set K0=3)
77*4882a593Smuzhiyun	 */
78*4882a593Smuzhiyun	li	t1, 0x00080003
79*4882a593Smuzhiyun	mtc0	t1, CP0_CONFIG
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun	/*
82*4882a593Smuzhiyun	 * Step 4) Disable Watchpoint facilities
83*4882a593Smuzhiyun	 */
84*4882a593Smuzhiyun	li t1, 0x00000000
85*4882a593Smuzhiyun	mtc0	t1, CP0_WATCHLO
86*4882a593Smuzhiyun	mtc0	t1, CP0_IWATCHLO
87*4882a593Smuzhiyun	/*
88*4882a593Smuzhiyun	 * Step 5) Disable the performance counters
89*4882a593Smuzhiyun	 */
90*4882a593Smuzhiyun	mtc0	zero, CP0_PERFORMANCE
91*4882a593Smuzhiyun	nop
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	/*
94*4882a593Smuzhiyun	 * Step 6) Establish EJTAG Debug register
95*4882a593Smuzhiyun	 */
96*4882a593Smuzhiyun	mtc0	zero, CP0_DEBUG
97*4882a593Smuzhiyun	nop
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun	/*
100*4882a593Smuzhiyun	 * Step 7) Establish Cause
101*4882a593Smuzhiyun	 * (set IV bit)
102*4882a593Smuzhiyun	 */
103*4882a593Smuzhiyun	li	t1, 0x00800000
104*4882a593Smuzhiyun	mtc0	t1, CP0_CAUSE
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun	/* Establish Wired (and Random) */
107*4882a593Smuzhiyun	mtc0	zero, CP0_WIRED
108*4882a593Smuzhiyun	nop
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun	/* First setup pll:s to make serial work ok */
111*4882a593Smuzhiyun	/* We have a 12 MHz crystal */
112*4882a593Smuzhiyun	li	t0, SYS_CPUPLL
113*4882a593Smuzhiyun	li	t1, 0x21  /* 396 MHz */
114*4882a593Smuzhiyun	sw	t1, 0(t0)
115*4882a593Smuzhiyun	sync
116*4882a593Smuzhiyun	nop
117*4882a593Smuzhiyun	nop
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun	/* wait 1mS for clocks to settle */
120*4882a593Smuzhiyun	li	t1, MEM_1MS
121*4882a593Smuzhiyun1:	add	t1, -1
122*4882a593Smuzhiyun	bne	t1, zero, 1b
123*4882a593Smuzhiyun	nop
124*4882a593Smuzhiyun	/* Setup AUX PLL */
125*4882a593Smuzhiyun	li	t0, SYS_AUXPLL
126*4882a593Smuzhiyun	li	t1, 8 /* 96 MHz */
127*4882a593Smuzhiyun	sw	t1, 0(t0) /* aux pll */
128*4882a593Smuzhiyun	sync
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun	/*  Static memory controller */
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun	/* RCE0 8MB AMD29D323 Flash */
133*4882a593Smuzhiyun	li	t0, MEM_STCFG0
134*4882a593Smuzhiyun	li	t1, 0x00001403
135*4882a593Smuzhiyun	sw	t1, 0(t0)
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun	li	t0, MEM_STTIME0
138*4882a593Smuzhiyun	li	t1, 0xFFFFFFDD
139*4882a593Smuzhiyun	sw	t1, 0(t0)
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun	li	t0, MEM_STADDR0
142*4882a593Smuzhiyun	li	t1, 0x11F83FE0
143*4882a593Smuzhiyun	sw	t1, 0(t0)
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun	/* RCE1 CPLD Board Logic */
146*4882a593Smuzhiyun	li	t0, MEM_STCFG1
147*4882a593Smuzhiyun	li	t1, 0x00000083
148*4882a593Smuzhiyun	sw	t1, 0(t0)
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun	li	t0, MEM_STTIME1
151*4882a593Smuzhiyun	li	t1, 0x33030A10
152*4882a593Smuzhiyun	sw	t1, 0(t0)
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun	li	t0, MEM_STADDR1
155*4882a593Smuzhiyun	li	t1, 0x11803E40
156*4882a593Smuzhiyun	sw	t1, 0(t0)
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun	/* RCE2 CPLD Board Logic */
159*4882a593Smuzhiyun	li	t0, MEM_STCFG2
160*4882a593Smuzhiyun	li	t1, 0x00000004
161*4882a593Smuzhiyun	sw	t1, 0(t0)
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun	li	t0, MEM_STTIME2
164*4882a593Smuzhiyun	li	t1, 0x08061908
165*4882a593Smuzhiyun	sw	t1, 0(t0)
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun	li	t0, MEM_STADDR2
168*4882a593Smuzhiyun	li	t1, 0x12A03FC0
169*4882a593Smuzhiyun	sw	t1, 0(t0)
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	/* RCE3 PCMCIA 250ns */
172*4882a593Smuzhiyun	li	t0, MEM_STCFG3
173*4882a593Smuzhiyun	li	t1, 0x00000002
174*4882a593Smuzhiyun	sw	t1, 0(t0)
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun	li	t0, MEM_STTIME3
177*4882a593Smuzhiyun	li	t1, 0x280E3E07
178*4882a593Smuzhiyun	sw	t1, 0(t0)
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun	li	t0, MEM_STADDR3
181*4882a593Smuzhiyun	li	t1, 0x10000000
182*4882a593Smuzhiyun	sw	t1, 0(t0)
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun	sync
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun	/* Set peripherals to a known state */
187*4882a593Smuzhiyun	li	t0, IC0_CFG0CLR
188*4882a593Smuzhiyun	li	t1, 0xFFFFFFFF
189*4882a593Smuzhiyun	sw	t1, 0(t0)
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	li	t0, IC0_CFG0CLR
192*4882a593Smuzhiyun	sw	t1, 0(t0)
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun	li	t0, IC0_CFG1CLR
195*4882a593Smuzhiyun	sw	t1, 0(t0)
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun	li	t0, IC0_CFG2CLR
198*4882a593Smuzhiyun	sw	t1, 0(t0)
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	li	t0, IC0_SRCSET
201*4882a593Smuzhiyun	sw	t1, 0(t0)
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun	li	t0, IC0_ASSIGNSET
204*4882a593Smuzhiyun	sw	t1, 0(t0)
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun	li	t0, IC0_WAKECLR
207*4882a593Smuzhiyun	sw	t1, 0(t0)
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun	li	t0, IC0_RISINGCLR
210*4882a593Smuzhiyun	sw	t1, 0(t0)
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	li	t0, IC0_FALLINGCLR
213*4882a593Smuzhiyun	sw	t1, 0(t0)
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun	li	t0, IC0_TESTBIT
216*4882a593Smuzhiyun	li	t1, 0x00000000
217*4882a593Smuzhiyun	sw	t1, 0(t0)
218*4882a593Smuzhiyun	sync
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	li	t0, IC1_CFG0CLR
221*4882a593Smuzhiyun	li	t1, 0xFFFFFFFF
222*4882a593Smuzhiyun	sw	t1, 0(t0)
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun	li	t0, IC1_CFG0CLR
225*4882a593Smuzhiyun	sw	t1, 0(t0)
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun	li	t0, IC1_CFG1CLR
228*4882a593Smuzhiyun	sw	t1, 0(t0)
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	li	t0, IC1_CFG2CLR
231*4882a593Smuzhiyun	sw	t1, 0(t0)
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun	li	t0, IC1_SRCSET
234*4882a593Smuzhiyun	sw	t1, 0(t0)
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	li	t0, IC1_ASSIGNSET
237*4882a593Smuzhiyun	sw	t1, 0(t0)
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun	li	t0, IC1_WAKECLR
240*4882a593Smuzhiyun	sw	t1, 0(t0)
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun	li	t0, IC1_RISINGCLR
243*4882a593Smuzhiyun	sw	t1, 0(t0)
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun	li	t0, IC1_FALLINGCLR
246*4882a593Smuzhiyun	sw	t1, 0(t0)
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun	li	t0, IC1_TESTBIT
249*4882a593Smuzhiyun	li	t1, 0x00000000
250*4882a593Smuzhiyun	sw	t1, 0(t0)
251*4882a593Smuzhiyun	sync
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun	li	t0, SYS_FREQCTRL0
254*4882a593Smuzhiyun	li	t1, 0x00000000
255*4882a593Smuzhiyun	sw	t1, 0(t0)
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun	li	t0, SYS_FREQCTRL1
258*4882a593Smuzhiyun	li	t1, 0x00000000
259*4882a593Smuzhiyun	sw	t1, 0(t0)
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun	li	t0, SYS_CLKSRC
262*4882a593Smuzhiyun	li	t1, 0x00000000
263*4882a593Smuzhiyun	sw	t1, 0(t0)
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun	li	t0, SYS_PININPUTEN
266*4882a593Smuzhiyun	li	t1, 0x00000000
267*4882a593Smuzhiyun	sw	t1, 0(t0)
268*4882a593Smuzhiyun	sync
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun	li	t0, 0xB1100100
271*4882a593Smuzhiyun	li	t1, 0x00000000
272*4882a593Smuzhiyun	sw	t1, 0(t0)
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun	li	t0, 0xB1400100
275*4882a593Smuzhiyun	li	t1, 0x00000000
276*4882a593Smuzhiyun	sw	t1, 0(t0)
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun	li	t0, SYS_WAKEMSK
280*4882a593Smuzhiyun	li	t1, 0x00000000
281*4882a593Smuzhiyun	sw	t1, 0(t0)
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun	li	t0, SYS_WAKESRC
284*4882a593Smuzhiyun	li	t1, 0x00000000
285*4882a593Smuzhiyun	sw	t1, 0(t0)
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun	/* wait 1mS before setup */
288*4882a593Smuzhiyun	li	t1, MEM_1MS
289*4882a593Smuzhiyun1:	add	t1, -1
290*4882a593Smuzhiyun	bne	t1, zero, 1b
291*4882a593Smuzhiyun	nop
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun	/*
294*4882a593Smuzhiyun	 * Skip memory setup if we are running from memory
295*4882a593Smuzhiyun	 */
296*4882a593Smuzhiyun	li		t0, 0x90000000
297*4882a593Smuzhiyun	sub		t0, ra, t0
298*4882a593Smuzhiyun	bltz		t0, skip_memsetup
299*4882a593Smuzhiyun	nop
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun	/*
302*4882a593Smuzhiyun	 * SDCS0 - Not used, for SMROM
303*4882a593Smuzhiyun	 * SDCS1 - 32MB Micron 48LCBM16A2
304*4882a593Smuzhiyun	 * SDCS2 - 32MB Micron 48LCBM16A2
305*4882a593Smuzhiyun	 */
306*4882a593Smuzhiyun	li	t0, MEM_SDMODE0
307*4882a593Smuzhiyun	li	t1, 0x00000000
308*4882a593Smuzhiyun	sw	t1, 0(t0)
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun	li	t0, MEM_SDMODE1
311*4882a593Smuzhiyun	li	t1, 0x00552229
312*4882a593Smuzhiyun	sw	t1, 0(t0)
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun	li	t0, MEM_SDMODE2
315*4882a593Smuzhiyun	li	t1, 0x00552229
316*4882a593Smuzhiyun	sw	t1, 0(t0)
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun	li	t0, MEM_SDADDR0
319*4882a593Smuzhiyun	li	t1, 0x00000000
320*4882a593Smuzhiyun	sw	t1, 0(t0)
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun	li	t0, MEM_SDADDR1
323*4882a593Smuzhiyun	li	t1, 0x001003F8
324*4882a593Smuzhiyun	sw	t1, 0(t0)
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun	li	t0, MEM_SDADDR2
327*4882a593Smuzhiyun	li	t1, 0x001023F8
328*4882a593Smuzhiyun	sw	t1, 0(t0)
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun	sync
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun	li	t0, MEM_SDREFCFG
333*4882a593Smuzhiyun	li	t1, 0x74000c30 /* Disable */
334*4882a593Smuzhiyun	sw	t1, 0(t0)
335*4882a593Smuzhiyun	sync
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun	li	t0, MEM_SDPRECMD
338*4882a593Smuzhiyun	sw	zero, 0(t0)
339*4882a593Smuzhiyun	sync
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun	li	t0, MEM_SDAUTOREF
342*4882a593Smuzhiyun	sw	zero, 0(t0)
343*4882a593Smuzhiyun	sync
344*4882a593Smuzhiyun	sw	zero, 0(t0)
345*4882a593Smuzhiyun	sync
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun	li	t0, MEM_SDREFCFG
348*4882a593Smuzhiyun	li	t1, 0x76000c30 /* Enable */
349*4882a593Smuzhiyun	sw	t1, 0(t0)
350*4882a593Smuzhiyun	sync
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun	li	t0, MEM_SDWRMD0
353*4882a593Smuzhiyun	li	t1, 0x00000023
354*4882a593Smuzhiyun	sw	t1, 0(t0)
355*4882a593Smuzhiyun	sync
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun	li	t0, MEM_SDWRMD1
358*4882a593Smuzhiyun	li	t1, 0x00000023
359*4882a593Smuzhiyun	sw	t1, 0(t0)
360*4882a593Smuzhiyun	sync
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun	li	t0, MEM_SDWRMD2
363*4882a593Smuzhiyun	li	t1, 0x00000023
364*4882a593Smuzhiyun	sw	t1, 0(t0)
365*4882a593Smuzhiyun	sync
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun	/* wait 1mS after setup */
368*4882a593Smuzhiyun	li	t1, MEM_1MS
369*4882a593Smuzhiyun1:	add	t1, -1
370*4882a593Smuzhiyun	bne	t1, zero, 1b
371*4882a593Smuzhiyun	nop
372*4882a593Smuzhiyun
373*4882a593Smuzhiyunskip_memsetup:
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun	li	t0, SYS_PINFUNC
376*4882a593Smuzhiyun	li	t1, 0/*0x00008080*/
377*4882a593Smuzhiyun	sw	t1, 0(t0)
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun	/*
380*4882a593Smuzhiyun	li	t0, SYS_TRIOUTCLR
381*4882a593Smuzhiyun	li	t1, 0x00001FFF
382*4882a593Smuzhiyun	sw	t1, 0(t0)
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun	li	t0, SYS_OUTPUTCLR
385*4882a593Smuzhiyun	li	t1, 0x00008000
386*4882a593Smuzhiyun	sw	t1, 0(t0)
387*4882a593Smuzhiyun	*/
388*4882a593Smuzhiyun	sync
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun	jr	ra
391*4882a593Smuzhiyun	nop
392