blob: 84852184de8d65167b57ec94115e8b64f056767d [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Stefan Roese153b3e22007-10-05 17:10:59 +02002 * (C) Copyright 2000-2007
wdenkc6097192002-11-03 00:24:07 +00003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
wdenkc6097192002-11-03 00:24:07 +000025 * CPU specific code
26 *
27 * written or collected and sometimes rewritten by
28 * Magnus Damm <damm@bitsmart.com>
29 *
30 * minor modifications by
31 * Wolfgang Denk <wd@denx.de>
32 */
33
34#include <common.h>
35#include <watchdog.h>
36#include <command.h>
37#include <asm/cache.h>
Stefan Roese247e9d72010-09-09 19:18:00 +020038#include <asm/ppc4xx.h>
Ben Warren9e37c582008-10-27 23:53:17 -070039#include <netdev.h>
wdenkc6097192002-11-03 00:24:07 +000040
Wolfgang Denk6405a152006-03-31 18:32:53 +020041DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denk6405a152006-03-31 18:32:53 +020042
Stefan Roese03687752006-10-07 11:30:52 +020043void board_reset(void);
Stefan Roese03687752006-10-07 11:30:52 +020044
Adam Grahamc31ff682008-10-08 10:13:19 -070045/*
46 * To provide an interface to detect CPU number for boards that support
47 * more then one CPU, we implement the "weak" default functions here.
48 *
49 * Returns CPU number
50 */
51int __get_cpu_num(void)
52{
53 return NA_OR_UNKNOWN_CPU;
54}
55int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
56
Stefan Roese9f500fa2009-07-06 11:44:33 +020057#if defined(CONFIG_PCI)
Stefan Roese42fbddd2006-09-07 11:51:23 +020058#if defined(CONFIG_405GP) || \
59 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
60 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010061
62#define PCI_ASYNC
63
Stefan Roese6964fd62007-11-09 12:18:54 +010064static int pci_async_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010065{
66#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020067 return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010068#endif
69
Stefan Roese42fbddd2006-09-07 11:51:23 +020070#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +010071 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
72 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese99644742005-11-29 18:18:21 +010073 unsigned long val;
74
Stefan Roese918010a2009-09-09 16:25:29 +020075 mfsdr(SDR0_SDSTP1, val);
Stefan Roese99644742005-11-29 18:18:21 +010076 return (val & SDR0_SDSTP1_PAME_MASK);
77#endif
78}
79#endif
Stefan Roese9f500fa2009-07-06 11:44:33 +020080#endif /* CONFIG_PCI */
Stefan Roese99644742005-11-29 18:18:21 +010081
Stefan Roese153b3e22007-10-05 17:10:59 +020082#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
83 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roese5d8033e2009-11-12 16:41:09 +010084int pci_arbiter_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010085{
86#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020087 return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
Stefan Roese99644742005-11-29 18:18:21 +010088#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010089
Stefan Roese99644742005-11-29 18:18:21 +010090#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +020091 return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010092#endif
93
94#if defined(CONFIG_440GP)
Stefan Roese918010a2009-09-09 16:25:29 +020095 return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
Stefan Roese99644742005-11-29 18:18:21 +010096#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010097
Stefan Roese84382432007-02-02 12:44:22 +010098#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010099 unsigned long val;
100
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200101 mfsdr(SDR0_XCR0, val);
102 return (val & SDR0_XCR0_PAE_MASK);
Stefan Roese84382432007-02-02 12:44:22 +0100103#endif
104#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +0100105 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
106 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese84382432007-02-02 12:44:22 +0100107 unsigned long val;
108
Stefan Roese918010a2009-09-09 16:25:29 +0200109 mfsdr(SDR0_PCI0, val);
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200110 return (val & SDR0_PCI0_PAE_MASK);
Stefan Roese42f2a822005-11-27 19:36:26 +0100111#endif
Stefan Roese99644742005-11-29 18:18:21 +0100112}
113#endif
114
Stefan Roese6964fd62007-11-09 12:18:54 +0100115#if defined(CONFIG_405EP)
Stefan Roese99644742005-11-29 18:18:21 +0100116#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100117
Stefan Roese6964fd62007-11-09 12:18:54 +0100118static int i2c_bootrom_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +0100119{
120#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +0200121 return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200122#else
Stefan Roese99644742005-11-29 18:18:21 +0100123 unsigned long val;
124
Stefan Roese918010a2009-09-09 16:25:29 +0200125 mfsdr(SDR0_SDCS0, val);
Stefan Roese99644742005-11-29 18:18:21 +0100126 return (val & SDR0_SDCS_SDD);
127#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200128}
Stefan Roese3a75ac12007-04-18 12:05:59 +0200129#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200130
131#if defined(CONFIG_440GX)
132#define SDR0_PINSTP_SHIFT 29
133static char *bootstrap_str[] = {
134 "EBC (16 bits)",
135 "EBC (8 bits)",
136 "EBC (32 bits)",
137 "EBC (8 bits)",
138 "PCI",
139 "I2C (Addr 0x54)",
140 "Reserved",
141 "I2C (Addr 0x50)",
142};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200143static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200144#endif
145
146#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
147#define SDR0_PINSTP_SHIFT 30
148static char *bootstrap_str[] = {
149 "EBC (8 bits)",
150 "PCI",
151 "I2C (Addr 0x54)",
152 "I2C (Addr 0x50)",
153};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200154static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese42fbddd2006-09-07 11:51:23 +0200155#endif
156
157#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
158#define SDR0_PINSTP_SHIFT 29
159static char *bootstrap_str[] = {
160 "EBC (8 bits)",
161 "PCI",
162 "NAND (8 bits)",
163 "EBC (16 bits)",
164 "EBC (16 bits)",
165 "I2C (Addr 0x54)",
166 "PCI",
167 "I2C (Addr 0x52)",
168};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200169static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200170#endif
171
172#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
173#define SDR0_PINSTP_SHIFT 29
174static char *bootstrap_str[] = {
175 "EBC (8 bits)",
176 "EBC (16 bits)",
177 "EBC (16 bits)",
178 "NAND (8 bits)",
179 "PCI",
180 "I2C (Addr 0x54)",
181 "PCI",
182 "I2C (Addr 0x52)",
183};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200184static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200185#endif
186
Stefan Roesecc019d12008-03-11 15:05:50 +0100187#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
188#define SDR0_PINSTP_SHIFT 29
189static char *bootstrap_str[] = {
190 "EBC (8 bits)",
191 "EBC (16 bits)",
192 "PCI",
193 "PCI",
194 "EBC (16 bits)",
195 "NAND (8 bits)",
196 "I2C (Addr 0x54)", /* A8 */
197 "I2C (Addr 0x52)", /* A4 */
198};
Felix Radenskye6be1452010-01-19 17:37:13 +0200199static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
Stefan Roesecc019d12008-03-11 15:05:50 +0100200#endif
201
Feng Kan224bc962008-07-08 22:47:31 -0700202#if defined(CONFIG_460SX)
203#define SDR0_PINSTP_SHIFT 29
204static char *bootstrap_str[] = {
205 "EBC (8 bits)",
206 "EBC (16 bits)",
207 "EBC (32 bits)",
208 "NAND (8 bits)",
209 "I2C (Addr 0x54)", /* A8 */
210 "I2C (Addr 0x52)", /* A4 */
211};
212static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
213#endif
214
Stefan Roese3a75ac12007-04-18 12:05:59 +0200215#if defined(CONFIG_405EZ)
216#define SDR0_PINSTP_SHIFT 28
217static char *bootstrap_str[] = {
218 "EBC (8 bits)",
219 "SPI (fast)",
220 "NAND (512 page, 4 addr cycle)",
221 "I2C (Addr 0x50)",
222 "EBC (32 bits)",
223 "I2C (Addr 0x50)",
224 "NAND (2K page, 5 addr cycle)",
225 "I2C (Addr 0x50)",
226 "EBC (16 bits)",
227 "Reserved",
228 "NAND (2K page, 4 addr cycle)",
229 "I2C (Addr 0x50)",
230 "NAND (512 page, 3 addr cycle)",
231 "I2C (Addr 0x50)",
232 "SPI (slow)",
233 "I2C (Addr 0x50)",
234};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200235static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
236 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese3a75ac12007-04-18 12:05:59 +0200237#endif
238
Stefan Roese153b3e22007-10-05 17:10:59 +0200239#if defined(CONFIG_405EX)
240#define SDR0_PINSTP_SHIFT 29
241static char *bootstrap_str[] = {
242 "EBC (8 bits)",
243 "EBC (16 bits)",
244 "EBC (16 bits)",
245 "NAND (8 bits)",
246 "NAND (8 bits)",
247 "I2C (Addr 0x54)",
248 "EBC (8 bits)",
249 "I2C (Addr 0x52)",
250};
251static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
252#endif
253
Stefan Roese42fbddd2006-09-07 11:51:23 +0200254#if defined(SDR0_PINSTP_SHIFT)
255static int bootstrap_option(void)
256{
257 unsigned long val;
258
Stefan Roese918010a2009-09-09 16:25:29 +0200259 mfsdr(SDR0_PINSTP, val);
Stefan Roese3a75ac12007-04-18 12:05:59 +0200260 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100261}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200262#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100263
264
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200265#if defined(CONFIG_440GP)
Stefan Roese6964fd62007-11-09 12:18:54 +0100266static int do_chip_reset (unsigned long sys0, unsigned long sys1)
267{
Stefan Roese918010a2009-09-09 16:25:29 +0200268 /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
Stefan Roese6964fd62007-11-09 12:18:54 +0100269 * reset.
270 */
Stefan Roese918010a2009-09-09 16:25:29 +0200271 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000); /* Set SWE */
272 mtdcr (CPC0_SYS0, sys0);
273 mtdcr (CPC0_SYS1, sys1);
274 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000); /* Clr SWE */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200275 mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
Stefan Roese6964fd62007-11-09 12:18:54 +0100276
277 return 1;
278}
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200279#endif /* CONFIG_440GP */
wdenkc6097192002-11-03 00:24:07 +0000280
wdenkc6097192002-11-03 00:24:07 +0000281
282int checkcpu (void)
283{
Stefan Roese42f2a822005-11-27 19:36:26 +0100284#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-11-27 19:36:26 +0100285 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000286 ulong clock = gd->cpu_clk;
287 char buf[32];
Stefan Roese048f5a62009-07-29 08:45:27 +0200288#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
289 u32 reg;
290#endif
wdenkc6097192002-11-03 00:24:07 +0000291
Stefan Roese42f2a822005-11-27 19:36:26 +0100292#if !defined(CONFIG_IOP480)
Wolfgang Denk65505432006-10-20 17:54:33 +0200293 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100294 sys_info_t sys_info;
Adam Grahamc31ff682008-10-08 10:13:19 -0700295 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000296
Adam Grahamc31ff682008-10-08 10:13:19 -0700297 cpu_num = get_cpu_num();
298 if (cpu_num >= 0)
299 printf("CPU%d: ", cpu_num);
300 else
301 puts("CPU: ");
wdenkc6097192002-11-03 00:24:07 +0000302
303 get_sys_info(&sys_info);
304
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200305#if defined(CONFIG_XILINX_440)
306 puts("IBM PowerPC 4");
307#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100308 puts("AMCC PowerPC 4");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200309#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100310
Stefan Roese17ffbc82007-03-21 13:38:59 +0100311#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200312 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
313 defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100314 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000315#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100316#if defined(CONFIG_440)
Stefan Roesecc019d12008-03-11 15:05:50 +0100317#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
318 puts("60");
319#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100320 puts("40");
stroese434979e2003-05-23 11:18:02 +0000321#endif
Stefan Roesecc019d12008-03-11 15:05:50 +0100322#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100323
wdenkc6097192002-11-03 00:24:07 +0000324 switch (pvr) {
325 case PVR_405GP_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100326 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000327 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100328
wdenkc6097192002-11-03 00:24:07 +0000329 case PVR_405GP_RC:
Stefan Roese42f2a822005-11-27 19:36:26 +0100330 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000331 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100332
wdenkc6097192002-11-03 00:24:07 +0000333 case PVR_405GP_RD:
Stefan Roese42f2a822005-11-27 19:36:26 +0100334 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000335 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100336
wdenkc35ba4e2004-03-14 22:25:36 +0000337#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100338 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
339 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000340 break;
341#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100342
wdenkc6097192002-11-03 00:24:07 +0000343 case PVR_405CR_RA:
Stefan Roese42f2a822005-11-27 19:36:26 +0100344 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000345 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100346
wdenkc6097192002-11-03 00:24:07 +0000347 case PVR_405CR_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100348 puts("CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000349 break;
wdenkc6097192002-11-03 00:24:07 +0000350
Stefan Roese42f2a822005-11-27 19:36:26 +0100351#ifdef CONFIG_405CR
352 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
353 puts("CR Rev. C");
354 break;
wdenkc6097192002-11-03 00:24:07 +0000355#endif
356
Stefan Roese42f2a822005-11-27 19:36:26 +0100357 case PVR_405GPR_RB:
358 puts("GPr Rev. B");
359 break;
wdenkc6097192002-11-03 00:24:07 +0000360
Stefan Roese42f2a822005-11-27 19:36:26 +0100361 case PVR_405EP_RB:
362 puts("EP Rev. B");
363 break;
wdenkc6097192002-11-03 00:24:07 +0000364
Stefan Roese17ffbc82007-03-21 13:38:59 +0100365 case PVR_405EZ_RA:
366 puts("EZ Rev. A");
367 break;
368
Stefan Roese153b3e22007-10-05 17:10:59 +0200369 case PVR_405EX1_RA:
370 puts("EX Rev. A");
371 strcpy(addstr, "Security support");
372 break;
373
Stefan Roese153b3e22007-10-05 17:10:59 +0200374 case PVR_405EXR2_RA:
375 puts("EXr Rev. A");
376 strcpy(addstr, "No Security support");
377 break;
378
Stefan Roesefbf24302008-05-13 20:22:01 +0200379 case PVR_405EX1_RC:
380 puts("EX Rev. C");
381 strcpy(addstr, "Security support");
382 break;
383
384 case PVR_405EX2_RC:
385 puts("EX Rev. C");
386 strcpy(addstr, "No Security support");
387 break;
388
389 case PVR_405EXR1_RC:
390 puts("EXr Rev. C");
391 strcpy(addstr, "Security support");
392 break;
393
394 case PVR_405EXR2_RC:
395 puts("EXr Rev. C");
396 strcpy(addstr, "No Security support");
397 break;
398
Stefan Roesef1a80e42009-10-06 07:21:08 +0200399 case PVR_405EX1_RD:
400 puts("EX Rev. D");
401 strcpy(addstr, "Security support");
402 break;
403
404 case PVR_405EX2_RD:
405 puts("EX Rev. D");
406 strcpy(addstr, "No Security support");
407 break;
408
409 case PVR_405EXR1_RD:
410 puts("EXr Rev. D");
411 strcpy(addstr, "Security support");
412 break;
413
414 case PVR_405EXR2_RD:
415 puts("EXr Rev. D");
416 strcpy(addstr, "No Security support");
417 break;
418
wdenkc6097192002-11-03 00:24:07 +0000419#if defined(CONFIG_440)
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200420#if defined(CONFIG_440GP)
wdenk57b2d802003-06-27 21:31:46 +0000421 case PVR_440GP_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200422 puts("GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000423 /* See errata 1.12: CHIP_4 */
Stefan Roese918010a2009-09-09 16:25:29 +0200424 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
425 (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
wdenka4685fe2003-09-03 14:03:26 +0000426 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
427 "Resetting chip ...\n");
428 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
Stefan Roese918010a2009-09-09 16:25:29 +0200429 do_chip_reset ( mfdcr(CPC0_STRP0),
430 mfdcr(CPC0_STRP1) );
wdenka4685fe2003-09-03 14:03:26 +0000431 }
wdenkc6097192002-11-03 00:24:07 +0000432 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100433
wdenk57b2d802003-06-27 21:31:46 +0000434 case PVR_440GP_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200435 puts("GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000436 break;
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200437#endif /* CONFIG_440GP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100438
wdenk544e9732004-02-06 23:19:44 +0000439 case PVR_440GX_RA:
Stefan Roese326c9712005-08-01 16:41:48 +0200440 puts("GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000441 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100442
wdenk544e9732004-02-06 23:19:44 +0000443 case PVR_440GX_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200444 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000445 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100446
stroesec0125272005-04-07 05:33:41 +0000447 case PVR_440GX_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200448 puts("GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000449 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100450
Stefan Roese08fb4042005-11-01 10:08:03 +0100451 case PVR_440GX_RF:
452 puts("GX Rev. F");
453 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100454
Stefan Roese326c9712005-08-01 16:41:48 +0200455 case PVR_440EP_RA:
456 puts("EP Rev. A");
457 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100458
Stefan Roese95258d52005-10-04 15:00:30 +0200459#ifdef CONFIG_440EP
460 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese326c9712005-08-01 16:41:48 +0200461 puts("EP Rev. B");
462 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200463
464 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
465 puts("EP Rev. C");
466 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200467#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100468
Stefan Roese95258d52005-10-04 15:00:30 +0200469#ifdef CONFIG_440GR
470 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
471 puts("GR Rev. A");
472 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200473
Stefan Roese96467d62006-05-18 19:21:53 +0200474 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese31ce7de2006-05-10 14:10:41 +0200475 puts("GR Rev. B");
476 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200477#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100478#endif /* CONFIG_440 */
479
Stefan Roese188fab62007-01-31 16:56:10 +0100480#ifdef CONFIG_440EPX
481 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200482 puts("EPx Rev. A");
483 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200484 break;
485
Stefan Roese188fab62007-01-31 16:56:10 +0100486 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200487 puts("EPx Rev. A");
488 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200489 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100490#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200491
Stefan Roese188fab62007-01-31 16:56:10 +0100492#ifdef CONFIG_440GRX
493 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200494 puts("GRx Rev. A");
495 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200496 break;
497
Stefan Roese188fab62007-01-31 16:56:10 +0100498 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200499 puts("GRx Rev. A");
500 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200501 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100502#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200503
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100504 case PVR_440SP_6_RAB:
505 puts("SP Rev. A/B");
506 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100507 break;
508
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100509 case PVR_440SP_RAB:
510 puts("SP Rev. A/B");
511 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100512 break;
513
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100514 case PVR_440SP_6_RC:
515 puts("SP Rev. C");
516 strcpy(addstr, "RAID 6 support");
517 break;
518
Stefan Roesec6d59302006-11-28 16:09:24 +0100519 case PVR_440SP_RC:
520 puts("SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100521 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100522 break;
523
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100524 case PVR_440SPe_6_RA:
525 puts("SPe Rev. A");
526 strcpy(addstr, "RAID 6 support");
527 break;
528
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200529 case PVR_440SPe_RA:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200530 puts("SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100531 strcpy(addstr, "No RAID 6 support");
532 break;
533
534 case PVR_440SPe_6_RB:
535 puts("SPe Rev. B");
536 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200537 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200538
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200539 case PVR_440SPe_RB:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200540 puts("SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100541 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200542 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200543
Stefan Roese048f5a62009-07-29 08:45:27 +0200544#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesecc019d12008-03-11 15:05:50 +0100545 case PVR_460EX_RA:
546 puts("EX Rev. A");
547 strcpy(addstr, "No Security/Kasumi support");
548 break;
549
550 case PVR_460EX_SE_RA:
551 puts("EX Rev. A");
552 strcpy(addstr, "Security/Kasumi support");
553 break;
554
Stefan Roese048f5a62009-07-29 08:45:27 +0200555 case PVR_460EX_RB:
556 puts("EX Rev. B");
557 mfsdr(SDR0_ECID3, reg);
558 if (reg & 0x00100000)
559 strcpy(addstr, "No Security/Kasumi support");
560 else
561 strcpy(addstr, "Security/Kasumi support");
562 break;
563
Stefan Roesecc019d12008-03-11 15:05:50 +0100564 case PVR_460GT_RA:
565 puts("GT Rev. A");
566 strcpy(addstr, "No Security/Kasumi support");
567 break;
568
569 case PVR_460GT_SE_RA:
570 puts("GT Rev. A");
571 strcpy(addstr, "Security/Kasumi support");
572 break;
Stefan Roese048f5a62009-07-29 08:45:27 +0200573
574 case PVR_460GT_RB:
575 puts("GT Rev. B");
576 mfsdr(SDR0_ECID3, reg);
577 if (reg & 0x00100000)
578 strcpy(addstr, "No Security/Kasumi support");
579 else
580 strcpy(addstr, "Security/Kasumi support");
581 break;
582#endif
Stefan Roesecc019d12008-03-11 15:05:50 +0100583
Feng Kan224bc962008-07-08 22:47:31 -0700584 case PVR_460SX_RA:
585 puts("SX Rev. A");
586 strcpy(addstr, "Security support");
587 break;
588
589 case PVR_460SX_RA_V1:
590 puts("SX Rev. A");
591 strcpy(addstr, "No Security support");
592 break;
593
594 case PVR_460GX_RA:
595 puts("GX Rev. A");
596 strcpy(addstr, "Security support");
597 break;
598
599 case PVR_460GX_RA_V1:
600 puts("GX Rev. A");
601 strcpy(addstr, "No Security support");
602 break;
603
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200604 case PVR_VIRTEX5:
605 puts("x5 VIRTEX5");
606 break;
607
wdenk57b2d802003-06-27 21:31:46 +0000608 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200609 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000610 break;
611 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100612
Stefan Roesee620ff12009-10-19 14:44:11 +0200613 printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
614 strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100615 sys_info.freqPLB / 1000000,
616 get_OPB_freq() / 1000000,
Stefan Roese153b3e22007-10-05 17:10:59 +0200617 sys_info.freqEBC / 1000000);
Stefan Roesee620ff12009-10-19 14:44:11 +0200618#if defined(CONFIG_PCI) && \
619 (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
620 defined(CONFIG_440GR) || defined(CONFIG_440GRX))
621 printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
622#endif
623 printf(")\n");
Stefan Roese42f2a822005-11-27 19:36:26 +0100624
Stefan Roese11dd8812006-10-18 15:59:35 +0200625 if (addstr[0] != 0)
626 printf(" %s\n", addstr);
627
Stefan Roese99644742005-11-29 18:18:21 +0100628#if defined(I2C_BOOTROM)
629 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200630#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200631#if defined(SDR0_PINSTP_SHIFT)
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200632 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese8ebdb922009-04-15 10:50:48 +0200633 printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
634#ifdef CONFIG_NAND_U_BOOT
635 puts(", booting from NAND");
636#endif /* CONFIG_NAND_U_BOOT */
637 putc('\n');
Wolfgang Denk65505432006-10-20 17:54:33 +0200638#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100639
Stefan Roese153b3e22007-10-05 17:10:59 +0200640#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese99644742005-11-29 18:18:21 +0100641 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100642#endif
643
Stefan Roesef5150122009-05-27 10:34:32 +0200644#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
Stefan Roese99644742005-11-29 18:18:21 +0100645 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100646 printf (", PCI async ext clock used");
647 } else {
648 printf (", PCI sync clock at %lu MHz",
649 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
650 }
wdenkc6097192002-11-03 00:24:07 +0000651#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100652
Stefan Roese153b3e22007-10-05 17:10:59 +0200653#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100654 putc('\n');
655#endif
656
Stefan Roese153b3e22007-10-05 17:10:59 +0200657#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100658 printf (" 16 kB I-Cache 16 kB D-Cache");
659#elif defined(CONFIG_440)
660 printf (" 32 kB I-Cache 32 kB D-Cache");
661#else
662 printf (" 16 kB I-Cache %d kB D-Cache",
663 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
664#endif
665#endif /* !defined(CONFIG_IOP480) */
666
667#if defined(CONFIG_IOP480)
668 printf ("PLX IOP480 (PVR=%08x)", pvr);
669 printf (" at %s MHz:", strmhz(buf, clock));
670 printf (" %u kB I-Cache", 4);
671 printf (" %u kB D-Cache", 2);
672#endif
673
674#endif /* !defined(CONFIG_405) */
675
676 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000677
678 return 0;
679}
680
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200681int ppc440spe_revB() {
682 unsigned int pvr;
683
684 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100685 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200686 return 1;
687 else
688 return 0;
689}
wdenkc6097192002-11-03 00:24:07 +0000690
691/* ------------------------------------------------------------------------- */
692
Wolfgang Denk6262d0212010-06-28 22:00:46 +0200693int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenkc6097192002-11-03 00:24:07 +0000694{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100695#if defined(CONFIG_BOARD_RESET)
696 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100697#else
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200698#if defined(CONFIG_SYS_4xx_RESET_TYPE)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200699 mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200700#else
wdenk57b2d802003-06-27 21:31:46 +0000701 /*
702 * Initiate system reset in debug control register DBCR
703 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200704 mtspr(SPRN_DBCR0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200705#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200706#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200707
wdenkc6097192002-11-03 00:24:07 +0000708 return 1;
709}
wdenkc6097192002-11-03 00:24:07 +0000710
711
712/*
713 * Get timebase clock frequency
714 */
715unsigned long get_tbclk (void)
716{
Stefan Roese42f2a822005-11-27 19:36:26 +0100717#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000718 sys_info_t sys_info;
719
720 get_sys_info(&sys_info);
721 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000722#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100723 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000724#endif
725
726}
727
728
729#if defined(CONFIG_WATCHDOG)
Stefan Roese6964fd62007-11-09 12:18:54 +0100730void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000731{
732 int re_enable = disable_interrupts();
733 reset_4xx_watchdog();
734 if (re_enable) enable_interrupts();
735}
736
Stefan Roese6964fd62007-11-09 12:18:54 +0100737void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000738{
739 /*
740 * Clear TSR(WIS) bit
741 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200742 mtspr(SPRN_TSR, 0x40000000);
wdenkc6097192002-11-03 00:24:07 +0000743}
744#endif /* CONFIG_WATCHDOG */
Ben Warren9e37c582008-10-27 23:53:17 -0700745
746/*
747 * Initializes on-chip ethernet controllers.
748 * to override, implement board_eth_init()
749 */
750int cpu_eth_init(bd_t *bis)
751{
752#if defined(CONFIG_PPC4xx_EMAC)
753 ppc_4xx_eth_initialize(bis);
754#endif
755 return 0;
756}