1 /*------------------------------------------------------------------------------+ */
3 /* This source code has been made available to you by IBM on an AS-IS */
4 /* basis. Anyone receiving this source is licensed under IBM */
5 /* copyrights to use it in any way he or she deems fit, including */
6 /* copying it, modifying it, compiling it, and redistributing it either */
7 /* with or without modifications. No license under IBM patents or */
8 /* patent applications is to be implied by the copyright license. */
10 /* Any user of this software should understand that IBM cannot provide */
11 /* technical support for this software and will not be responsible for */
12 /* any consequences resulting from the use of this software. */
14 /* Any person who transfers this source code or any derivative work */
15 /* must include the IBM copyright notice, this paragraph, and the */
16 /* preceding two paragraphs in the transferred software. */
18 /* COPYRIGHT I B M CORPORATION 1995 */
19 /* LICENSED MATERIAL - PROGRAM PROPERTY OF I B M */
20 /*------------------------------------------------------------------------------- */
22 /*----------------------------------------------------------------------------- */
23 /* Function: ext_bus_cntlr_init */
24 /* Description: Initializes the External Bus Controller for the external */
25 /* peripherals. IMPORTANT: For pass1 this code must run from */
26 /* cache since you can not reliably change a peripheral banks */
27 /* timing register (pbxap) while running code from that bank. */
28 /* For ex., since we are running from ROM on bank 0, we can NOT */
29 /* execute the code that modifies bank 0 timings from ROM, so */
30 /* we run it from cache. */
32 /*----------------------------------------------------------------------------- */
36 #define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
38 #include <ppc_asm.tmpl>
41 #include <asm/cache.h>
45 .globl ext_bus_cntlr_init
47 mflr r4 /* save link register */
50 mflr r3 /* get address of ..getAddr */
51 mtlr r4 /* restore link register */
52 addi r4,0,14 /* set ctr to 10; used to prefetch */
53 mtctr r4 /* 10 cache lines to fit this function */
54 /* in cache (gives us 8x10=80 instrctns) */
56 icbt r0,r3 /* prefetch cache line for addr in r3 */
57 addi r3,r3,32 /* move to next cache line */
58 bdnz ..ebcloop /* continue for 10 cache lines */
60 /*------------------------------------------------------------------- */
61 /* Delay to ensure all accesses to ROM are complete before changing */
62 /* bank 0 timings. 200usec should be enough. */
63 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
64 /*------------------------------------------------------------------- */
66 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
69 bdnz ..spinlp /* spin loop */
71 /*----------------------------------------------------------------------- */
72 /* Memory Bank 0 (Flash) initialization (from openbios) */
73 /*----------------------------------------------------------------------- */
87 /*----------------------------------------------------------------------- */
88 /* Memory Bank 1 (NVRAM/RTC) initialization */
89 /*----------------------------------------------------------------------- */
103 /*----------------------------------------------------------------------- */
104 /* Memory Bank 2 (A/D converter) initialization */
105 /*----------------------------------------------------------------------- */
119 /*----------------------------------------------------------------------- */
120 /* Memory Bank 3 (Ethernet PHY Reset) initialization */
121 /*----------------------------------------------------------------------- */
135 /*----------------------------------------------------------------------- */
136 /* Memory Bank 4 (PC-MIP PRSNT1#) initialization */
137 /*----------------------------------------------------------------------- */
151 /*----------------------------------------------------------------------- */
152 /* Memory Bank 5 (PC-MIP PRSNT2#) initialization */
153 /*----------------------------------------------------------------------- */
167 /*----------------------------------------------------------------------- */
168 /* Memory Bank 6 (CPU LED0) initialization */
169 /*----------------------------------------------------------------------- */
183 /*----------------------------------------------------------------------- */
184 /* Memory Bank 7 (CPU LED1) initialization */
185 /*----------------------------------------------------------------------- */
199 /* addis r4,r0,FPGA_BRDC@h */
200 /* ori r4,r4,FPGA_BRDC@l */
201 /* lbz r3,0(r4) /###*get FPGA board control reg */
203 /* ori r3,r3,0x01 /###*set UART1 control to select CTS/RTS */
206 nop /* pass2 DCR errata #8 */
209 /*----------------------------------------------------------------------------- */
210 /* Function: sdram_init */
211 /* Description: Configures SDRAM memory banks on ERIC. */
212 /* We do manually init our SDRAM. */
213 /* If we have two SDRAM banks, simply undef SINGLE_BANK (ROLF :-) */
214 /* It is assumed that a 32MB 12x8(2) SDRAM is used. */
215 /*----------------------------------------------------------------------------- */
222 #ifdef CFG_SDRAM_MANUALLY
223 /*------------------------------------------------------------------- */
224 /* Set MB0CF for bank 0. (0-32MB) Address Mode 4 since 12x8(2) */
225 /*------------------------------------------------------------------- */
233 /*------------------------------------------------------------------- */
234 /* Set MB1CF for bank 1. (32MB-64MB) Address Mode 4 since 12x8(2) */
235 /*------------------------------------------------------------------- */
243 /*------------------------------------------------------------------- */
244 /* Set MB2CF for bank 2. off */
245 /*------------------------------------------------------------------- */
253 /*------------------------------------------------------------------- */
254 /* Set MB3CF for bank 3. off */
255 /*------------------------------------------------------------------- */
263 /*------------------------------------------------------------------- */
264 /* Set the SDRAM Timing reg, SDTR1 and the refresh timer reg, RTR. */
265 /* To set the appropriate timings, we need to know the SDRAM speed. */
266 /* We can use the PLB speed since the SDRAM speed is the same as */
267 /* the PLB speed. The PLB speed is the FBK divider times the */
268 /* 405GP reference clock, which on the Walnut board is 33Mhz. */
269 /* Thus, if FBK div is 2, SDRAM is 66Mhz; if FBK div is 3, SDRAM is */
270 /* 100Mhz; if FBK is 3, SDRAM is 133Mhz. */
271 /* NOTE: The Walnut board supports SDRAM speeds of 66Mhz, 100Mhz, and */
273 /*------------------------------------------------------------------- */
275 mfdcr r5,strap /* determine FBK divider */
276 /* via STRAP reg to calc PLB speed. */
277 /* SDRAM speed is the same as the PLB */
279 rlwinm r4,r5,4,0x3 /* get FBK divide bits */
284 addis r6,0,SDTR_66@h /* SDTR1 value for 66Mhz */
286 addis r7,0,RTR_66 /* RTR value for 66Mhz */
291 addis r6,0,SDTR_100@h /* SDTR1 value for 100Mhz */
293 addis r7,0,RTR_100 /* RTR value for 100Mhz */
296 addis r6,0,0x0107 /* SDTR1 value for 133Mhz */
298 addis r7,0,0x07F0 /* RTR value for 133Mhz */
301 /*------------------------------------------------------------------- */
303 /*------------------------------------------------------------------- */
308 /*------------------------------------------------------------------- */
310 /*------------------------------------------------------------------- */
315 /*------------------------------------------------------------------- */
316 /* Delay to ensure 200usec have elapsed since reset. Assume worst */
317 /* case that the core is running 200Mhz: */
318 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
319 /*------------------------------------------------------------------- */
321 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
324 bdnz ..spinlp2 /* spin loop */
326 /*------------------------------------------------------------------- */
327 /* Set memory controller options reg, MCOPT1. */
328 /* Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst */
330 /*------------------------------------------------------------------- */
333 addis r4,0,0x8080 /* set DC_EN=1 */
337 /*------------------------------------------------------------------- */
338 /* Delay to ensure 10msec have elapsed since reset. This is */
339 /* required for the MPC952 to stabalize. Assume worst */
340 /* case that the core is running 200Mhz: */
341 /* 200,000,000 (cycles/sec) X .010 (sec) = 0x1E8480 cycles */
342 /* This delay should occur before accessing SDRAM. */
343 /*------------------------------------------------------------------- */
345 ori r3,r3,0x8480 /* ensure 10msec have passed since reset */
348 bdnz ..spinlp3 /* spin loop */
351 /*fixme: do SDRAM Autoconfig from EEPROM here */
354 mtlr r31 /* restore lr */