blob: 9d4e7ff48246f62ca95d08b64bfc4541a2d85e30 [file] [log] [blame]
wdenkfe8c2802002-11-03 00:38:21 +00001/*------------------------------------------------------------------------------+ */
2/* */
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. */
9/* */
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. */
13/* */
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. */
17/* */
18/* COPYRIGHT I B M CORPORATION 1995 */
19/* LICENSED MATERIAL - PROGRAM PROPERTY OF I B M */
20/*------------------------------------------------------------------------------- */
21
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. */
31/* */
32/*----------------------------------------------------------------------------- */
33#include <config.h>
34#include <ppc4xx.h>
35
36#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
37
38#include <ppc_asm.tmpl>
39#include <ppc_defs.h>
40
41#include <asm/cache.h>
42#include <asm/mmu.h>
43
44
wdenk57b2d802003-06-27 21:31:46 +000045 .globl ext_bus_cntlr_init
wdenkfe8c2802002-11-03 00:38:21 +000046ext_bus_cntlr_init:
wdenk57b2d802003-06-27 21:31:46 +000047 mflr r4 /* save link register */
48 bl ..getAddr
wdenkfe8c2802002-11-03 00:38:21 +000049..getAddr:
wdenk57b2d802003-06-27 21:31:46 +000050 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) */
wdenkfe8c2802002-11-03 00:38:21 +000055..ebcloop:
wdenk57b2d802003-06-27 21:31:46 +000056 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 */
wdenkfe8c2802002-11-03 00:38:21 +000059
wdenk57b2d802003-06-27 21:31:46 +000060 /*------------------------------------------------------------------- */
61 /* Delay to ensure all accesses to ROM are complete before changing */
wdenkfe8c2802002-11-03 00:38:21 +000062 /* bank 0 timings. 200usec should be enough. */
wdenk57b2d802003-06-27 21:31:46 +000063 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
64 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000065 addis r3,0,0x0
wdenk57b2d802003-06-27 21:31:46 +000066 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
67 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +000068..spinlp:
wdenk57b2d802003-06-27 21:31:46 +000069 bdnz ..spinlp /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +000070
wdenk57b2d802003-06-27 21:31:46 +000071 /*----------------------------------------------------------------------- */
72 /* Memory Bank 0 (Flash) initialization (from openbios) */
73 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000074
wdenk57b2d802003-06-27 21:31:46 +000075 addi r4,0,pb0ap
76 mtdcr ebccfga,r4
77 addis r4,0,CS0_AP@h
78 ori r4,r4,CS0_AP@l
79 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +000080
wdenk57b2d802003-06-27 21:31:46 +000081 addi r4,0,pb0cr
82 mtdcr ebccfga,r4
83 addis r4,0,CS0_CR@h
84 ori r4,r4,CS0_CR@l
85 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +000086
wdenk57b2d802003-06-27 21:31:46 +000087 /*----------------------------------------------------------------------- */
88 /* Memory Bank 1 (NVRAM/RTC) initialization */
89 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000090
wdenk57b2d802003-06-27 21:31:46 +000091 addi r4,0,pb1ap
92 mtdcr ebccfga,r4
93 addis r4,0,CS1_AP@h
94 ori r4,r4,CS1_AP@l
95 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +000096
wdenk57b2d802003-06-27 21:31:46 +000097 addi r4,0,pb1cr
98 mtdcr ebccfga,r4
99 addis r4,0,CS1_CR@h
100 ori r4,r4,CS1_CR@l
101 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000102
wdenk57b2d802003-06-27 21:31:46 +0000103 /*----------------------------------------------------------------------- */
104 /* Memory Bank 2 (A/D converter) initialization */
105 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000106
wdenk57b2d802003-06-27 21:31:46 +0000107 addi r4,0,pb2ap
108 mtdcr ebccfga,r4
109 addis r4,0,CS2_AP@h
110 ori r4,r4,CS2_AP@l
111 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000112
wdenk57b2d802003-06-27 21:31:46 +0000113 addi r4,0,pb2cr
114 mtdcr ebccfga,r4
115 addis r4,0,CS2_CR@h
116 ori r4,r4,CS2_CR@l
117 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000118
wdenk57b2d802003-06-27 21:31:46 +0000119 /*----------------------------------------------------------------------- */
120 /* Memory Bank 3 (Ethernet PHY Reset) initialization */
121 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000122
wdenk57b2d802003-06-27 21:31:46 +0000123 addi r4,0,pb3ap
124 mtdcr ebccfga,r4
125 addis r4,0,CS3_AP@h
126 ori r4,r4,CS3_AP@l
127 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000128
wdenk57b2d802003-06-27 21:31:46 +0000129 addi r4,0,pb3cr
130 mtdcr ebccfga,r4
131 addis r4,0,CS3_CR@h
132 ori r4,r4,CS3_CR@l
133 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000134
wdenk57b2d802003-06-27 21:31:46 +0000135 /*----------------------------------------------------------------------- */
136 /* Memory Bank 4 (PC-MIP PRSNT1#) initialization */
137 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000138
wdenk57b2d802003-06-27 21:31:46 +0000139 addi r4,0,pb4ap
140 mtdcr ebccfga,r4
141 addis r4,0,CS4_AP@h
142 ori r4,r4,CS4_AP@l
143 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000144
wdenk57b2d802003-06-27 21:31:46 +0000145 addi r4,0,pb4cr
146 mtdcr ebccfga,r4
147 addis r4,0,CS4_CR@h
148 ori r4,r4,CS4_CR@l
149 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000150
wdenk57b2d802003-06-27 21:31:46 +0000151 /*----------------------------------------------------------------------- */
152 /* Memory Bank 5 (PC-MIP PRSNT2#) initialization */
153 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000154
wdenk57b2d802003-06-27 21:31:46 +0000155 addi r4,0,pb5ap
156 mtdcr ebccfga,r4
157 addis r4,0,CS5_AP@h
158 ori r4,r4,CS5_AP@l
159 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000160
wdenk57b2d802003-06-27 21:31:46 +0000161 addi r4,0,pb5cr
162 mtdcr ebccfga,r4
163 addis r4,0,CS5_CR@h
164 ori r4,r4,CS5_CR@l
165 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000166
wdenk57b2d802003-06-27 21:31:46 +0000167 /*----------------------------------------------------------------------- */
168 /* Memory Bank 6 (CPU LED0) initialization */
169 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000170
wdenk57b2d802003-06-27 21:31:46 +0000171 addi r4,0,pb6ap
172 mtdcr ebccfga,r4
173 addis r4,0,CS6_AP@h
174 ori r4,r4,CS6_AP@l
175 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000176
wdenk57b2d802003-06-27 21:31:46 +0000177 addi r4,0,pb6cr
178 mtdcr ebccfga,r4
179 addis r4,0,CS6_CR@h
180 ori r4,r4,CS5_CR@l
181 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000182
wdenk57b2d802003-06-27 21:31:46 +0000183 /*----------------------------------------------------------------------- */
184 /* Memory Bank 7 (CPU LED1) initialization */
185 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000186
wdenk57b2d802003-06-27 21:31:46 +0000187 addi r4,0,pb7ap
188 mtdcr ebccfga,r4
189 addis r4,0,CS7_AP@h
190 ori r4,r4,CS7_AP@l
191 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000192
wdenk57b2d802003-06-27 21:31:46 +0000193 addi r4,0,pb7cr
194 mtdcr ebccfga,r4
195 addis r4,0,CS7_CR@h
196 ori r4,r4,CS7_CR@l
197 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000198
199/* addis r4,r0,FPGA_BRDC@h */
wdenk57b2d802003-06-27 21:31:46 +0000200/* ori r4,r4,FPGA_BRDC@l */
201/* lbz r3,0(r4) /###*get FPGA board control reg */
202/* eieio */
203/* ori r3,r3,0x01 /###*set UART1 control to select CTS/RTS */
wdenkfe8c2802002-11-03 00:38:21 +0000204/* stb r3,0(r4) */
205
206 nop /* pass2 DCR errata #8 */
wdenk57b2d802003-06-27 21:31:46 +0000207 blr
wdenkfe8c2802002-11-03 00:38:21 +0000208
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/*----------------------------------------------------------------------------- */
wdenk57b2d802003-06-27 21:31:46 +0000216 .globl sdram_init
wdenkfe8c2802002-11-03 00:38:21 +0000217
218sdram_init:
219
220 mflr r31
221
222#ifdef CFG_SDRAM_MANUALLY
wdenk57b2d802003-06-27 21:31:46 +0000223 /*------------------------------------------------------------------- */
224 /* Set MB0CF for bank 0. (0-32MB) Address Mode 4 since 12x8(2) */
225 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000226
wdenk57b2d802003-06-27 21:31:46 +0000227 addi r4,0,mem_mb0cf
228 mtdcr memcfga,r4
229 addis r4,0,MB0CF@h
230 ori r4,r4,MB0CF@l
231 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000232
wdenk57b2d802003-06-27 21:31:46 +0000233 /*------------------------------------------------------------------- */
234 /* Set MB1CF for bank 1. (32MB-64MB) Address Mode 4 since 12x8(2) */
235 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000236
wdenk57b2d802003-06-27 21:31:46 +0000237 addi r4,0,mem_mb1cf
238 mtdcr memcfga,r4
239 addis r4,0,MB1CF@h
240 ori r4,r4,MB1CF@l
241 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000242
wdenk57b2d802003-06-27 21:31:46 +0000243 /*------------------------------------------------------------------- */
244 /* Set MB2CF for bank 2. off */
245 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000246
wdenk57b2d802003-06-27 21:31:46 +0000247 addi r4,0,mem_mb2cf
248 mtdcr memcfga,r4
249 addis r4,0,MB2CF@h
250 ori r4,r4,MB2CF@l
251 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000252
wdenk57b2d802003-06-27 21:31:46 +0000253 /*------------------------------------------------------------------- */
254 /* Set MB3CF for bank 3. off */
255 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000256
wdenk57b2d802003-06-27 21:31:46 +0000257 addi r4,0,mem_mb3cf
258 mtdcr memcfga,r4
259 addis r4,0,MB3CF@h
260 ori r4,r4,MB3CF@l
261 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000262
wdenk57b2d802003-06-27 21:31:46 +0000263 /*------------------------------------------------------------------- */
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. */
wdenkfe8c2802002-11-03 00:38:21 +0000266 /* 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 */
272 /* maybe 133Mhz. */
wdenk57b2d802003-06-27 21:31:46 +0000273 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000274
wdenk57b2d802003-06-27 21:31:46 +0000275 mfdcr r5,strap /* determine FBK divider */
276 /* via STRAP reg to calc PLB speed. */
277 /* SDRAM speed is the same as the PLB */
278 /* speed. */
279 rlwinm r4,r5,4,0x3 /* get FBK divide bits */
wdenkfe8c2802002-11-03 00:38:21 +0000280
281..chk_66:
wdenk57b2d802003-06-27 21:31:46 +0000282 cmpi %cr0,0,r4,0x1
283 bne ..chk_100
wdenkfe8c2802002-11-03 00:38:21 +0000284 addis r6,0,SDTR_66@h /* SDTR1 value for 66Mhz */
285 ori r6,r6,SDTR_66@l
286 addis r7,0,RTR_66 /* RTR value for 66Mhz */
wdenk57b2d802003-06-27 21:31:46 +0000287 b ..sdram_ok
wdenkfe8c2802002-11-03 00:38:21 +0000288..chk_100:
wdenk57b2d802003-06-27 21:31:46 +0000289 cmpi %cr0,0,r4,0x2
290 bne ..chk_133
291 addis r6,0,SDTR_100@h /* SDTR1 value for 100Mhz */
292 ori r6,r6,SDTR_100@l
293 addis r7,0,RTR_100 /* RTR value for 100Mhz */
294 b ..sdram_ok
wdenkfe8c2802002-11-03 00:38:21 +0000295..chk_133:
wdenk57b2d802003-06-27 21:31:46 +0000296 addis r6,0,0x0107 /* SDTR1 value for 133Mhz */
297 ori r6,r6,0x4015
298 addis r7,0,0x07F0 /* RTR value for 133Mhz */
wdenkfe8c2802002-11-03 00:38:21 +0000299
300..sdram_ok:
wdenk57b2d802003-06-27 21:31:46 +0000301 /*------------------------------------------------------------------- */
302 /* Set SDTR1 */
303 /*------------------------------------------------------------------- */
304 addi r4,0,mem_sdtr1
305 mtdcr memcfga,r4
306 mtdcr memcfgd,r6
wdenkfe8c2802002-11-03 00:38:21 +0000307
wdenk57b2d802003-06-27 21:31:46 +0000308 /*------------------------------------------------------------------- */
309 /* Set RTR */
310 /*------------------------------------------------------------------- */
311 addi r4,0,mem_rtr
312 mtdcr memcfga,r4
313 mtdcr memcfgd,r7
wdenkfe8c2802002-11-03 00:38:21 +0000314
wdenk57b2d802003-06-27 21:31:46 +0000315 /*------------------------------------------------------------------- */
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 /*------------------------------------------------------------------- */
320 addis r3,0,0x0000
321 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
322 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +0000323..spinlp2:
wdenk57b2d802003-06-27 21:31:46 +0000324 bdnz ..spinlp2 /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +0000325
wdenk57b2d802003-06-27 21:31:46 +0000326 /*------------------------------------------------------------------- */
327 /* Set memory controller options reg, MCOPT1. */
wdenkfe8c2802002-11-03 00:38:21 +0000328 /* Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst */
329 /* read/prefetch. */
wdenk57b2d802003-06-27 21:31:46 +0000330 /*------------------------------------------------------------------- */
331 addi r4,0,mem_mcopt1
332 mtdcr memcfga,r4
333 addis r4,0,0x8080 /* set DC_EN=1 */
334 ori r4,r4,0x0000
335 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000336
wdenk57b2d802003-06-27 21:31:46 +0000337 /*------------------------------------------------------------------- */
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 /*------------------------------------------------------------------- */
344 addis r3,0,0x001E
345 ori r3,r3,0x8480 /* ensure 10msec have passed since reset */
346 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +0000347..spinlp3:
wdenk57b2d802003-06-27 21:31:46 +0000348 bdnz ..spinlp3 /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +0000349
350#else
351/*fixme: do SDRAM Autoconfig from EEPROM here */
352
353#endif
wdenk57b2d802003-06-27 21:31:46 +0000354 mtlr r31 /* restore lr */
355 blr