1 /*------------------------------------------------------------------------------+ */
3 /* This source code is dual-licensed. You may use it under the terms */
4 /* of the GNU General Public License version 2, or under the license */
7 /* This source code has been made available to you by IBM on an AS-IS */
8 /* basis. Anyone receiving this source is licensed under IBM */
9 /* copyrights to use it in any way he or she deems fit, including */
10 /* copying it, modifying it, compiling it, and redistributing it either */
11 /* with or without modifications. No license under IBM patents or */
12 /* patent applications is to be implied by the copyright license. */
14 /* Any user of this software should understand that IBM cannot provide */
15 /* technical support for this software and will not be responsible for */
16 /* any consequences resulting from the use of this software. */
18 /* Any person who transfers this source code or any derivative work */
19 /* must include the IBM copyright notice, this paragraph, and the */
20 /* preceding two paragraphs in the transferred software. */
22 /* COPYRIGHT I B M CORPORATION 1995 */
23 /* LICENSED MATERIAL - PROGRAM PROPERTY OF I B M */
24 /*------------------------------------------------------------------------------- */
26 /*----------------------------------------------------------------------------- */
27 /* Function: ext_bus_cntlr_init */
28 /* Description: Initializes the External Bus Controller for the external */
29 /* peripherals. IMPORTANT: For pass1 this code must run from */
30 /* cache since you can not reliably change a peripheral banks */
31 /* timing register (pbxap) while running code from that bank. */
32 /* For ex., since we are running from ROM on bank 0, we can NOT */
33 /* execute the code that modifies bank 0 timings from ROM, so */
34 /* we run it from cache. */
36 /*----------------------------------------------------------------------------- */
38 #include <asm/ppc4xx.h>
40 #define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
42 #include <ppc_asm.tmpl>
45 #include <asm/cache.h>
49 .globl ext_bus_cntlr_init
51 mflr r4 /* save link register */
54 mflr r3 /* get address of ..getAddr */
55 mtlr r4 /* restore link register */
56 addi r4,0,14 /* set ctr to 10; used to prefetch */
57 mtctr r4 /* 10 cache lines to fit this function */
58 /* in cache (gives us 8x10=80 instrctns) */
60 icbt r0,r3 /* prefetch cache line for addr in r3 */
61 addi r3,r3,32 /* move to next cache line */
62 bdnz ..ebcloop /* continue for 10 cache lines */
64 /*------------------------------------------------------------------- */
65 /* Delay to ensure all accesses to ROM are complete before changing */
66 /* bank 0 timings. 200usec should be enough. */
67 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
68 /*------------------------------------------------------------------- */
70 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
73 bdnz ..spinlp /* spin loop */
75 /*----------------------------------------------------------------------- */
76 /* Memory Bank 0 (Flash) initialization (from openbios) */
77 /*----------------------------------------------------------------------- */
91 /*----------------------------------------------------------------------- */
92 /* Memory Bank 1 (NVRAM/RTC) initialization */
93 /*----------------------------------------------------------------------- */
102 mtdcr EBC0_CFGADDR,r4
105 mtdcr EBC0_CFGDATA,r4
107 /*----------------------------------------------------------------------- */
108 /* Memory Bank 2 (A/D converter) initialization */
109 /*----------------------------------------------------------------------- */
112 mtdcr EBC0_CFGADDR,r4
115 mtdcr EBC0_CFGDATA,r4
118 mtdcr EBC0_CFGADDR,r4
121 mtdcr EBC0_CFGDATA,r4
123 /*----------------------------------------------------------------------- */
124 /* Memory Bank 3 (Ethernet PHY Reset) initialization */
125 /*----------------------------------------------------------------------- */
128 mtdcr EBC0_CFGADDR,r4
131 mtdcr EBC0_CFGDATA,r4
134 mtdcr EBC0_CFGADDR,r4
137 mtdcr EBC0_CFGDATA,r4
139 /*----------------------------------------------------------------------- */
140 /* Memory Bank 4 (PC-MIP PRSNT1#) initialization */
141 /*----------------------------------------------------------------------- */
144 mtdcr EBC0_CFGADDR,r4
147 mtdcr EBC0_CFGDATA,r4
150 mtdcr EBC0_CFGADDR,r4
153 mtdcr EBC0_CFGDATA,r4
155 /*----------------------------------------------------------------------- */
156 /* Memory Bank 5 (PC-MIP PRSNT2#) initialization */
157 /*----------------------------------------------------------------------- */
160 mtdcr EBC0_CFGADDR,r4
163 mtdcr EBC0_CFGDATA,r4
166 mtdcr EBC0_CFGADDR,r4
169 mtdcr EBC0_CFGDATA,r4
171 /*----------------------------------------------------------------------- */
172 /* Memory Bank 6 (CPU LED0) initialization */
173 /*----------------------------------------------------------------------- */
176 mtdcr EBC0_CFGADDR,r4
179 mtdcr EBC0_CFGDATA,r4
182 mtdcr EBC0_CFGADDR,r4
185 mtdcr EBC0_CFGDATA,r4
187 /*----------------------------------------------------------------------- */
188 /* Memory Bank 7 (CPU LED1) initialization */
189 /*----------------------------------------------------------------------- */
192 mtdcr EBC0_CFGADDR,r4
195 mtdcr EBC0_CFGDATA,r4
198 mtdcr EBC0_CFGADDR,r4
201 mtdcr EBC0_CFGDATA,r4
203 /* addis r4,r0,FPGA_BRDC@h */
204 /* ori r4,r4,FPGA_BRDC@l */
205 /* lbz r3,0(r4) /###*get FPGA board control reg */
207 /* ori r3,r3,0x01 /###*set UART1 control to select CTS/RTS */
210 nop /* pass2 DCR errata #8 */
213 /*----------------------------------------------------------------------------- */
214 /* Function: sdram_init */
215 /* Description: Configures SDRAM memory banks on ERIC. */
216 /* We do manually init our SDRAM. */
217 /* If we have two SDRAM banks, simply undef SINGLE_BANK (ROLF :-) */
218 /* It is assumed that a 32MB 12x8(2) SDRAM is used. */
219 /*----------------------------------------------------------------------------- */
226 #ifdef CONFIG_SYS_SDRAM_MANUALLY
227 /*------------------------------------------------------------------- */
228 /* Set MB0CF for bank 0. (0-32MB) Address Mode 4 since 12x8(2) */
229 /*------------------------------------------------------------------- */
231 addi r4,0,SDRAM0_B0CR
232 mtdcr SDRAM0_CFGADDR,r4
235 mtdcr SDRAM0_CFGDATA,r4
237 /*------------------------------------------------------------------- */
238 /* Set MB1CF for bank 1. (32MB-64MB) Address Mode 4 since 12x8(2) */
239 /*------------------------------------------------------------------- */
241 addi r4,0,SDRAM0_B1CR
242 mtdcr SDRAM0_CFGADDR,r4
245 mtdcr SDRAM0_CFGDATA,r4
247 /*------------------------------------------------------------------- */
248 /* Set MB2CF for bank 2. off */
249 /*------------------------------------------------------------------- */
251 addi r4,0,SDRAM0_B2CR
252 mtdcr SDRAM0_CFGADDR,r4
255 mtdcr SDRAM0_CFGDATA,r4
257 /*------------------------------------------------------------------- */
258 /* Set MB3CF for bank 3. off */
259 /*------------------------------------------------------------------- */
261 addi r4,0,SDRAM0_B3CR
262 mtdcr SDRAM0_CFGADDR,r4
265 mtdcr SDRAM0_CFGDATA,r4
267 /*------------------------------------------------------------------- */
268 /* Set the SDRAM Timing reg, SDTR1 and the refresh timer reg, RTR. */
269 /* To set the appropriate timings, we need to know the SDRAM speed. */
270 /* We can use the PLB speed since the SDRAM speed is the same as */
271 /* the PLB speed. The PLB speed is the FBK divider times the */
272 /* 405GP reference clock, which on the Walnut board is 33Mhz. */
273 /* Thus, if FBK div is 2, SDRAM is 66Mhz; if FBK div is 3, SDRAM is */
274 /* 100Mhz; if FBK is 3, SDRAM is 133Mhz. */
275 /* NOTE: The Walnut board supports SDRAM speeds of 66Mhz, 100Mhz, and */
277 /*------------------------------------------------------------------- */
279 mfdcr r5,CPC0_PSR /* determine FBK divider */
280 /* via STRAP reg to calc PLB speed. */
281 /* SDRAM speed is the same as the PLB */
283 rlwinm r4,r5,4,0x3 /* get FBK divide bits */
288 addis r6,0,SDTR_66@h /* SDTR1 value for 66Mhz */
290 addis r7,0,RTR_66 /* RTR value for 66Mhz */
295 addis r6,0,SDTR_100@h /* SDTR1 value for 100Mhz */
297 addis r7,0,RTR_100 /* RTR value for 100Mhz */
300 addis r6,0,0x0107 /* SDTR1 value for 133Mhz */
302 addis r7,0,0x07F0 /* RTR value for 133Mhz */
305 /*------------------------------------------------------------------- */
307 /*------------------------------------------------------------------- */
309 mtdcr SDRAM0_CFGADDR,r4
310 mtdcr SDRAM0_CFGDATA,r6
312 /*------------------------------------------------------------------- */
314 /*------------------------------------------------------------------- */
316 mtdcr SDRAM0_CFGADDR,r4
317 mtdcr SDRAM0_CFGDATA,r7
319 /*------------------------------------------------------------------- */
320 /* Delay to ensure 200usec have elapsed since reset. Assume worst */
321 /* case that the core is running 200Mhz: */
322 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
323 /*------------------------------------------------------------------- */
325 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
328 bdnz ..spinlp2 /* spin loop */
330 /*------------------------------------------------------------------- */
331 /* Set memory controller options reg, MCOPT1. */
332 /* Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst */
334 /*------------------------------------------------------------------- */
336 mtdcr SDRAM0_CFGADDR,r4
337 addis r4,0,0x8080 /* set DC_EN=1 */
339 mtdcr SDRAM0_CFGDATA,r4
341 /*------------------------------------------------------------------- */
342 /* Delay to ensure 10msec have elapsed since reset. This is */
343 /* required for the MPC952 to stabalize. Assume worst */
344 /* case that the core is running 200Mhz: */
345 /* 200,000,000 (cycles/sec) X .010 (sec) = 0x1E8480 cycles */
346 /* This delay should occur before accessing SDRAM. */
347 /*------------------------------------------------------------------- */
349 ori r3,r3,0x8480 /* ensure 10msec have passed since reset */
352 bdnz ..spinlp3 /* spin loop */
355 /*fixme: do SDRAM Autoconfig from EEPROM here */
358 mtlr r31 /* restore lr */