blob: ef32bc64d29a4a151f4764ac889d68c4759a637a [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
Stefan Roese887e2ec2006-09-07 11:51:23 +020044#if defined(CONFIG_405GP) || \
45 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
46 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010047
48#define PCI_ASYNC
49
Stefan Roesec7f69c32007-11-09 12:18:54 +010050static int pci_async_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010051{
52#if defined(CONFIG_405GP)
53 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
54#endif
55
Stefan Roese887e2ec2006-09-07 11:51:23 +020056#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +010057 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
58 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010059 unsigned long val;
60
Wolfgang Denk74812662005-12-12 16:06:05 +010061 mfsdr(sdr_sdstp1, val);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010062 return (val & SDR0_SDSTP1_PAME_MASK);
63#endif
64}
65#endif
66
Stefan Roesedbbd1252007-10-05 17:10:59 +020067#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
68 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roesec7f69c32007-11-09 12:18:54 +010069static int pci_arbiter_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010070{
71#if defined(CONFIG_405GP)
72 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
73#endif
74
75#if defined(CONFIG_405EP)
76 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
77#endif
78
79#if defined(CONFIG_440GP)
80 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
81#endif
82
Stefan Roese7372ca62007-02-02 12:44:22 +010083#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010084 unsigned long val;
85
Stefan Roese7372ca62007-02-02 12:44:22 +010086 mfsdr(sdr_xcr, val);
87 return (val & 0x80000000);
88#endif
89#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +010090 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
91 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese7372ca62007-02-02 12:44:22 +010092 unsigned long val;
93
94 mfsdr(sdr_pci0, val);
95 return (val & 0x80000000);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010096#endif
97}
98#endif
99
Stefan Roesec7f69c32007-11-09 12:18:54 +0100100#if defined(CONFIG_405EP)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100101#define I2C_BOOTROM
102
Stefan Roesec7f69c32007-11-09 12:18:54 +0100103static int i2c_bootrom_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100104{
105#if defined(CONFIG_405EP)
106 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200107#else
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100108 unsigned long val;
109
110 mfsdr(sdr_sdcs, val);
111 return (val & SDR0_SDCS_SDD);
112#endif
113}
Stefan Roese90e6f412007-04-18 12:05:59 +0200114#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200115
116#if defined(CONFIG_440GX)
117#define SDR0_PINSTP_SHIFT 29
118static char *bootstrap_str[] = {
119 "EBC (16 bits)",
120 "EBC (8 bits)",
121 "EBC (32 bits)",
122 "EBC (8 bits)",
123 "PCI",
124 "I2C (Addr 0x54)",
125 "Reserved",
126 "I2C (Addr 0x50)",
127};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200128static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200129#endif
130
131#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
132#define SDR0_PINSTP_SHIFT 30
133static char *bootstrap_str[] = {
134 "EBC (8 bits)",
135 "PCI",
136 "I2C (Addr 0x54)",
137 "I2C (Addr 0x50)",
138};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200139static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese887e2ec2006-09-07 11:51:23 +0200140#endif
141
142#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
143#define SDR0_PINSTP_SHIFT 29
144static char *bootstrap_str[] = {
145 "EBC (8 bits)",
146 "PCI",
147 "NAND (8 bits)",
148 "EBC (16 bits)",
149 "EBC (16 bits)",
150 "I2C (Addr 0x54)",
151 "PCI",
152 "I2C (Addr 0x52)",
153};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200154static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200155#endif
156
157#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
158#define SDR0_PINSTP_SHIFT 29
159static char *bootstrap_str[] = {
160 "EBC (8 bits)",
161 "EBC (16 bits)",
162 "EBC (16 bits)",
163 "NAND (8 bits)",
164 "PCI",
165 "I2C (Addr 0x54)",
166 "PCI",
167 "I2C (Addr 0x52)",
168};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200169static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200170#endif
171
Stefan Roese2801b2d2008-03-11 15:05:50 +0100172#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
173#define SDR0_PINSTP_SHIFT 29
174static char *bootstrap_str[] = {
175 "EBC (8 bits)",
176 "EBC (16 bits)",
177 "PCI",
178 "PCI",
179 "EBC (16 bits)",
180 "NAND (8 bits)",
181 "I2C (Addr 0x54)", /* A8 */
182 "I2C (Addr 0x52)", /* A4 */
183};
184static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
185#endif
186
Feng Kan7d307932008-07-08 22:47:31 -0700187#if defined(CONFIG_460SX)
188#define SDR0_PINSTP_SHIFT 29
189static char *bootstrap_str[] = {
190 "EBC (8 bits)",
191 "EBC (16 bits)",
192 "EBC (32 bits)",
193 "NAND (8 bits)",
194 "I2C (Addr 0x54)", /* A8 */
195 "I2C (Addr 0x52)", /* A4 */
196};
197static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
198#endif
199
Stefan Roese90e6f412007-04-18 12:05:59 +0200200#if defined(CONFIG_405EZ)
201#define SDR0_PINSTP_SHIFT 28
202static char *bootstrap_str[] = {
203 "EBC (8 bits)",
204 "SPI (fast)",
205 "NAND (512 page, 4 addr cycle)",
206 "I2C (Addr 0x50)",
207 "EBC (32 bits)",
208 "I2C (Addr 0x50)",
209 "NAND (2K page, 5 addr cycle)",
210 "I2C (Addr 0x50)",
211 "EBC (16 bits)",
212 "Reserved",
213 "NAND (2K page, 4 addr cycle)",
214 "I2C (Addr 0x50)",
215 "NAND (512 page, 3 addr cycle)",
216 "I2C (Addr 0x50)",
217 "SPI (slow)",
218 "I2C (Addr 0x50)",
219};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200220static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
221 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese90e6f412007-04-18 12:05:59 +0200222#endif
223
Stefan Roesedbbd1252007-10-05 17:10:59 +0200224#if defined(CONFIG_405EX)
225#define SDR0_PINSTP_SHIFT 29
226static char *bootstrap_str[] = {
227 "EBC (8 bits)",
228 "EBC (16 bits)",
229 "EBC (16 bits)",
230 "NAND (8 bits)",
231 "NAND (8 bits)",
232 "I2C (Addr 0x54)",
233 "EBC (8 bits)",
234 "I2C (Addr 0x52)",
235};
236static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
237#endif
238
Stefan Roese887e2ec2006-09-07 11:51:23 +0200239#if defined(SDR0_PINSTP_SHIFT)
240static int bootstrap_option(void)
241{
242 unsigned long val;
243
Stefan Roese90e6f412007-04-18 12:05:59 +0200244 mfsdr(SDR_PINSTP, val);
245 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200246}
247#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100248
Stefan Roese3d9569b2005-11-27 19:36:26 +0100249
250#if defined(CONFIG_440)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100251static int do_chip_reset (unsigned long sys0, unsigned long sys1)
252{
253 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
254 * reset.
255 */
256 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
257 mtdcr (cpc0_sys0, sys0);
258 mtdcr (cpc0_sys1, sys1);
259 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
260 mtspr (dbcr0, 0x20000000); /* Reset the chip */
261
262 return 1;
263}
Stefan Roese3d9569b2005-11-27 19:36:26 +0100264#endif
265
wdenkc6097192002-11-03 00:24:07 +0000266
267int checkcpu (void)
268{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100269#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100270 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000271 ulong clock = gd->cpu_clk;
272 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000273
Stefan Roese3d9569b2005-11-27 19:36:26 +0100274#if !defined(CONFIG_IOP480)
Wolfgang Denkba999c52006-10-20 17:54:33 +0200275 char addstr[64] = "";
Stefan Roese3d9569b2005-11-27 19:36:26 +0100276 sys_info_t sys_info;
wdenkc6097192002-11-03 00:24:07 +0000277
278 puts ("CPU: ");
279
280 get_sys_info(&sys_info);
281
Stefan Roese3d9569b2005-11-27 19:36:26 +0100282 puts("AMCC PowerPC 4");
283
Stefan Roesee01bd212007-03-21 13:38:59 +0100284#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
Stefan Roesedbbd1252007-10-05 17:10:59 +0200285 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
286 defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100287 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000288#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100289#if defined(CONFIG_440)
Stefan Roese2801b2d2008-03-11 15:05:50 +0100290#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
291 puts("60");
292#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100293 puts("40");
wdenkc6097192002-11-03 00:24:07 +0000294#endif
Stefan Roese2801b2d2008-03-11 15:05:50 +0100295#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100296
wdenkc6097192002-11-03 00:24:07 +0000297 switch (pvr) {
298 case PVR_405GP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100299 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000300 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100301
wdenkc6097192002-11-03 00:24:07 +0000302 case PVR_405GP_RC:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100303 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000304 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100305
wdenkc6097192002-11-03 00:24:07 +0000306 case PVR_405GP_RD:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100307 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000308 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100309
wdenk42dfe7a2004-03-14 22:25:36 +0000310#ifdef CONFIG_405GP
Stefan Roese3d9569b2005-11-27 19:36:26 +0100311 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
312 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000313 break;
314#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100315
wdenkc6097192002-11-03 00:24:07 +0000316 case PVR_405CR_RA:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100317 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000318 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100319
wdenkc6097192002-11-03 00:24:07 +0000320 case PVR_405CR_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100321 puts("CR Rev. B");
322 break;
323
324#ifdef CONFIG_405CR
325 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
326 puts("CR Rev. C");
327 break;
328#endif
329
330 case PVR_405GPR_RB:
331 puts("GPr Rev. B");
332 break;
333
stroeseb867d702003-05-23 11:18:02 +0000334 case PVR_405EP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100335 puts("EP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000336 break;
wdenkc6097192002-11-03 00:24:07 +0000337
Stefan Roesee01bd212007-03-21 13:38:59 +0100338 case PVR_405EZ_RA:
339 puts("EZ Rev. A");
340 break;
341
Stefan Roesedbbd1252007-10-05 17:10:59 +0200342 case PVR_405EX1_RA:
343 puts("EX Rev. A");
344 strcpy(addstr, "Security support");
345 break;
346
347 case PVR_405EX2_RA:
348 puts("EX Rev. A");
349 strcpy(addstr, "No Security support");
350 break;
351
352 case PVR_405EXR1_RA:
353 puts("EXr Rev. A");
354 strcpy(addstr, "Security support");
355 break;
356
357 case PVR_405EXR2_RA:
358 puts("EXr Rev. A");
359 strcpy(addstr, "No Security support");
360 break;
361
Stefan Roese70fab192008-05-13 20:22:01 +0200362 case PVR_405EX1_RC:
363 puts("EX Rev. C");
364 strcpy(addstr, "Security support");
365 break;
366
367 case PVR_405EX2_RC:
368 puts("EX Rev. C");
369 strcpy(addstr, "No Security support");
370 break;
371
372 case PVR_405EXR1_RC:
373 puts("EXr Rev. C");
374 strcpy(addstr, "Security support");
375 break;
376
377 case PVR_405EXR2_RC:
378 puts("EXr Rev. C");
379 strcpy(addstr, "No Security support");
380 break;
381
wdenkc6097192002-11-03 00:24:07 +0000382#if defined(CONFIG_440)
wdenk8bde7f72003-06-27 21:31:46 +0000383 case PVR_440GP_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200384 puts("GP Rev. B");
wdenk4d816772003-09-03 14:03:26 +0000385 /* See errata 1.12: CHIP_4 */
386 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
387 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
388 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
389 "Resetting chip ...\n");
390 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
391 do_chip_reset ( mfdcr(cpc0_strp0),
392 mfdcr(cpc0_strp1) );
393 }
wdenkc6097192002-11-03 00:24:07 +0000394 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100395
wdenk8bde7f72003-06-27 21:31:46 +0000396 case PVR_440GP_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200397 puts("GP Rev. C");
wdenkba56f622004-02-06 23:19:44 +0000398 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100399
wdenkba56f622004-02-06 23:19:44 +0000400 case PVR_440GX_RA:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200401 puts("GX Rev. A");
wdenkba56f622004-02-06 23:19:44 +0000402 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100403
wdenkba56f622004-02-06 23:19:44 +0000404 case PVR_440GX_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200405 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000406 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100407
stroese0a7c5392005-04-07 05:33:41 +0000408 case PVR_440GX_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200409 puts("GX Rev. C");
stroese0a7c5392005-04-07 05:33:41 +0000410 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100411
Stefan Roese57275b62005-11-01 10:08:03 +0100412 case PVR_440GX_RF:
413 puts("GX Rev. F");
414 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100415
Stefan Roesec157d8e2005-08-01 16:41:48 +0200416 case PVR_440EP_RA:
417 puts("EP Rev. A");
418 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100419
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200420#ifdef CONFIG_440EP
421 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200422 puts("EP Rev. B");
423 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200424
425 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
426 puts("EP Rev. C");
427 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200428#endif /* CONFIG_440EP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100429
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200430#ifdef CONFIG_440GR
431 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
432 puts("GR Rev. A");
433 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200434
Stefan Roese5770a1e2006-05-18 19:21:53 +0200435 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese512f8d52006-05-10 14:10:41 +0200436 puts("GR Rev. B");
437 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200438#endif /* CONFIG_440GR */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100439#endif /* CONFIG_440 */
440
Stefan Roese2902fad2007-01-31 16:56:10 +0100441#ifdef CONFIG_440EPX
442 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200443 puts("EPx Rev. A");
444 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200445 break;
446
Stefan Roese2902fad2007-01-31 16:56:10 +0100447 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200448 puts("EPx Rev. A");
449 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200450 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100451#endif /* CONFIG_440EPX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200452
Stefan Roese2902fad2007-01-31 16:56:10 +0100453#ifdef CONFIG_440GRX
454 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200455 puts("GRx Rev. A");
456 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200457 break;
458
Stefan Roese2902fad2007-01-31 16:56:10 +0100459 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200460 puts("GRx Rev. A");
461 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200462 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100463#endif /* CONFIG_440GRX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200464
Stefan Roese95981772007-01-13 08:01:03 +0100465 case PVR_440SP_6_RAB:
466 puts("SP Rev. A/B");
467 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100468 break;
469
Stefan Roese95981772007-01-13 08:01:03 +0100470 case PVR_440SP_RAB:
471 puts("SP Rev. A/B");
472 strcpy(addstr, "No RAID 6 support");
473 break;
474
475 case PVR_440SP_6_RC:
476 puts("SP Rev. C");
477 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100478 break;
479
Stefan Roesee732fae2006-11-28 16:09:24 +0100480 case PVR_440SP_RC:
481 puts("SP Rev. C");
Stefan Roese95981772007-01-13 08:01:03 +0100482 strcpy(addstr, "No RAID 6 support");
483 break;
484
485 case PVR_440SPe_6_RA:
486 puts("SPe Rev. A");
487 strcpy(addstr, "RAID 6 support");
Stefan Roesee732fae2006-11-28 16:09:24 +0100488 break;
489
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200490 case PVR_440SPe_RA:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200491 puts("SPe Rev. A");
Stefan Roese95981772007-01-13 08:01:03 +0100492 strcpy(addstr, "No RAID 6 support");
493 break;
494
495 case PVR_440SPe_6_RB:
496 puts("SPe Rev. B");
497 strcpy(addstr, "RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200498 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200499
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200500 case PVR_440SPe_RB:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200501 puts("SPe Rev. B");
Stefan Roese95981772007-01-13 08:01:03 +0100502 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200503 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200504
Stefan Roese2801b2d2008-03-11 15:05:50 +0100505 case PVR_460EX_RA:
506 puts("EX Rev. A");
507 strcpy(addstr, "No Security/Kasumi support");
508 break;
509
510 case PVR_460EX_SE_RA:
511 puts("EX Rev. A");
512 strcpy(addstr, "Security/Kasumi support");
513 break;
514
515 case PVR_460GT_RA:
516 puts("GT Rev. A");
517 strcpy(addstr, "No Security/Kasumi support");
518 break;
519
520 case PVR_460GT_SE_RA:
521 puts("GT Rev. A");
522 strcpy(addstr, "Security/Kasumi support");
523 break;
524
Feng Kan7d307932008-07-08 22:47:31 -0700525 case PVR_460SX_RA:
526 puts("SX Rev. A");
527 strcpy(addstr, "Security support");
528 break;
529
530 case PVR_460SX_RA_V1:
531 puts("SX Rev. A");
532 strcpy(addstr, "No Security support");
533 break;
534
535 case PVR_460GX_RA:
536 puts("GX Rev. A");
537 strcpy(addstr, "Security support");
538 break;
539
540 case PVR_460GX_RA_V1:
541 puts("GX Rev. A");
542 strcpy(addstr, "No Security support");
543 break;
544
wdenk8bde7f72003-06-27 21:31:46 +0000545 default:
Stefan Roese17f50f222005-08-04 17:09:16 +0200546 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000547 break;
548 }
Stefan Roese3d9569b2005-11-27 19:36:26 +0100549
550 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
Stefan Roesee01bd212007-03-21 13:38:59 +0100551 sys_info.freqPLB / 1000000,
552 get_OPB_freq() / 1000000,
Stefan Roesedbbd1252007-10-05 17:10:59 +0200553 sys_info.freqEBC / 1000000);
Stefan Roese3d9569b2005-11-27 19:36:26 +0100554
Stefan Roeseedf0b542006-10-18 15:59:35 +0200555 if (addstr[0] != 0)
556 printf(" %s\n", addstr);
557
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100558#if defined(I2C_BOOTROM)
559 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese90e6f412007-04-18 12:05:59 +0200560#endif /* I2C_BOOTROM */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200561#if defined(SDR0_PINSTP_SHIFT)
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200562 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200563 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denkba999c52006-10-20 17:54:33 +0200564#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100565
Stefan Roesedbbd1252007-10-05 17:10:59 +0200566#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100567 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100568#endif
569
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100570#if defined(PCI_ASYNC)
571 if (pci_async_enabled()) {
Stefan Roese3d9569b2005-11-27 19:36:26 +0100572 printf (", PCI async ext clock used");
573 } else {
574 printf (", PCI sync clock at %lu MHz",
575 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
576 }
577#endif
578
Stefan Roesedbbd1252007-10-05 17:10:59 +0200579#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100580 putc('\n');
581#endif
582
Stefan Roesedbbd1252007-10-05 17:10:59 +0200583#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100584 printf (" 16 kB I-Cache 16 kB D-Cache");
585#elif defined(CONFIG_440)
586 printf (" 32 kB I-Cache 32 kB D-Cache");
587#else
588 printf (" 16 kB I-Cache %d kB D-Cache",
589 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
590#endif
591#endif /* !defined(CONFIG_IOP480) */
592
593#if defined(CONFIG_IOP480)
594 printf ("PLX IOP480 (PVR=%08x)", pvr);
595 printf (" at %s MHz:", strmhz(buf, clock));
596 printf (" %u kB I-Cache", 4);
597 printf (" %u kB D-Cache", 2);
598#endif
599
600#endif /* !defined(CONFIG_405) */
601
602 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000603
604 return 0;
605}
606
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200607int ppc440spe_revB() {
608 unsigned int pvr;
609
610 pvr = get_pvr();
Stefan Roese5a5c5692007-01-15 09:46:29 +0100611 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200612 return 1;
613 else
614 return 0;
615}
wdenkc6097192002-11-03 00:24:07 +0000616
617/* ------------------------------------------------------------------------- */
618
wdenk8bde7f72003-06-27 21:31:46 +0000619int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000620{
Stefan Roese1f94d162006-11-27 14:48:41 +0100621#if defined(CONFIG_BOARD_RESET)
622 board_reset();
Stefan Roese1729b922006-11-27 14:52:04 +0100623#else
Stefan Roese1c2ce222006-11-27 14:12:17 +0100624#if defined(CFG_4xx_RESET_TYPE)
625 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
Stefan Roesec157d8e2005-08-01 16:41:48 +0200626#else
wdenk8bde7f72003-06-27 21:31:46 +0000627 /*
628 * Initiate system reset in debug control register DBCR
629 */
Stefan Roesef3443862006-10-07 11:30:52 +0200630 mtspr(dbcr0, 0x30000000);
Stefan Roese1729b922006-11-27 14:52:04 +0100631#endif /* defined(CFG_4xx_RESET_TYPE) */
Stefan Roesef3443862006-10-07 11:30:52 +0200632#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200633
wdenkc6097192002-11-03 00:24:07 +0000634 return 1;
635}
636
wdenkc6097192002-11-03 00:24:07 +0000637
638/*
639 * Get timebase clock frequency
640 */
641unsigned long get_tbclk (void)
642{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100643#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000644 sys_info_t sys_info;
645
646 get_sys_info(&sys_info);
647 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000648#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100649 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000650#endif
651
652}
653
654
655#if defined(CONFIG_WATCHDOG)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100656void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000657{
658 int re_enable = disable_interrupts();
659 reset_4xx_watchdog();
660 if (re_enable) enable_interrupts();
661}
662
Stefan Roesec7f69c32007-11-09 12:18:54 +0100663void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000664{
665 /*
666 * Clear TSR(WIS) bit
667 */
668 mtspr(tsr, 0x40000000);
669}
670#endif /* CONFIG_WATCHDOG */