Blame view

board/w7o/init.S 8.28 KB
46263f2de   Wolfgang Denk   SPDX-License-Iden...
1
  /*
1b387ef55   Wolfgang Denk   SPDX: fix IBM-pib...
2
   * SPDX-License-Identifier:	GPL-2.0	IBM-pibs
46263f2de   Wolfgang Denk   SPDX-License-Iden...
3
   */
c609719b8   wdenk   Initial revision
4
  #include <config.h>
b36df5611   Stefan Roese   ppc4xx: Move ppc4...
5
  #include <asm/ppc4xx.h>
c609719b8   wdenk   Initial revision
6

c609719b8   wdenk   Initial revision
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  #include <ppc_asm.tmpl>
  #include <ppc_defs.h>
  
  #include <asm/cache.h>
  #include <asm/mmu.h>
  
  /******************************************************************************
   * Function:	ext_bus_cntlr_init
   *
   * Description:	Configures EBC Controller and a few basic chip selects.
   *
   *		CS0 is setup to get the Boot Flash out of the addresss range
   *		so that we may setup a stack.  CS7 is setup so that we can
   *		access and reset the hardware watchdog.
   *
   *		IMPORTANT: For pass1 this code must run from
   *		cache since you can not reliably change a peripheral banks
   *		timing register (pbxap) while running code from that bank.
   *		For ex., since we are running from ROM on bank 0, we can NOT
   *		execute the code that modifies bank 0 timings from ROM, so
   *		we run it from cache.
   *
   * Notes:	Does NOT use the stack.
   *****************************************************************************/
  	.section ".text"
  	.align	2
  	.globl	ext_bus_cntlr_init
  	.type	ext_bus_cntlr_init, @function
  ext_bus_cntlr_init:
  	mflr	r0
  	/********************************************************************
  	 * Prefetch entire ext_bus_cntrl_init function into the icache.
  	 * This is necessary because we are going to change the same CS we
  	 * are executing from.  Otherwise a CPU lockup may occur.
  	 *******************************************************************/
  	bl	..getAddr
  ..getAddr:
  	mflr	r3			/* get address of ..getAddr */
  
  	/* Calculate number of cache lines for this function */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
47
  	addi	r4, 0, (((.Lfe0 - ..getAddr) / CONFIG_SYS_CACHELINE_SIZE) + 2)
c609719b8   wdenk   Initial revision
48
49
50
  	mtctr	r4
  ..ebcloop:
  	icbt	r0, r3			/* prefetch cache line for addr in r3*/
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
51
  	addi	r3, r3, CONFIG_SYS_CACHELINE_SIZE /* move to next cache line */
c609719b8   wdenk   Initial revision
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  	bdnz	..ebcloop		/* continue for $CTR cache lines */
  
  	/********************************************************************
  	 * Delay to ensure all accesses to ROM are complete before changing
  	 * bank 0 timings. 200usec should be enough.
  	 * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles.
  	 *******************************************************************/
  	addis	r3, 0, 0x0
  	ori	r3, r3, 0xA000		/* wait 200us from reset */
  	mtctr	r3
  ..spinlp:
  	bdnz	..spinlp		/* spin loop */
  
  	/********************************************************************
  	 * Setup External Bus Controller (EBC).
  	 *******************************************************************/
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
68
69
  	addi	r3, 0, EBC0_CFG
  	mtdcr	EBC0_CFGADDR, r3
c609719b8   wdenk   Initial revision
70
71
  	addis	r4, 0, 0xb040		/* Device base timeout = 1024 cycles */
  	ori	r4, r4, 0x0		/* Drive CS with external master */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
72
  	mtdcr	EBC0_CFGDATA, r4
c609719b8   wdenk   Initial revision
73
74
75
76
  
  	/********************************************************************
  	 * Change PCIINT signal to PerWE
  	 *******************************************************************/
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
77
  	mfdcr	r4, CPC0_CR1
c609719b8   wdenk   Initial revision
78
  	ori	r4, r4, 0x4000
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
79
  	mtdcr	CPC0_CR1, r4
c609719b8   wdenk   Initial revision
80
81
82
83
  
  	/********************************************************************
  	 * Memory Bank 0 (Flash Bank 0) initialization
  	 *******************************************************************/
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
84
85
  	addi	r3, 0, PB1AP
  	mtdcr	EBC0_CFGADDR, r3
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
86
87
  	addis	r4, 0, CONFIG_SYS_W7O_EBC_PB0AP@h
  	ori	r4, r4, CONFIG_SYS_W7O_EBC_PB0AP@l
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
88
  	mtdcr	EBC0_CFGDATA, r4
c609719b8   wdenk   Initial revision
89

d1c3b2752   Stefan Roese   ppc4xx: Big clean...
90
91
  	addi	r3, 0, PB0CR
  	mtdcr	EBC0_CFGADDR, r3
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
92
93
  	addis	r4, 0, CONFIG_SYS_W7O_EBC_PB0CR@h
  	ori	r4, r4, CONFIG_SYS_W7O_EBC_PB0CR@l
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
94
  	mtdcr	EBC0_CFGDATA, r4
c609719b8   wdenk   Initial revision
95
96
97
98
  
  	/********************************************************************
  	 * Memory Bank 7 LEDs - NEEDED BECAUSE OF HW WATCHDOG AND LEDs.
  	 *******************************************************************/
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
99
100
  	addi	r3, 0, PB7AP
  	mtdcr	EBC0_CFGADDR, r3
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
101
102
  	addis	r4, 0, CONFIG_SYS_W7O_EBC_PB7AP@h
  	ori	r4, r4, CONFIG_SYS_W7O_EBC_PB7AP@l
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
103
  	mtdcr	EBC0_CFGDATA, r4
c609719b8   wdenk   Initial revision
104

d1c3b2752   Stefan Roese   ppc4xx: Big clean...
105
106
  	addi	r3, 0, PB7CR
  	mtdcr	EBC0_CFGADDR, r3
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
107
108
  	addis	r4, 0, CONFIG_SYS_W7O_EBC_PB7CR@h
  	ori	r4, r4, CONFIG_SYS_W7O_EBC_PB7CR@l
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
109
  	mtdcr	EBC0_CFGDATA, r4
c609719b8   wdenk   Initial revision
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  
  	/* We are all done */
  	mtlr	r0			/* Restore link register */
  	blr				/* Return to calling function */
  .Lfe0:	.size	ext_bus_cntlr_init,.Lfe0-ext_bus_cntlr_init
  /* end ext_bus_cntlr_init() */
  
  /******************************************************************************
   * Function:	sdram_init
   *
   * Description:	Configures SDRAM memory banks.
   *
   *		Serial Presence Detect, "SPD," reads the SDRAM EEPROM
   *		via the IIC bus and then configures the SDRAM memory
   *		banks appropriately. If Auto Memory Configuration is
   *		is not used, it is assumed that a 4MB 11x8x2, non-ECC,
   *		SDRAM is soldered down.
   *
   * Notes:	Expects that the stack is already setup.
   *****************************************************************************/
  	.section ".text"
  	.align	2
  	.globl	sdram_init
  	.type	sdram_init, @function
  sdram_init:
  	/* save the return info on stack */
  	mflr	r0			/* Get link register */
  	stwu	r1, -8(r1)		/* Save back chain and move SP */
  	stw	r0, +12(r1)		/* Save link register */
  
  	/*
  	 * First call spd_sdram to try to init SDRAM according to the
  	 * contents of the SPD EEPROM.  If the SPD EEPROM is blank or
  	 * erronious, spd_sdram returns 0 in R3.
  	 */
db2f721ff   wdenk   * Patch by Rune T...
145
  	li	r3,0
c609719b8   wdenk   Initial revision
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  	bl	spd_sdram
  	addic.	r3, r3, 0		/* Check for error, save dram size */
  	bne	..sdri_done		/* If it worked, we're done... */
  
  	/********************************************************************
  	 * If SPD detection fails, we'll default to 4MB, 11x8x2, as this
  	 * is the SMALLEST SDRAM size the 405 supports.  We can do this
  	 * because W7O boards have soldered on RAM, and there will always
  	 * be some amount present.  If we were using DIMMs, we should hang
  	 * the board instead, since it doesn't have any RAM to continue
  	 * running with.
  	 *******************************************************************/
  
  	/*
  	 * Disable memory controller to allow
  	 * values to be changed.
  	 */
95b602bab   Stefan Roese   ppc4xx: Convert P...
163
  	addi    r3, 0, SDRAM0_CFG
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
164
  	mtdcr   SDRAM0_CFGADDR, r3
c609719b8   wdenk   Initial revision
165
166
  	addis   r4, 0, 0x0
  	ori     r4, r4, 0x0
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
167
  	mtdcr   SDRAM0_CFGDATA, r4
c609719b8   wdenk   Initial revision
168
169
170
171
172
  
  	/*
  	 * Set MB0CF for ext bank 0. (0-4MB) Address Mode 5 since 11x8x2
  	 * All other banks are disabled.
  	 */
95b602bab   Stefan Roese   ppc4xx: Convert P...
173
  	addi	r3, 0, SDRAM0_B0CR
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
174
  	mtdcr	SDRAM0_CFGADDR, r3
c609719b8   wdenk   Initial revision
175
176
  	addis	r4, 0, 0x0000		/* BA=0x0, SZ=4MB */
  	ori	r4, r4, 0x8001		/* Mode is 5, 11x8x2or4, BE=Enabled */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
177
  	mtdcr	SDRAM0_CFGDATA, r4
c609719b8   wdenk   Initial revision
178
179
180
181
182
  
  	/* Clear MB1CR,MB2CR,MB3CR to turn other banks off */
  	addi	r4, 0, 0		/* Zero the data reg */
  
  	addi	r3, r3, 4		/* Point to MB1CF reg */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
183
184
  	mtdcr	SDRAM0_CFGADDR, r3		/* Set the address */
  	mtdcr	SDRAM0_CFGDATA, r4		/* Zero the reg */
c609719b8   wdenk   Initial revision
185
186
  
  	addi	r3, r3, 4		/* Point to MB2CF reg */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
187
188
  	mtdcr	SDRAM0_CFGADDR, r3		/* Set the address */
  	mtdcr	SDRAM0_CFGDATA, r4		/* Zero the reg */
c609719b8   wdenk   Initial revision
189
190
  
  	addi	r3, r3, 4		/* Point to MB3CF reg */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
191
192
  	mtdcr	SDRAM0_CFGADDR, r3		/* Set the address */
  	mtdcr	SDRAM0_CFGDATA, r4		/* Zero the reg */
c609719b8   wdenk   Initial revision
193
194
195
196
197
198
199
200
201
202
  
  	/********************************************************************
  	 * Set the SDRAM Timing reg, SDTR1 and the refresh timer reg, RTR.
  	 * To set the appropriate timings, we assume sdram is
  	 * 100MHz (pc100 compliant).
  	 *******************************************************************/
  
  	/*
  	 * Set up SDTR1
  	 */
95b602bab   Stefan Roese   ppc4xx: Convert P...
203
  	addi    r3, 0, SDRAM0_TR
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
204
  	mtdcr   SDRAM0_CFGADDR, r3
c609719b8   wdenk   Initial revision
205
206
  	addis   r4, 0, 0x0086		/* SDTR1 value for 100Mhz */
  	ori     r4, r4, 0x400D
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
207
  	mtdcr   SDRAM0_CFGDATA, r4
c609719b8   wdenk   Initial revision
208
209
210
211
  
  	/*
  	 * Set RTR
  	 */
95b602bab   Stefan Roese   ppc4xx: Convert P...
212
  	addi    r3, 0, SDRAM0_RTR
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
213
  	mtdcr   SDRAM0_CFGADDR, r3
c609719b8   wdenk   Initial revision
214
  	addis   r4, 0, 0x05F0		/* RTR refresh val = 15.625ms@100Mhz */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
215
  	mtdcr   SDRAM0_CFGDATA, r4
c609719b8   wdenk   Initial revision
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
  
  	/********************************************************************
  	 * Delay to ensure 200usec have elapsed since reset. Assume worst
  	 * case that the core is running 200Mhz:
  	 *	  200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles
  	 *******************************************************************/
  	addis   r3, 0, 0x0000
  	ori     r3, r3, 0xA000		/* Wait 200us from reset */
  	mtctr   r3
  ..spinlp2:
  	bdnz    ..spinlp2		/* spin loop */
  
  	/********************************************************************
  	 * Set memory controller options reg, MCOPT1.
  	 *******************************************************************/
95b602bab   Stefan Roese   ppc4xx: Convert P...
231
  	addi    r3, 0, SDRAM0_CFG
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
232
  	mtdcr   SDRAM0_CFGADDR, r3
c609719b8   wdenk   Initial revision
233
234
  	addis   r4, 0, 0x80E0		/* DC_EN=1,SRE=0,PME=0,MEMCHK=0 */
  	ori     r4, r4, 0x0000		/* REGEN=0,DRW=00,BRPF=01,ECCDD=1 */
d1c3b2752   Stefan Roese   ppc4xx: Big clean...
235
  	mtdcr   SDRAM0_CFGDATA, r4		/* EMDULR=1 */
c609719b8   wdenk   Initial revision
236
237
238
239
240
241
242
243
244
  
  ..sdri_done:
  	/* restore and return */
  	lwz	r0, +12(r1)		/* Get saved link register */
  	addi	r1, r1, +8		/* Remove frame from stack */
  	mtlr	r0			/* Restore link register */
  	blr				/* Return to calling function */
  .Lfe1:	.size	sdram_init,.Lfe1-sdram_init
  /* end sdram_init() */