blob: d376f52a608f0365f79964d51a8a6f9f55474ba0 [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>
38#include <ppc4xx.h>
39
Wolfgang Denk6405a152006-03-31 18:32:53 +020040DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denk6405a152006-03-31 18:32:53 +020041
Stefan Roese03687752006-10-07 11:30:52 +020042void board_reset(void);
Stefan Roese03687752006-10-07 11:30:52 +020043
Stefan Roese42fbddd2006-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 Roese99644742005-11-29 18:18:21 +010047
48#define PCI_ASYNC
49
Stefan Roese6964fd62007-11-09 12:18:54 +010050static int pci_async_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010051{
52#if defined(CONFIG_405GP)
53 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010054#endif
55
Stefan Roese42fbddd2006-09-07 11:51:23 +020056#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
57 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010058 unsigned long val;
59
Wolfgang Denkaaa7c002005-12-12 16:06:05 +010060 mfsdr(sdr_sdstp1, val);
Stefan Roese99644742005-11-29 18:18:21 +010061 return (val & SDR0_SDSTP1_PAME_MASK);
62#endif
63}
64#endif
65
Stefan Roese153b3e22007-10-05 17:10:59 +020066#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
67 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roese6964fd62007-11-09 12:18:54 +010068static int pci_arbiter_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010069{
70#if defined(CONFIG_405GP)
71 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
72#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010073
Stefan Roese99644742005-11-29 18:18:21 +010074#if defined(CONFIG_405EP)
75 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010076#endif
77
78#if defined(CONFIG_440GP)
Stefan Roese99644742005-11-29 18:18:21 +010079 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
80#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010081
Stefan Roese84382432007-02-02 12:44:22 +010082#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010083 unsigned long val;
84
Stefan Roese84382432007-02-02 12:44:22 +010085 mfsdr(sdr_xcr, val);
86 return (val & 0x80000000);
87#endif
88#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
89 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
90 unsigned long val;
91
92 mfsdr(sdr_pci0, val);
93 return (val & 0x80000000);
Stefan Roese42f2a822005-11-27 19:36:26 +010094#endif
Stefan Roese99644742005-11-29 18:18:21 +010095}
96#endif
97
Stefan Roese6964fd62007-11-09 12:18:54 +010098#if defined(CONFIG_405EP)
Stefan Roese99644742005-11-29 18:18:21 +010099#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100100
Stefan Roese6964fd62007-11-09 12:18:54 +0100101static int i2c_bootrom_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +0100102{
103#if defined(CONFIG_405EP)
104 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200105#else
Stefan Roese99644742005-11-29 18:18:21 +0100106 unsigned long val;
107
108 mfsdr(sdr_sdcs, val);
109 return (val & SDR0_SDCS_SDD);
110#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200111}
Stefan Roese3a75ac12007-04-18 12:05:59 +0200112#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200113
114#if defined(CONFIG_440GX)
115#define SDR0_PINSTP_SHIFT 29
116static char *bootstrap_str[] = {
117 "EBC (16 bits)",
118 "EBC (8 bits)",
119 "EBC (32 bits)",
120 "EBC (8 bits)",
121 "PCI",
122 "I2C (Addr 0x54)",
123 "Reserved",
124 "I2C (Addr 0x50)",
125};
Benoît Monin1a70cf22007-06-04 08:36:05 +0200126static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200127#endif
128
129#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
130#define SDR0_PINSTP_SHIFT 30
131static char *bootstrap_str[] = {
132 "EBC (8 bits)",
133 "PCI",
134 "I2C (Addr 0x54)",
135 "I2C (Addr 0x50)",
136};
Benoît Monin1a70cf22007-06-04 08:36:05 +0200137static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese42fbddd2006-09-07 11:51:23 +0200138#endif
139
140#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
141#define SDR0_PINSTP_SHIFT 29
142static char *bootstrap_str[] = {
143 "EBC (8 bits)",
144 "PCI",
145 "NAND (8 bits)",
146 "EBC (16 bits)",
147 "EBC (16 bits)",
148 "I2C (Addr 0x54)",
149 "PCI",
150 "I2C (Addr 0x52)",
151};
Benoît Monin1a70cf22007-06-04 08:36:05 +0200152static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200153#endif
154
155#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
156#define SDR0_PINSTP_SHIFT 29
157static char *bootstrap_str[] = {
158 "EBC (8 bits)",
159 "EBC (16 bits)",
160 "EBC (16 bits)",
161 "NAND (8 bits)",
162 "PCI",
163 "I2C (Addr 0x54)",
164 "PCI",
165 "I2C (Addr 0x52)",
166};
Benoît Monin1a70cf22007-06-04 08:36:05 +0200167static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200168#endif
169
Stefan Roese3a75ac12007-04-18 12:05:59 +0200170#if defined(CONFIG_405EZ)
171#define SDR0_PINSTP_SHIFT 28
172static char *bootstrap_str[] = {
173 "EBC (8 bits)",
174 "SPI (fast)",
175 "NAND (512 page, 4 addr cycle)",
176 "I2C (Addr 0x50)",
177 "EBC (32 bits)",
178 "I2C (Addr 0x50)",
179 "NAND (2K page, 5 addr cycle)",
180 "I2C (Addr 0x50)",
181 "EBC (16 bits)",
182 "Reserved",
183 "NAND (2K page, 4 addr cycle)",
184 "I2C (Addr 0x50)",
185 "NAND (512 page, 3 addr cycle)",
186 "I2C (Addr 0x50)",
187 "SPI (slow)",
188 "I2C (Addr 0x50)",
189};
Benoît Monin1a70cf22007-06-04 08:36:05 +0200190static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
191 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese3a75ac12007-04-18 12:05:59 +0200192#endif
193
Stefan Roese153b3e22007-10-05 17:10:59 +0200194#if defined(CONFIG_405EX)
195#define SDR0_PINSTP_SHIFT 29
196static char *bootstrap_str[] = {
197 "EBC (8 bits)",
198 "EBC (16 bits)",
199 "EBC (16 bits)",
200 "NAND (8 bits)",
201 "NAND (8 bits)",
202 "I2C (Addr 0x54)",
203 "EBC (8 bits)",
204 "I2C (Addr 0x52)",
205};
206static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
207#endif
208
Stefan Roese42fbddd2006-09-07 11:51:23 +0200209#if defined(SDR0_PINSTP_SHIFT)
210static int bootstrap_option(void)
211{
212 unsigned long val;
213
Stefan Roese3a75ac12007-04-18 12:05:59 +0200214 mfsdr(SDR_PINSTP, val);
215 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100216}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200217#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100218
219
wdenkc6097192002-11-03 00:24:07 +0000220#if defined(CONFIG_440)
Stefan Roese6964fd62007-11-09 12:18:54 +0100221static int do_chip_reset (unsigned long sys0, unsigned long sys1)
222{
223 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
224 * reset.
225 */
226 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
227 mtdcr (cpc0_sys0, sys0);
228 mtdcr (cpc0_sys1, sys1);
229 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
230 mtspr (dbcr0, 0x20000000); /* Reset the chip */
231
232 return 1;
233}
wdenkc6097192002-11-03 00:24:07 +0000234#endif
235
wdenkc6097192002-11-03 00:24:07 +0000236
237int checkcpu (void)
238{
Stefan Roese42f2a822005-11-27 19:36:26 +0100239#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-11-27 19:36:26 +0100240 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000241 ulong clock = gd->cpu_clk;
242 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000243
Stefan Roese42f2a822005-11-27 19:36:26 +0100244#if !defined(CONFIG_IOP480)
Wolfgang Denk65505432006-10-20 17:54:33 +0200245 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100246 sys_info_t sys_info;
wdenkc6097192002-11-03 00:24:07 +0000247
248 puts ("CPU: ");
249
250 get_sys_info(&sys_info);
251
Stefan Roese42f2a822005-11-27 19:36:26 +0100252 puts("AMCC PowerPC 4");
253
Stefan Roese17ffbc82007-03-21 13:38:59 +0100254#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
Stefan Roese153b3e22007-10-05 17:10:59 +0200255 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
256 defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100257 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000258#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100259#if defined(CONFIG_440)
260 puts("40");
stroese434979e2003-05-23 11:18:02 +0000261#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100262
wdenkc6097192002-11-03 00:24:07 +0000263 switch (pvr) {
264 case PVR_405GP_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100265 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000266 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100267
wdenkc6097192002-11-03 00:24:07 +0000268 case PVR_405GP_RC:
Stefan Roese42f2a822005-11-27 19:36:26 +0100269 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000270 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100271
wdenkc6097192002-11-03 00:24:07 +0000272 case PVR_405GP_RD:
Stefan Roese42f2a822005-11-27 19:36:26 +0100273 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000274 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100275
wdenkc35ba4e2004-03-14 22:25:36 +0000276#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100277 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
278 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000279 break;
280#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100281
wdenkc6097192002-11-03 00:24:07 +0000282 case PVR_405CR_RA:
Stefan Roese42f2a822005-11-27 19:36:26 +0100283 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000284 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100285
wdenkc6097192002-11-03 00:24:07 +0000286 case PVR_405CR_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100287 puts("CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000288 break;
wdenkc6097192002-11-03 00:24:07 +0000289
Stefan Roese42f2a822005-11-27 19:36:26 +0100290#ifdef CONFIG_405CR
291 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
292 puts("CR Rev. C");
293 break;
wdenkc6097192002-11-03 00:24:07 +0000294#endif
295
Stefan Roese42f2a822005-11-27 19:36:26 +0100296 case PVR_405GPR_RB:
297 puts("GPr Rev. B");
298 break;
wdenkc6097192002-11-03 00:24:07 +0000299
Stefan Roese42f2a822005-11-27 19:36:26 +0100300 case PVR_405EP_RB:
301 puts("EP Rev. B");
302 break;
wdenkc6097192002-11-03 00:24:07 +0000303
Stefan Roese17ffbc82007-03-21 13:38:59 +0100304 case PVR_405EZ_RA:
305 puts("EZ Rev. A");
306 break;
307
Stefan Roese153b3e22007-10-05 17:10:59 +0200308 case PVR_405EX1_RA:
309 puts("EX Rev. A");
310 strcpy(addstr, "Security support");
311 break;
312
313 case PVR_405EX2_RA:
314 puts("EX Rev. A");
315 strcpy(addstr, "No Security support");
316 break;
317
318 case PVR_405EXR1_RA:
319 puts("EXr Rev. A");
320 strcpy(addstr, "Security support");
321 break;
322
323 case PVR_405EXR2_RA:
324 puts("EXr Rev. A");
325 strcpy(addstr, "No Security support");
326 break;
327
wdenkc6097192002-11-03 00:24:07 +0000328#if defined(CONFIG_440)
wdenk57b2d802003-06-27 21:31:46 +0000329 case PVR_440GP_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200330 puts("GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000331 /* See errata 1.12: CHIP_4 */
332 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
333 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
334 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
335 "Resetting chip ...\n");
336 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
337 do_chip_reset ( mfdcr(cpc0_strp0),
338 mfdcr(cpc0_strp1) );
339 }
wdenkc6097192002-11-03 00:24:07 +0000340 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100341
wdenk57b2d802003-06-27 21:31:46 +0000342 case PVR_440GP_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200343 puts("GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000344 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100345
wdenk544e9732004-02-06 23:19:44 +0000346 case PVR_440GX_RA:
Stefan Roese326c9712005-08-01 16:41:48 +0200347 puts("GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000348 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100349
wdenk544e9732004-02-06 23:19:44 +0000350 case PVR_440GX_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200351 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000352 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100353
stroesec0125272005-04-07 05:33:41 +0000354 case PVR_440GX_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200355 puts("GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000356 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100357
Stefan Roese08fb4042005-11-01 10:08:03 +0100358 case PVR_440GX_RF:
359 puts("GX Rev. F");
360 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100361
Stefan Roese326c9712005-08-01 16:41:48 +0200362 case PVR_440EP_RA:
363 puts("EP Rev. A");
364 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100365
Stefan Roese95258d52005-10-04 15:00:30 +0200366#ifdef CONFIG_440EP
367 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese326c9712005-08-01 16:41:48 +0200368 puts("EP Rev. B");
369 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200370
371 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
372 puts("EP Rev. C");
373 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200374#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100375
Stefan Roese95258d52005-10-04 15:00:30 +0200376#ifdef CONFIG_440GR
377 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
378 puts("GR Rev. A");
379 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200380
Stefan Roese96467d62006-05-18 19:21:53 +0200381 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese31ce7de2006-05-10 14:10:41 +0200382 puts("GR Rev. B");
383 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200384#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100385#endif /* CONFIG_440 */
386
Stefan Roese188fab62007-01-31 16:56:10 +0100387#ifdef CONFIG_440EPX
388 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200389 puts("EPx Rev. A");
390 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200391 break;
392
Stefan Roese188fab62007-01-31 16:56:10 +0100393 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200394 puts("EPx Rev. A");
395 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200396 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100397#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200398
Stefan Roese188fab62007-01-31 16:56:10 +0100399#ifdef CONFIG_440GRX
400 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200401 puts("GRx Rev. A");
402 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200403 break;
404
Stefan Roese188fab62007-01-31 16:56:10 +0100405 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200406 puts("GRx Rev. A");
407 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200408 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100409#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200410
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100411 case PVR_440SP_6_RAB:
412 puts("SP Rev. A/B");
413 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100414 break;
415
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100416 case PVR_440SP_RAB:
417 puts("SP Rev. A/B");
418 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100419 break;
420
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100421 case PVR_440SP_6_RC:
422 puts("SP Rev. C");
423 strcpy(addstr, "RAID 6 support");
424 break;
425
Stefan Roesec6d59302006-11-28 16:09:24 +0100426 case PVR_440SP_RC:
427 puts("SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100428 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100429 break;
430
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100431 case PVR_440SPe_6_RA:
432 puts("SPe Rev. A");
433 strcpy(addstr, "RAID 6 support");
434 break;
435
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200436 case PVR_440SPe_RA:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200437 puts("SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100438 strcpy(addstr, "No RAID 6 support");
439 break;
440
441 case PVR_440SPe_6_RB:
442 puts("SPe Rev. B");
443 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200444 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200445
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200446 case PVR_440SPe_RB:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200447 puts("SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100448 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200449 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200450
wdenk57b2d802003-06-27 21:31:46 +0000451 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200452 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000453 break;
454 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100455
456 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100457 sys_info.freqPLB / 1000000,
458 get_OPB_freq() / 1000000,
Stefan Roese153b3e22007-10-05 17:10:59 +0200459 sys_info.freqEBC / 1000000);
Stefan Roese42f2a822005-11-27 19:36:26 +0100460
Stefan Roese11dd8812006-10-18 15:59:35 +0200461 if (addstr[0] != 0)
462 printf(" %s\n", addstr);
463
Stefan Roese99644742005-11-29 18:18:21 +0100464#if defined(I2C_BOOTROM)
465 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200466#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200467#if defined(SDR0_PINSTP_SHIFT)
Benoît Monin1a70cf22007-06-04 08:36:05 +0200468 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200469 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denk65505432006-10-20 17:54:33 +0200470#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100471
Stefan Roese153b3e22007-10-05 17:10:59 +0200472#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese99644742005-11-29 18:18:21 +0100473 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100474#endif
475
Stefan Roese99644742005-11-29 18:18:21 +0100476#if defined(PCI_ASYNC)
477 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100478 printf (", PCI async ext clock used");
479 } else {
480 printf (", PCI sync clock at %lu MHz",
481 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
482 }
wdenkc6097192002-11-03 00:24:07 +0000483#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100484
Stefan Roese153b3e22007-10-05 17:10:59 +0200485#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100486 putc('\n');
487#endif
488
Stefan Roese153b3e22007-10-05 17:10:59 +0200489#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100490 printf (" 16 kB I-Cache 16 kB D-Cache");
491#elif defined(CONFIG_440)
492 printf (" 32 kB I-Cache 32 kB D-Cache");
493#else
494 printf (" 16 kB I-Cache %d kB D-Cache",
495 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
496#endif
497#endif /* !defined(CONFIG_IOP480) */
498
499#if defined(CONFIG_IOP480)
500 printf ("PLX IOP480 (PVR=%08x)", pvr);
501 printf (" at %s MHz:", strmhz(buf, clock));
502 printf (" %u kB I-Cache", 4);
503 printf (" %u kB D-Cache", 2);
504#endif
505
506#endif /* !defined(CONFIG_405) */
507
508 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000509
510 return 0;
511}
512
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200513#if defined (CONFIG_440SPE)
514int ppc440spe_revB() {
515 unsigned int pvr;
516
517 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100518 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200519 return 1;
520 else
521 return 0;
522}
523#endif
wdenkc6097192002-11-03 00:24:07 +0000524
525/* ------------------------------------------------------------------------- */
526
wdenk57b2d802003-06-27 21:31:46 +0000527int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000528{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100529#if defined(CONFIG_BOARD_RESET)
530 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100531#else
Stefan Roese2a4a9432006-11-27 14:12:17 +0100532#if defined(CFG_4xx_RESET_TYPE)
533 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200534#else
wdenk57b2d802003-06-27 21:31:46 +0000535 /*
536 * Initiate system reset in debug control register DBCR
537 */
Stefan Roese03687752006-10-07 11:30:52 +0200538 mtspr(dbcr0, 0x30000000);
Stefan Roesea5232952006-11-27 14:52:04 +0100539#endif /* defined(CFG_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200540#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200541
wdenkc6097192002-11-03 00:24:07 +0000542 return 1;
543}
wdenkc6097192002-11-03 00:24:07 +0000544
545
546/*
547 * Get timebase clock frequency
548 */
549unsigned long get_tbclk (void)
550{
Stefan Roese42f2a822005-11-27 19:36:26 +0100551#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000552 sys_info_t sys_info;
553
554 get_sys_info(&sys_info);
555 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000556#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100557 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000558#endif
559
560}
561
562
563#if defined(CONFIG_WATCHDOG)
Stefan Roese6964fd62007-11-09 12:18:54 +0100564void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000565{
566 int re_enable = disable_interrupts();
567 reset_4xx_watchdog();
568 if (re_enable) enable_interrupts();
569}
570
Stefan Roese6964fd62007-11-09 12:18:54 +0100571void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000572{
573 /*
574 * Clear TSR(WIS) bit
575 */
576 mtspr(tsr, 0x40000000);
577}
578#endif /* CONFIG_WATCHDOG */