blob: 4820dd08c7fe6030d6ccdff8d485a8f15b499d2a [file] [log] [blame]
wdenkfe8c2802002-11-03 00:38:21 +00001/*------------------------------------------------------------------------------+ */
2/* */
Josh Boyer31773492009-08-07 13:53:20 -04003/* 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 */
5/* below. */
6/* */
wdenkfe8c2802002-11-03 00:38:21 +00007/* 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. */
13/* */
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. */
17/* */
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. */
21/* */
22/* COPYRIGHT I B M CORPORATION 1995 */
23/* LICENSED MATERIAL - PROGRAM PROPERTY OF I B M */
24/*------------------------------------------------------------------------------- */
25
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. */
35/* */
36/*----------------------------------------------------------------------------- */
37#include <config.h>
38#include <ppc4xx.h>
39
40#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
41
42#include <ppc_asm.tmpl>
43#include <ppc_defs.h>
44
45#include <asm/cache.h>
46#include <asm/mmu.h>
47
48
wdenk8bde7f72003-06-27 21:31:46 +000049 .globl ext_bus_cntlr_init
wdenkfe8c2802002-11-03 00:38:21 +000050ext_bus_cntlr_init:
wdenk8bde7f72003-06-27 21:31:46 +000051 mflr r4 /* save link register */
52 bl ..getAddr
wdenkfe8c2802002-11-03 00:38:21 +000053..getAddr:
wdenk8bde7f72003-06-27 21:31:46 +000054 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) */
wdenkfe8c2802002-11-03 00:38:21 +000059..ebcloop:
wdenk8bde7f72003-06-27 21:31:46 +000060 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 */
wdenkfe8c2802002-11-03 00:38:21 +000063
wdenk8bde7f72003-06-27 21:31:46 +000064 /*------------------------------------------------------------------- */
65 /* Delay to ensure all accesses to ROM are complete before changing */
wdenkfe8c2802002-11-03 00:38:21 +000066 /* bank 0 timings. 200usec should be enough. */
wdenk8bde7f72003-06-27 21:31:46 +000067 /* 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */
68 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000069 addis r3,0,0x0
wdenk8bde7f72003-06-27 21:31:46 +000070 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
71 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +000072..spinlp:
wdenk8bde7f72003-06-27 21:31:46 +000073 bdnz ..spinlp /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +000074
wdenk8bde7f72003-06-27 21:31:46 +000075 /*----------------------------------------------------------------------- */
76 /* Memory Bank 0 (Flash) initialization (from openbios) */
77 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000078
wdenk8bde7f72003-06-27 21:31:46 +000079 addi r4,0,pb0ap
80 mtdcr ebccfga,r4
81 addis r4,0,CS0_AP@h
82 ori r4,r4,CS0_AP@l
83 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +000084
wdenk8bde7f72003-06-27 21:31:46 +000085 addi r4,0,pb0cr
86 mtdcr ebccfga,r4
87 addis r4,0,CS0_CR@h
88 ori r4,r4,CS0_CR@l
89 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +000090
wdenk8bde7f72003-06-27 21:31:46 +000091 /*----------------------------------------------------------------------- */
92 /* Memory Bank 1 (NVRAM/RTC) initialization */
93 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +000094
wdenk8bde7f72003-06-27 21:31:46 +000095 addi r4,0,pb1ap
96 mtdcr ebccfga,r4
97 addis r4,0,CS1_AP@h
98 ori r4,r4,CS1_AP@l
99 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000100
wdenk8bde7f72003-06-27 21:31:46 +0000101 addi r4,0,pb1cr
102 mtdcr ebccfga,r4
103 addis r4,0,CS1_CR@h
104 ori r4,r4,CS1_CR@l
105 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000106
wdenk8bde7f72003-06-27 21:31:46 +0000107 /*----------------------------------------------------------------------- */
108 /* Memory Bank 2 (A/D converter) initialization */
109 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000110
wdenk8bde7f72003-06-27 21:31:46 +0000111 addi r4,0,pb2ap
112 mtdcr ebccfga,r4
113 addis r4,0,CS2_AP@h
114 ori r4,r4,CS2_AP@l
115 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000116
wdenk8bde7f72003-06-27 21:31:46 +0000117 addi r4,0,pb2cr
118 mtdcr ebccfga,r4
119 addis r4,0,CS2_CR@h
120 ori r4,r4,CS2_CR@l
121 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000122
wdenk8bde7f72003-06-27 21:31:46 +0000123 /*----------------------------------------------------------------------- */
124 /* Memory Bank 3 (Ethernet PHY Reset) initialization */
125 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000126
wdenk8bde7f72003-06-27 21:31:46 +0000127 addi r4,0,pb3ap
128 mtdcr ebccfga,r4
129 addis r4,0,CS3_AP@h
130 ori r4,r4,CS3_AP@l
131 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000132
wdenk8bde7f72003-06-27 21:31:46 +0000133 addi r4,0,pb3cr
134 mtdcr ebccfga,r4
135 addis r4,0,CS3_CR@h
136 ori r4,r4,CS3_CR@l
137 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000138
wdenk8bde7f72003-06-27 21:31:46 +0000139 /*----------------------------------------------------------------------- */
140 /* Memory Bank 4 (PC-MIP PRSNT1#) initialization */
141 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000142
wdenk8bde7f72003-06-27 21:31:46 +0000143 addi r4,0,pb4ap
144 mtdcr ebccfga,r4
145 addis r4,0,CS4_AP@h
146 ori r4,r4,CS4_AP@l
147 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000148
wdenk8bde7f72003-06-27 21:31:46 +0000149 addi r4,0,pb4cr
150 mtdcr ebccfga,r4
151 addis r4,0,CS4_CR@h
152 ori r4,r4,CS4_CR@l
153 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000154
wdenk8bde7f72003-06-27 21:31:46 +0000155 /*----------------------------------------------------------------------- */
156 /* Memory Bank 5 (PC-MIP PRSNT2#) initialization */
157 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000158
wdenk8bde7f72003-06-27 21:31:46 +0000159 addi r4,0,pb5ap
160 mtdcr ebccfga,r4
161 addis r4,0,CS5_AP@h
162 ori r4,r4,CS5_AP@l
163 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000164
wdenk8bde7f72003-06-27 21:31:46 +0000165 addi r4,0,pb5cr
166 mtdcr ebccfga,r4
167 addis r4,0,CS5_CR@h
168 ori r4,r4,CS5_CR@l
169 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000170
wdenk8bde7f72003-06-27 21:31:46 +0000171 /*----------------------------------------------------------------------- */
172 /* Memory Bank 6 (CPU LED0) initialization */
173 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000174
wdenk8bde7f72003-06-27 21:31:46 +0000175 addi r4,0,pb6ap
176 mtdcr ebccfga,r4
177 addis r4,0,CS6_AP@h
178 ori r4,r4,CS6_AP@l
179 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000180
wdenk8bde7f72003-06-27 21:31:46 +0000181 addi r4,0,pb6cr
182 mtdcr ebccfga,r4
183 addis r4,0,CS6_CR@h
184 ori r4,r4,CS5_CR@l
185 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000186
wdenk8bde7f72003-06-27 21:31:46 +0000187 /*----------------------------------------------------------------------- */
188 /* Memory Bank 7 (CPU LED1) initialization */
189 /*----------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000190
wdenk8bde7f72003-06-27 21:31:46 +0000191 addi r4,0,pb7ap
192 mtdcr ebccfga,r4
193 addis r4,0,CS7_AP@h
194 ori r4,r4,CS7_AP@l
195 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000196
wdenk8bde7f72003-06-27 21:31:46 +0000197 addi r4,0,pb7cr
198 mtdcr ebccfga,r4
199 addis r4,0,CS7_CR@h
200 ori r4,r4,CS7_CR@l
201 mtdcr ebccfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000202
203/* addis r4,r0,FPGA_BRDC@h */
wdenk8bde7f72003-06-27 21:31:46 +0000204/* ori r4,r4,FPGA_BRDC@l */
205/* lbz r3,0(r4) /###*get FPGA board control reg */
206/* eieio */
207/* ori r3,r3,0x01 /###*set UART1 control to select CTS/RTS */
wdenkfe8c2802002-11-03 00:38:21 +0000208/* stb r3,0(r4) */
209
210 nop /* pass2 DCR errata #8 */
wdenk8bde7f72003-06-27 21:31:46 +0000211 blr
wdenkfe8c2802002-11-03 00:38:21 +0000212
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/*----------------------------------------------------------------------------- */
wdenk8bde7f72003-06-27 21:31:46 +0000220 .globl sdram_init
wdenkfe8c2802002-11-03 00:38:21 +0000221
222sdram_init:
223
224 mflr r31
225
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200226#ifdef CONFIG_SYS_SDRAM_MANUALLY
wdenk8bde7f72003-06-27 21:31:46 +0000227 /*------------------------------------------------------------------- */
228 /* Set MB0CF for bank 0. (0-32MB) Address Mode 4 since 12x8(2) */
229 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000230
wdenk8bde7f72003-06-27 21:31:46 +0000231 addi r4,0,mem_mb0cf
232 mtdcr memcfga,r4
233 addis r4,0,MB0CF@h
234 ori r4,r4,MB0CF@l
235 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000236
wdenk8bde7f72003-06-27 21:31:46 +0000237 /*------------------------------------------------------------------- */
238 /* Set MB1CF for bank 1. (32MB-64MB) Address Mode 4 since 12x8(2) */
239 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000240
wdenk8bde7f72003-06-27 21:31:46 +0000241 addi r4,0,mem_mb1cf
242 mtdcr memcfga,r4
243 addis r4,0,MB1CF@h
244 ori r4,r4,MB1CF@l
245 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000246
wdenk8bde7f72003-06-27 21:31:46 +0000247 /*------------------------------------------------------------------- */
248 /* Set MB2CF for bank 2. off */
249 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000250
wdenk8bde7f72003-06-27 21:31:46 +0000251 addi r4,0,mem_mb2cf
252 mtdcr memcfga,r4
253 addis r4,0,MB2CF@h
254 ori r4,r4,MB2CF@l
255 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000256
wdenk8bde7f72003-06-27 21:31:46 +0000257 /*------------------------------------------------------------------- */
258 /* Set MB3CF for bank 3. off */
259 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000260
wdenk8bde7f72003-06-27 21:31:46 +0000261 addi r4,0,mem_mb3cf
262 mtdcr memcfga,r4
263 addis r4,0,MB3CF@h
264 ori r4,r4,MB3CF@l
265 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000266
wdenk8bde7f72003-06-27 21:31:46 +0000267 /*------------------------------------------------------------------- */
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. */
wdenkfe8c2802002-11-03 00:38:21 +0000270 /* 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 */
276 /* maybe 133Mhz. */
wdenk8bde7f72003-06-27 21:31:46 +0000277 /*------------------------------------------------------------------- */
wdenkfe8c2802002-11-03 00:38:21 +0000278
wdenk8bde7f72003-06-27 21:31:46 +0000279 mfdcr r5,strap /* determine FBK divider */
280 /* via STRAP reg to calc PLB speed. */
281 /* SDRAM speed is the same as the PLB */
282 /* speed. */
283 rlwinm r4,r5,4,0x3 /* get FBK divide bits */
wdenkfe8c2802002-11-03 00:38:21 +0000284
285..chk_66:
wdenk8bde7f72003-06-27 21:31:46 +0000286 cmpi %cr0,0,r4,0x1
287 bne ..chk_100
wdenkfe8c2802002-11-03 00:38:21 +0000288 addis r6,0,SDTR_66@h /* SDTR1 value for 66Mhz */
289 ori r6,r6,SDTR_66@l
290 addis r7,0,RTR_66 /* RTR value for 66Mhz */
wdenk8bde7f72003-06-27 21:31:46 +0000291 b ..sdram_ok
wdenkfe8c2802002-11-03 00:38:21 +0000292..chk_100:
wdenk8bde7f72003-06-27 21:31:46 +0000293 cmpi %cr0,0,r4,0x2
294 bne ..chk_133
295 addis r6,0,SDTR_100@h /* SDTR1 value for 100Mhz */
296 ori r6,r6,SDTR_100@l
297 addis r7,0,RTR_100 /* RTR value for 100Mhz */
298 b ..sdram_ok
wdenkfe8c2802002-11-03 00:38:21 +0000299..chk_133:
wdenk8bde7f72003-06-27 21:31:46 +0000300 addis r6,0,0x0107 /* SDTR1 value for 133Mhz */
301 ori r6,r6,0x4015
302 addis r7,0,0x07F0 /* RTR value for 133Mhz */
wdenkfe8c2802002-11-03 00:38:21 +0000303
304..sdram_ok:
wdenk8bde7f72003-06-27 21:31:46 +0000305 /*------------------------------------------------------------------- */
306 /* Set SDTR1 */
307 /*------------------------------------------------------------------- */
308 addi r4,0,mem_sdtr1
309 mtdcr memcfga,r4
310 mtdcr memcfgd,r6
wdenkfe8c2802002-11-03 00:38:21 +0000311
wdenk8bde7f72003-06-27 21:31:46 +0000312 /*------------------------------------------------------------------- */
313 /* Set RTR */
314 /*------------------------------------------------------------------- */
315 addi r4,0,mem_rtr
316 mtdcr memcfga,r4
317 mtdcr memcfgd,r7
wdenkfe8c2802002-11-03 00:38:21 +0000318
wdenk8bde7f72003-06-27 21:31:46 +0000319 /*------------------------------------------------------------------- */
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 /*------------------------------------------------------------------- */
324 addis r3,0,0x0000
325 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */
326 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +0000327..spinlp2:
wdenk8bde7f72003-06-27 21:31:46 +0000328 bdnz ..spinlp2 /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +0000329
wdenk8bde7f72003-06-27 21:31:46 +0000330 /*------------------------------------------------------------------- */
331 /* Set memory controller options reg, MCOPT1. */
wdenkfe8c2802002-11-03 00:38:21 +0000332 /* Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst */
333 /* read/prefetch. */
wdenk8bde7f72003-06-27 21:31:46 +0000334 /*------------------------------------------------------------------- */
335 addi r4,0,mem_mcopt1
336 mtdcr memcfga,r4
337 addis r4,0,0x8080 /* set DC_EN=1 */
338 ori r4,r4,0x0000
339 mtdcr memcfgd,r4
wdenkfe8c2802002-11-03 00:38:21 +0000340
wdenk8bde7f72003-06-27 21:31:46 +0000341 /*------------------------------------------------------------------- */
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 /*------------------------------------------------------------------- */
348 addis r3,0,0x001E
349 ori r3,r3,0x8480 /* ensure 10msec have passed since reset */
350 mtctr r3
wdenkfe8c2802002-11-03 00:38:21 +0000351..spinlp3:
wdenk8bde7f72003-06-27 21:31:46 +0000352 bdnz ..spinlp3 /* spin loop */
wdenkfe8c2802002-11-03 00:38:21 +0000353
354#else
355/*fixme: do SDRAM Autoconfig from EEPROM here */
356
357#endif
wdenk8bde7f72003-06-27 21:31:46 +0000358 mtlr r31 /* restore lr */
359 blr