blob: a676b30efe735bca9057916abfdf437d8a577397 [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Stefan Roesedbbd1252007-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>
38#include <ppc4xx.h>
39
Wolfgang Denkd87080b2006-03-31 18:32:53 +020040DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denkd87080b2006-03-31 18:32:53 +020041
Stefan Roesef3443862006-10-07 11:30:52 +020042void board_reset(void);
Stefan Roesef3443862006-10-07 11:30:52 +020043
Adam Grahamc9c11d72008-10-08 10:13:19 -070044/*
45 * To provide an interface to detect CPU number for boards that support
46 * more then one CPU, we implement the "weak" default functions here.
47 *
48 * Returns CPU number
49 */
50int __get_cpu_num(void)
51{
52 return NA_OR_UNKNOWN_CPU;
53}
54int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
55
Stefan Roese887e2ec2006-09-07 11:51:23 +020056#if defined(CONFIG_405GP) || \
57 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
58 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010059
60#define PCI_ASYNC
61
Stefan Roesec7f69c32007-11-09 12:18:54 +010062static int pci_async_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010063{
64#if defined(CONFIG_405GP)
65 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
66#endif
67
Stefan Roese887e2ec2006-09-07 11:51:23 +020068#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +010069 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
70 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010071 unsigned long val;
72
Wolfgang Denk74812662005-12-12 16:06:05 +010073 mfsdr(sdr_sdstp1, val);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010074 return (val & SDR0_SDSTP1_PAME_MASK);
75#endif
76}
77#endif
78
Stefan Roesedbbd1252007-10-05 17:10:59 +020079#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
80 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roesec7f69c32007-11-09 12:18:54 +010081static int pci_arbiter_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010082{
83#if defined(CONFIG_405GP)
84 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
85#endif
86
87#if defined(CONFIG_405EP)
88 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
89#endif
90
91#if defined(CONFIG_440GP)
92 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
93#endif
94
Stefan Roese7372ca62007-02-02 12:44:22 +010095#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010096 unsigned long val;
97
Stefan Roese7372ca62007-02-02 12:44:22 +010098 mfsdr(sdr_xcr, val);
99 return (val & 0x80000000);
100#endif
101#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +0100102 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
103 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese7372ca62007-02-02 12:44:22 +0100104 unsigned long val;
105
106 mfsdr(sdr_pci0, val);
107 return (val & 0x80000000);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100108#endif
109}
110#endif
111
Stefan Roesec7f69c32007-11-09 12:18:54 +0100112#if defined(CONFIG_405EP)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100113#define I2C_BOOTROM
114
Stefan Roesec7f69c32007-11-09 12:18:54 +0100115static int i2c_bootrom_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100116{
117#if defined(CONFIG_405EP)
118 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200119#else
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100120 unsigned long val;
121
122 mfsdr(sdr_sdcs, val);
123 return (val & SDR0_SDCS_SDD);
124#endif
125}
Stefan Roese90e6f412007-04-18 12:05:59 +0200126#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200127
128#if defined(CONFIG_440GX)
129#define SDR0_PINSTP_SHIFT 29
130static char *bootstrap_str[] = {
131 "EBC (16 bits)",
132 "EBC (8 bits)",
133 "EBC (32 bits)",
134 "EBC (8 bits)",
135 "PCI",
136 "I2C (Addr 0x54)",
137 "Reserved",
138 "I2C (Addr 0x50)",
139};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200140static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200141#endif
142
143#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
144#define SDR0_PINSTP_SHIFT 30
145static char *bootstrap_str[] = {
146 "EBC (8 bits)",
147 "PCI",
148 "I2C (Addr 0x54)",
149 "I2C (Addr 0x50)",
150};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200151static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese887e2ec2006-09-07 11:51:23 +0200152#endif
153
154#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
155#define SDR0_PINSTP_SHIFT 29
156static char *bootstrap_str[] = {
157 "EBC (8 bits)",
158 "PCI",
159 "NAND (8 bits)",
160 "EBC (16 bits)",
161 "EBC (16 bits)",
162 "I2C (Addr 0x54)",
163 "PCI",
164 "I2C (Addr 0x52)",
165};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200166static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200167#endif
168
169#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
170#define SDR0_PINSTP_SHIFT 29
171static char *bootstrap_str[] = {
172 "EBC (8 bits)",
173 "EBC (16 bits)",
174 "EBC (16 bits)",
175 "NAND (8 bits)",
176 "PCI",
177 "I2C (Addr 0x54)",
178 "PCI",
179 "I2C (Addr 0x52)",
180};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200181static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200182#endif
183
Stefan Roese2801b2d2008-03-11 15:05:50 +0100184#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
185#define SDR0_PINSTP_SHIFT 29
186static char *bootstrap_str[] = {
187 "EBC (8 bits)",
188 "EBC (16 bits)",
189 "PCI",
190 "PCI",
191 "EBC (16 bits)",
192 "NAND (8 bits)",
193 "I2C (Addr 0x54)", /* A8 */
194 "I2C (Addr 0x52)", /* A4 */
195};
196static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
197#endif
198
Feng Kan7d307932008-07-08 22:47:31 -0700199#if defined(CONFIG_460SX)
200#define SDR0_PINSTP_SHIFT 29
201static char *bootstrap_str[] = {
202 "EBC (8 bits)",
203 "EBC (16 bits)",
204 "EBC (32 bits)",
205 "NAND (8 bits)",
206 "I2C (Addr 0x54)", /* A8 */
207 "I2C (Addr 0x52)", /* A4 */
208};
209static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
210#endif
211
Stefan Roese90e6f412007-04-18 12:05:59 +0200212#if defined(CONFIG_405EZ)
213#define SDR0_PINSTP_SHIFT 28
214static char *bootstrap_str[] = {
215 "EBC (8 bits)",
216 "SPI (fast)",
217 "NAND (512 page, 4 addr cycle)",
218 "I2C (Addr 0x50)",
219 "EBC (32 bits)",
220 "I2C (Addr 0x50)",
221 "NAND (2K page, 5 addr cycle)",
222 "I2C (Addr 0x50)",
223 "EBC (16 bits)",
224 "Reserved",
225 "NAND (2K page, 4 addr cycle)",
226 "I2C (Addr 0x50)",
227 "NAND (512 page, 3 addr cycle)",
228 "I2C (Addr 0x50)",
229 "SPI (slow)",
230 "I2C (Addr 0x50)",
231};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200232static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
233 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese90e6f412007-04-18 12:05:59 +0200234#endif
235
Stefan Roesedbbd1252007-10-05 17:10:59 +0200236#if defined(CONFIG_405EX)
237#define SDR0_PINSTP_SHIFT 29
238static char *bootstrap_str[] = {
239 "EBC (8 bits)",
240 "EBC (16 bits)",
241 "EBC (16 bits)",
242 "NAND (8 bits)",
243 "NAND (8 bits)",
244 "I2C (Addr 0x54)",
245 "EBC (8 bits)",
246 "I2C (Addr 0x52)",
247};
248static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
249#endif
250
Stefan Roese887e2ec2006-09-07 11:51:23 +0200251#if defined(SDR0_PINSTP_SHIFT)
252static int bootstrap_option(void)
253{
254 unsigned long val;
255
Stefan Roese90e6f412007-04-18 12:05:59 +0200256 mfsdr(SDR_PINSTP, val);
257 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200258}
259#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100260
Stefan Roese3d9569b2005-11-27 19:36:26 +0100261
262#if defined(CONFIG_440)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100263static int do_chip_reset (unsigned long sys0, unsigned long sys1)
264{
265 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
266 * reset.
267 */
268 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
269 mtdcr (cpc0_sys0, sys0);
270 mtdcr (cpc0_sys1, sys1);
271 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
272 mtspr (dbcr0, 0x20000000); /* Reset the chip */
273
274 return 1;
275}
Stefan Roese3d9569b2005-11-27 19:36:26 +0100276#endif
277
wdenkc6097192002-11-03 00:24:07 +0000278
279int checkcpu (void)
280{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100281#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100282 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000283 ulong clock = gd->cpu_clk;
284 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000285
Stefan Roese3d9569b2005-11-27 19:36:26 +0100286#if !defined(CONFIG_IOP480)
Wolfgang Denkba999c52006-10-20 17:54:33 +0200287 char addstr[64] = "";
Stefan Roese3d9569b2005-11-27 19:36:26 +0100288 sys_info_t sys_info;
Adam Grahamc9c11d72008-10-08 10:13:19 -0700289 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000290
Adam Grahamc9c11d72008-10-08 10:13:19 -0700291 cpu_num = get_cpu_num();
292 if (cpu_num >= 0)
293 printf("CPU%d: ", cpu_num);
294 else
295 puts("CPU: ");
wdenkc6097192002-11-03 00:24:07 +0000296
297 get_sys_info(&sys_info);
298
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200299#if defined(CONFIG_XILINX_440)
300 puts("IBM PowerPC 4");
301#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100302 puts("AMCC PowerPC 4");
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200303#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100304
Stefan Roesee01bd212007-03-21 13:38:59 +0100305#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200306 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
307 defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100308 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000309#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100310#if defined(CONFIG_440)
Stefan Roese2801b2d2008-03-11 15:05:50 +0100311#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
312 puts("60");
313#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100314 puts("40");
wdenkc6097192002-11-03 00:24:07 +0000315#endif
Stefan Roese2801b2d2008-03-11 15:05:50 +0100316#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100317
wdenkc6097192002-11-03 00:24:07 +0000318 switch (pvr) {
319 case PVR_405GP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100320 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000321 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100322
wdenkc6097192002-11-03 00:24:07 +0000323 case PVR_405GP_RC:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100324 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000325 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100326
wdenkc6097192002-11-03 00:24:07 +0000327 case PVR_405GP_RD:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100328 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000329 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100330
wdenk42dfe7a2004-03-14 22:25:36 +0000331#ifdef CONFIG_405GP
Stefan Roese3d9569b2005-11-27 19:36:26 +0100332 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
333 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000334 break;
335#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100336
wdenkc6097192002-11-03 00:24:07 +0000337 case PVR_405CR_RA:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100338 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000339 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100340
wdenkc6097192002-11-03 00:24:07 +0000341 case PVR_405CR_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100342 puts("CR Rev. B");
343 break;
344
345#ifdef CONFIG_405CR
346 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
347 puts("CR Rev. C");
348 break;
349#endif
350
351 case PVR_405GPR_RB:
352 puts("GPr Rev. B");
353 break;
354
stroeseb867d702003-05-23 11:18:02 +0000355 case PVR_405EP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100356 puts("EP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000357 break;
wdenkc6097192002-11-03 00:24:07 +0000358
Stefan Roesee01bd212007-03-21 13:38:59 +0100359 case PVR_405EZ_RA:
360 puts("EZ Rev. A");
361 break;
362
Stefan Roesedbbd1252007-10-05 17:10:59 +0200363 case PVR_405EX1_RA:
364 puts("EX Rev. A");
365 strcpy(addstr, "Security support");
366 break;
367
368 case PVR_405EX2_RA:
369 puts("EX Rev. A");
370 strcpy(addstr, "No Security support");
371 break;
372
373 case PVR_405EXR1_RA:
374 puts("EXr Rev. A");
375 strcpy(addstr, "Security support");
376 break;
377
378 case PVR_405EXR2_RA:
379 puts("EXr Rev. A");
380 strcpy(addstr, "No Security support");
381 break;
382
Stefan Roese70fab192008-05-13 20:22:01 +0200383 case PVR_405EX1_RC:
384 puts("EX Rev. C");
385 strcpy(addstr, "Security support");
386 break;
387
388 case PVR_405EX2_RC:
389 puts("EX Rev. C");
390 strcpy(addstr, "No Security support");
391 break;
392
393 case PVR_405EXR1_RC:
394 puts("EXr Rev. C");
395 strcpy(addstr, "Security support");
396 break;
397
398 case PVR_405EXR2_RC:
399 puts("EXr Rev. C");
400 strcpy(addstr, "No Security support");
401 break;
402
wdenkc6097192002-11-03 00:24:07 +0000403#if defined(CONFIG_440)
wdenk8bde7f72003-06-27 21:31:46 +0000404 case PVR_440GP_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200405 puts("GP Rev. B");
wdenk4d816772003-09-03 14:03:26 +0000406 /* See errata 1.12: CHIP_4 */
407 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
408 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
409 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
410 "Resetting chip ...\n");
411 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
412 do_chip_reset ( mfdcr(cpc0_strp0),
413 mfdcr(cpc0_strp1) );
414 }
wdenkc6097192002-11-03 00:24:07 +0000415 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100416
wdenk8bde7f72003-06-27 21:31:46 +0000417 case PVR_440GP_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200418 puts("GP Rev. C");
wdenkba56f622004-02-06 23:19:44 +0000419 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100420
wdenkba56f622004-02-06 23:19:44 +0000421 case PVR_440GX_RA:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200422 puts("GX Rev. A");
wdenkba56f622004-02-06 23:19:44 +0000423 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100424
wdenkba56f622004-02-06 23:19:44 +0000425 case PVR_440GX_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200426 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000427 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100428
stroese0a7c5392005-04-07 05:33:41 +0000429 case PVR_440GX_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200430 puts("GX Rev. C");
stroese0a7c5392005-04-07 05:33:41 +0000431 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100432
Stefan Roese57275b62005-11-01 10:08:03 +0100433 case PVR_440GX_RF:
434 puts("GX Rev. F");
435 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100436
Stefan Roesec157d8e2005-08-01 16:41:48 +0200437 case PVR_440EP_RA:
438 puts("EP Rev. A");
439 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100440
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200441#ifdef CONFIG_440EP
442 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200443 puts("EP Rev. B");
444 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200445
446 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
447 puts("EP Rev. C");
448 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200449#endif /* CONFIG_440EP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100450
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200451#ifdef CONFIG_440GR
452 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
453 puts("GR Rev. A");
454 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200455
Stefan Roese5770a1e2006-05-18 19:21:53 +0200456 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese512f8d52006-05-10 14:10:41 +0200457 puts("GR Rev. B");
458 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200459#endif /* CONFIG_440GR */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100460#endif /* CONFIG_440 */
461
Stefan Roese2902fad2007-01-31 16:56:10 +0100462#ifdef CONFIG_440EPX
463 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200464 puts("EPx Rev. A");
465 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200466 break;
467
Stefan Roese2902fad2007-01-31 16:56:10 +0100468 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200469 puts("EPx Rev. A");
470 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200471 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100472#endif /* CONFIG_440EPX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200473
Stefan Roese2902fad2007-01-31 16:56:10 +0100474#ifdef CONFIG_440GRX
475 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200476 puts("GRx Rev. A");
477 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200478 break;
479
Stefan Roese2902fad2007-01-31 16:56:10 +0100480 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200481 puts("GRx Rev. A");
482 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200483 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100484#endif /* CONFIG_440GRX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200485
Stefan Roese95981772007-01-13 08:01:03 +0100486 case PVR_440SP_6_RAB:
487 puts("SP Rev. A/B");
488 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100489 break;
490
Stefan Roese95981772007-01-13 08:01:03 +0100491 case PVR_440SP_RAB:
492 puts("SP Rev. A/B");
493 strcpy(addstr, "No RAID 6 support");
494 break;
495
496 case PVR_440SP_6_RC:
497 puts("SP Rev. C");
498 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100499 break;
500
Stefan Roesee732fae2006-11-28 16:09:24 +0100501 case PVR_440SP_RC:
502 puts("SP Rev. C");
Stefan Roese95981772007-01-13 08:01:03 +0100503 strcpy(addstr, "No RAID 6 support");
504 break;
505
506 case PVR_440SPe_6_RA:
507 puts("SPe Rev. A");
508 strcpy(addstr, "RAID 6 support");
Stefan Roesee732fae2006-11-28 16:09:24 +0100509 break;
510
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200511 case PVR_440SPe_RA:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200512 puts("SPe Rev. A");
Stefan Roese95981772007-01-13 08:01:03 +0100513 strcpy(addstr, "No RAID 6 support");
514 break;
515
516 case PVR_440SPe_6_RB:
517 puts("SPe Rev. B");
518 strcpy(addstr, "RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200519 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200520
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200521 case PVR_440SPe_RB:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200522 puts("SPe Rev. B");
Stefan Roese95981772007-01-13 08:01:03 +0100523 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200524 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200525
Stefan Roese2801b2d2008-03-11 15:05:50 +0100526 case PVR_460EX_RA:
527 puts("EX Rev. A");
528 strcpy(addstr, "No Security/Kasumi support");
529 break;
530
531 case PVR_460EX_SE_RA:
532 puts("EX Rev. A");
533 strcpy(addstr, "Security/Kasumi support");
534 break;
535
536 case PVR_460GT_RA:
537 puts("GT Rev. A");
538 strcpy(addstr, "No Security/Kasumi support");
539 break;
540
541 case PVR_460GT_SE_RA:
542 puts("GT Rev. A");
543 strcpy(addstr, "Security/Kasumi support");
544 break;
545
Feng Kan7d307932008-07-08 22:47:31 -0700546 case PVR_460SX_RA:
547 puts("SX Rev. A");
548 strcpy(addstr, "Security support");
549 break;
550
551 case PVR_460SX_RA_V1:
552 puts("SX Rev. A");
553 strcpy(addstr, "No Security support");
554 break;
555
556 case PVR_460GX_RA:
557 puts("GX Rev. A");
558 strcpy(addstr, "Security support");
559 break;
560
561 case PVR_460GX_RA_V1:
562 puts("GX Rev. A");
563 strcpy(addstr, "No Security support");
564 break;
565
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200566 case PVR_VIRTEX5:
567 puts("x5 VIRTEX5");
568 break;
569
wdenk8bde7f72003-06-27 21:31:46 +0000570 default:
Stefan Roese17f50f222005-08-04 17:09:16 +0200571 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000572 break;
573 }
Stefan Roese3d9569b2005-11-27 19:36:26 +0100574
575 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
Stefan Roesee01bd212007-03-21 13:38:59 +0100576 sys_info.freqPLB / 1000000,
577 get_OPB_freq() / 1000000,
Stefan Roesedbbd1252007-10-05 17:10:59 +0200578 sys_info.freqEBC / 1000000);
Stefan Roese3d9569b2005-11-27 19:36:26 +0100579
Stefan Roeseedf0b542006-10-18 15:59:35 +0200580 if (addstr[0] != 0)
581 printf(" %s\n", addstr);
582
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100583#if defined(I2C_BOOTROM)
584 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese90e6f412007-04-18 12:05:59 +0200585#endif /* I2C_BOOTROM */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200586#if defined(SDR0_PINSTP_SHIFT)
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200587 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200588 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denkba999c52006-10-20 17:54:33 +0200589#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100590
Stefan Roesedbbd1252007-10-05 17:10:59 +0200591#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100592 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100593#endif
594
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100595#if defined(PCI_ASYNC)
596 if (pci_async_enabled()) {
Stefan Roese3d9569b2005-11-27 19:36:26 +0100597 printf (", PCI async ext clock used");
598 } else {
599 printf (", PCI sync clock at %lu MHz",
600 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
601 }
602#endif
603
Stefan Roesedbbd1252007-10-05 17:10:59 +0200604#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100605 putc('\n');
606#endif
607
Stefan Roesedbbd1252007-10-05 17:10:59 +0200608#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100609 printf (" 16 kB I-Cache 16 kB D-Cache");
610#elif defined(CONFIG_440)
611 printf (" 32 kB I-Cache 32 kB D-Cache");
612#else
613 printf (" 16 kB I-Cache %d kB D-Cache",
614 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
615#endif
616#endif /* !defined(CONFIG_IOP480) */
617
618#if defined(CONFIG_IOP480)
619 printf ("PLX IOP480 (PVR=%08x)", pvr);
620 printf (" at %s MHz:", strmhz(buf, clock));
621 printf (" %u kB I-Cache", 4);
622 printf (" %u kB D-Cache", 2);
623#endif
624
625#endif /* !defined(CONFIG_405) */
626
627 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000628
629 return 0;
630}
631
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200632int ppc440spe_revB() {
633 unsigned int pvr;
634
635 pvr = get_pvr();
Stefan Roese5a5c5692007-01-15 09:46:29 +0100636 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200637 return 1;
638 else
639 return 0;
640}
wdenkc6097192002-11-03 00:24:07 +0000641
642/* ------------------------------------------------------------------------- */
643
wdenk8bde7f72003-06-27 21:31:46 +0000644int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000645{
Stefan Roese1f94d162006-11-27 14:48:41 +0100646#if defined(CONFIG_BOARD_RESET)
647 board_reset();
Stefan Roese1729b922006-11-27 14:52:04 +0100648#else
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200649#if defined(CONFIG_SYS_4xx_RESET_TYPE)
650 mtspr(dbcr0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roesec157d8e2005-08-01 16:41:48 +0200651#else
wdenk8bde7f72003-06-27 21:31:46 +0000652 /*
653 * Initiate system reset in debug control register DBCR
654 */
Stefan Roesef3443862006-10-07 11:30:52 +0200655 mtspr(dbcr0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200656#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roesef3443862006-10-07 11:30:52 +0200657#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200658
wdenkc6097192002-11-03 00:24:07 +0000659 return 1;
660}
661
wdenkc6097192002-11-03 00:24:07 +0000662
663/*
664 * Get timebase clock frequency
665 */
666unsigned long get_tbclk (void)
667{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100668#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000669 sys_info_t sys_info;
670
671 get_sys_info(&sys_info);
672 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000673#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100674 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000675#endif
676
677}
678
679
680#if defined(CONFIG_WATCHDOG)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100681void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000682{
683 int re_enable = disable_interrupts();
684 reset_4xx_watchdog();
685 if (re_enable) enable_interrupts();
686}
687
Stefan Roesec7f69c32007-11-09 12:18:54 +0100688void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000689{
690 /*
691 * Clear TSR(WIS) bit
692 */
693 mtspr(tsr, 0x40000000);
694}
695#endif /* CONFIG_WATCHDOG */