blob: 60aba8cefe41ac72ad90cdf0ced5ad167937e821 [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>
Stefan Roeseb36df562010-09-09 19:18:00 +020038#include <asm/ppc4xx.h>
Ben Warren25a85902008-10-27 23:53:17 -070039#include <netdev.h>
wdenkc6097192002-11-03 00:24:07 +000040
Wolfgang Denkd87080b2006-03-31 18:32:53 +020041DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denkd87080b2006-03-31 18:32:53 +020042
Stefan Roesef3443862006-10-07 11:30:52 +020043void board_reset(void);
Stefan Roesef3443862006-10-07 11:30:52 +020044
Adam Grahamc9c11d72008-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 Roese20b3c4b2009-07-06 11:44:33 +020057#if defined(CONFIG_PCI)
Stefan Roese887e2ec2006-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 Roese6e7fb6e2005-11-29 18:18:21 +010061
62#define PCI_ASYNC
63
Stefan Roesec7f69c32007-11-09 12:18:54 +010064static int pci_async_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010065{
66#if defined(CONFIG_405GP)
Stefan Roesed1c3b272009-09-09 16:25:29 +020067 return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010068#endif
69
Stefan Roese887e2ec2006-09-07 11:51:23 +020070#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +010071 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
72 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010073 unsigned long val;
74
Stefan Roesed1c3b272009-09-09 16:25:29 +020075 mfsdr(SDR0_SDSTP1, val);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010076 return (val & SDR0_SDSTP1_PAME_MASK);
77#endif
78}
79#endif
Stefan Roese20b3c4b2009-07-06 11:44:33 +020080#endif /* CONFIG_PCI */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010081
Stefan Roese99bcad12012-09-19 14:33:52 +020082#if defined(CONFIG_PCI) && \
Stefan Roesedbbd1252007-10-05 17:10:59 +020083 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roesea760b022009-11-12 16:41:09 +010084int pci_arbiter_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010085{
86#if defined(CONFIG_405GP)
Stefan Roesed1c3b272009-09-09 16:25:29 +020087 return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010088#endif
89
90#if defined(CONFIG_405EP)
Stefan Roesed1c3b272009-09-09 16:25:29 +020091 return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010092#endif
93
94#if defined(CONFIG_440GP)
Stefan Roesed1c3b272009-09-09 16:25:29 +020095 return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010096#endif
97
Stefan Roese7372ca62007-02-02 12:44:22 +010098#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010099 unsigned long val;
100
Stefan Roese5e7abce2010-09-11 09:31:43 +0200101 mfsdr(SDR0_XCR0, val);
102 return (val & SDR0_XCR0_PAE_MASK);
Stefan Roese7372ca62007-02-02 12:44:22 +0100103#endif
104#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roese2801b2d2008-03-11 15:05:50 +0100105 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
106 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese7372ca62007-02-02 12:44:22 +0100107 unsigned long val;
108
Stefan Roesed1c3b272009-09-09 16:25:29 +0200109 mfsdr(SDR0_PCI0, val);
Stefan Roese5e7abce2010-09-11 09:31:43 +0200110 return (val & SDR0_PCI0_PAE_MASK);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100111#endif
112}
113#endif
114
Stefan Roesec7f69c32007-11-09 12:18:54 +0100115#if defined(CONFIG_405EP)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100116#define I2C_BOOTROM
117
Stefan Roesec7f69c32007-11-09 12:18:54 +0100118static int i2c_bootrom_enabled(void)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100119{
120#if defined(CONFIG_405EP)
Stefan Roesed1c3b272009-09-09 16:25:29 +0200121 return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200122#else
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100123 unsigned long val;
124
Stefan Roesed1c3b272009-09-09 16:25:29 +0200125 mfsdr(SDR0_SDCS0, val);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100126 return (val & SDR0_SDCS_SDD);
127#endif
128}
Stefan Roese90e6f412007-04-18 12:05:59 +0200129#endif
Stefan Roese887e2ec2006-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 Monine3cbe1f2007-06-04 08:36:05 +0200143static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese887e2ec2006-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 Monine3cbe1f2007-06-04 08:36:05 +0200154static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese887e2ec2006-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 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
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 Monine3cbe1f2007-06-04 08:36:05 +0200184static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200185#endif
186
Stefan Roese2801b2d2008-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 Radenskyd98964a2010-01-19 17:37:13 +0200199static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
Stefan Roese2801b2d2008-03-11 15:05:50 +0100200#endif
201
Feng Kan7d307932008-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 Roese90e6f412007-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 Monine3cbe1f2007-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 Roese90e6f412007-04-18 12:05:59 +0200237#endif
238
Stefan Roesedbbd1252007-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
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700253#if defined(CONFIG_APM821XX)
254#define SDR0_PINSTP_SHIFT 29
255static char *bootstrap_str[] = {
256 "RESERVED",
257 "RESERVED",
258 "RESERVED",
259 "NAND (8 bits)",
260 "NOR (8 bits)",
261 "NOR (8 bits) w/PLL Bypassed",
262 "I2C (Addr 0x54)",
263 "I2C (Addr 0x52)",
264};
265static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
266#endif
Stefan Roesedbbd1252007-10-05 17:10:59 +0200267
Stefan Roese887e2ec2006-09-07 11:51:23 +0200268#if defined(SDR0_PINSTP_SHIFT)
269static int bootstrap_option(void)
270{
271 unsigned long val;
272
Stefan Roesed1c3b272009-09-09 16:25:29 +0200273 mfsdr(SDR0_PINSTP, val);
Stefan Roese90e6f412007-04-18 12:05:59 +0200274 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200275}
276#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100277
Stefan Roese3d9569b2005-11-27 19:36:26 +0100278
Stefan Roese5e7abce2010-09-11 09:31:43 +0200279#if defined(CONFIG_440GP)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100280static int do_chip_reset (unsigned long sys0, unsigned long sys1)
281{
Stefan Roesed1c3b272009-09-09 16:25:29 +0200282 /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
Stefan Roesec7f69c32007-11-09 12:18:54 +0100283 * reset.
284 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200285 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000); /* Set SWE */
286 mtdcr (CPC0_SYS0, sys0);
287 mtdcr (CPC0_SYS1, sys1);
288 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000); /* Clr SWE */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200289 mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
Stefan Roesec7f69c32007-11-09 12:18:54 +0100290
291 return 1;
292}
Stefan Roese5e7abce2010-09-11 09:31:43 +0200293#endif /* CONFIG_440GP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100294
wdenkc6097192002-11-03 00:24:07 +0000295
296int checkcpu (void)
297{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100298#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100299 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000300 ulong clock = gd->cpu_clk;
301 char buf[32];
Stefan Roese89bcc482009-07-29 08:45:27 +0200302#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
303 u32 reg;
304#endif
wdenkc6097192002-11-03 00:24:07 +0000305
Wolfgang Denkba999c52006-10-20 17:54:33 +0200306 char addstr[64] = "";
Stefan Roese3d9569b2005-11-27 19:36:26 +0100307 sys_info_t sys_info;
Adam Grahamc9c11d72008-10-08 10:13:19 -0700308 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000309
Adam Grahamc9c11d72008-10-08 10:13:19 -0700310 cpu_num = get_cpu_num();
311 if (cpu_num >= 0)
312 printf("CPU%d: ", cpu_num);
313 else
314 puts("CPU: ");
wdenkc6097192002-11-03 00:24:07 +0000315
316 get_sys_info(&sys_info);
317
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200318#if defined(CONFIG_XILINX_440)
Stefan Roesee02d4492010-09-03 13:27:02 +0200319 puts("IBM PowerPC ");
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200320#else
Stefan Roesee02d4492010-09-03 13:27:02 +0200321 puts("AMCC PowerPC ");
Stefan Roese2801b2d2008-03-11 15:05:50 +0100322#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100323
wdenkc6097192002-11-03 00:24:07 +0000324 switch (pvr) {
Stefan Roesee02d4492010-09-03 13:27:02 +0200325
326#if !defined(CONFIG_440)
wdenkc6097192002-11-03 00:24:07 +0000327 case PVR_405GP_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200328 puts("405GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000329 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100330
wdenkc6097192002-11-03 00:24:07 +0000331 case PVR_405GP_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200332 puts("405GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000333 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100334
wdenkc6097192002-11-03 00:24:07 +0000335 case PVR_405GP_RD:
Stefan Roesee02d4492010-09-03 13:27:02 +0200336 puts("405GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000337 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100338
wdenk42dfe7a2004-03-14 22:25:36 +0000339#ifdef CONFIG_405GP
Stefan Roese3d9569b2005-11-27 19:36:26 +0100340 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200341 puts("405GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000342 break;
343#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100344
wdenkc6097192002-11-03 00:24:07 +0000345 case PVR_405CR_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200346 puts("405CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000347 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100348
wdenkc6097192002-11-03 00:24:07 +0000349 case PVR_405CR_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200350 puts("405CR Rev. B");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100351 break;
352
353#ifdef CONFIG_405CR
354 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200355 puts("405CR Rev. C");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100356 break;
357#endif
358
359 case PVR_405GPR_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200360 puts("405GPr Rev. B");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100361 break;
362
stroeseb867d702003-05-23 11:18:02 +0000363 case PVR_405EP_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200364 puts("405EP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000365 break;
wdenkc6097192002-11-03 00:24:07 +0000366
Stefan Roesee01bd212007-03-21 13:38:59 +0100367 case PVR_405EZ_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200368 puts("405EZ Rev. A");
Stefan Roesee01bd212007-03-21 13:38:59 +0100369 break;
370
Stefan Roesedbbd1252007-10-05 17:10:59 +0200371 case PVR_405EX1_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200372 puts("405EX Rev. A");
Stefan Roesedbbd1252007-10-05 17:10:59 +0200373 strcpy(addstr, "Security support");
374 break;
375
Stefan Roesedbbd1252007-10-05 17:10:59 +0200376 case PVR_405EXR2_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200377 puts("405EXr Rev. A");
Stefan Roesedbbd1252007-10-05 17:10:59 +0200378 strcpy(addstr, "No Security support");
379 break;
380
Stefan Roese70fab192008-05-13 20:22:01 +0200381 case PVR_405EX1_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200382 puts("405EX Rev. C");
Stefan Roese70fab192008-05-13 20:22:01 +0200383 strcpy(addstr, "Security support");
384 break;
385
386 case PVR_405EX2_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200387 puts("405EX Rev. C");
Stefan Roese70fab192008-05-13 20:22:01 +0200388 strcpy(addstr, "No Security support");
389 break;
390
391 case PVR_405EXR1_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200392 puts("405EXr Rev. C");
Stefan Roese70fab192008-05-13 20:22:01 +0200393 strcpy(addstr, "Security support");
394 break;
395
396 case PVR_405EXR2_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200397 puts("405EXr Rev. C");
Stefan Roese70fab192008-05-13 20:22:01 +0200398 strcpy(addstr, "No Security support");
399 break;
400
Stefan Roese56f14812009-10-06 07:21:08 +0200401 case PVR_405EX1_RD:
Stefan Roesee02d4492010-09-03 13:27:02 +0200402 puts("405EX Rev. D");
Stefan Roese56f14812009-10-06 07:21:08 +0200403 strcpy(addstr, "Security support");
404 break;
405
406 case PVR_405EX2_RD:
Stefan Roesee02d4492010-09-03 13:27:02 +0200407 puts("405EX Rev. D");
Stefan Roese56f14812009-10-06 07:21:08 +0200408 strcpy(addstr, "No Security support");
409 break;
410
411 case PVR_405EXR1_RD:
Stefan Roesee02d4492010-09-03 13:27:02 +0200412 puts("405EXr Rev. D");
Stefan Roese56f14812009-10-06 07:21:08 +0200413 strcpy(addstr, "Security support");
414 break;
415
416 case PVR_405EXR2_RD:
Stefan Roesee02d4492010-09-03 13:27:02 +0200417 puts("405EXr Rev. D");
Stefan Roese56f14812009-10-06 07:21:08 +0200418 strcpy(addstr, "No Security support");
419 break;
420
Stefan Roesee02d4492010-09-03 13:27:02 +0200421#else /* CONFIG_440 */
422
Stefan Roese5e7abce2010-09-11 09:31:43 +0200423#if defined(CONFIG_440GP)
wdenk8bde7f72003-06-27 21:31:46 +0000424 case PVR_440GP_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200425 puts("440GP Rev. B");
wdenk4d816772003-09-03 14:03:26 +0000426 /* See errata 1.12: CHIP_4 */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200427 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
428 (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
wdenk4d816772003-09-03 14:03:26 +0000429 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
430 "Resetting chip ...\n");
431 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
Stefan Roesed1c3b272009-09-09 16:25:29 +0200432 do_chip_reset ( mfdcr(CPC0_STRP0),
433 mfdcr(CPC0_STRP1) );
wdenk4d816772003-09-03 14:03:26 +0000434 }
wdenkc6097192002-11-03 00:24:07 +0000435 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100436
wdenk8bde7f72003-06-27 21:31:46 +0000437 case PVR_440GP_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200438 puts("440GP Rev. C");
wdenkba56f622004-02-06 23:19:44 +0000439 break;
Stefan Roese5e7abce2010-09-11 09:31:43 +0200440#endif /* CONFIG_440GP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100441
wdenkba56f622004-02-06 23:19:44 +0000442 case PVR_440GX_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200443 puts("440GX Rev. A");
wdenkba56f622004-02-06 23:19:44 +0000444 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100445
wdenkba56f622004-02-06 23:19:44 +0000446 case PVR_440GX_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200447 puts("440GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000448 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100449
stroese0a7c5392005-04-07 05:33:41 +0000450 case PVR_440GX_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200451 puts("440GX Rev. C");
stroese0a7c5392005-04-07 05:33:41 +0000452 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100453
Stefan Roese57275b62005-11-01 10:08:03 +0100454 case PVR_440GX_RF:
Stefan Roesee02d4492010-09-03 13:27:02 +0200455 puts("440GX Rev. F");
Stefan Roese57275b62005-11-01 10:08:03 +0100456 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100457
Stefan Roesec157d8e2005-08-01 16:41:48 +0200458 case PVR_440EP_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200459 puts("440EP Rev. A");
Stefan Roesec157d8e2005-08-01 16:41:48 +0200460 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100461
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200462#ifdef CONFIG_440EP
463 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200464 puts("440EP Rev. B");
Stefan Roesec157d8e2005-08-01 16:41:48 +0200465 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200466
467 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200468 puts("440EP Rev. C");
Stefan Roese512f8d52006-05-10 14:10:41 +0200469 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200470#endif /* CONFIG_440EP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100471
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200472#ifdef CONFIG_440GR
473 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200474 puts("440GR Rev. A");
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200475 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200476
Stefan Roese5770a1e2006-05-18 19:21:53 +0200477 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200478 puts("440GR Rev. B");
Stefan Roese512f8d52006-05-10 14:10:41 +0200479 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200480#endif /* CONFIG_440GR */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100481
Stefan Roese2902fad2007-01-31 16:56:10 +0100482#ifdef CONFIG_440EPX
483 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200484 puts("440EPx Rev. A");
Stefan Roeseedf0b542006-10-18 15:59:35 +0200485 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200486 break;
487
Stefan Roese2902fad2007-01-31 16:56:10 +0100488 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200489 puts("440EPx Rev. A");
Stefan Roeseedf0b542006-10-18 15:59:35 +0200490 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200491 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100492#endif /* CONFIG_440EPX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200493
Stefan Roese2902fad2007-01-31 16:56:10 +0100494#ifdef CONFIG_440GRX
495 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200496 puts("440GRx Rev. A");
Stefan Roeseedf0b542006-10-18 15:59:35 +0200497 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200498 break;
499
Stefan Roese2902fad2007-01-31 16:56:10 +0100500 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roesee02d4492010-09-03 13:27:02 +0200501 puts("440GRx Rev. A");
Stefan Roeseedf0b542006-10-18 15:59:35 +0200502 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200503 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100504#endif /* CONFIG_440GRX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200505
Stefan Roese95981772007-01-13 08:01:03 +0100506 case PVR_440SP_6_RAB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200507 puts("440SP Rev. A/B");
Stefan Roese95981772007-01-13 08:01:03 +0100508 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100509 break;
510
Stefan Roese95981772007-01-13 08:01:03 +0100511 case PVR_440SP_RAB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200512 puts("440SP Rev. A/B");
Stefan Roese95981772007-01-13 08:01:03 +0100513 strcpy(addstr, "No RAID 6 support");
514 break;
515
516 case PVR_440SP_6_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200517 puts("440SP Rev. C");
Stefan Roese95981772007-01-13 08:01:03 +0100518 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100519 break;
520
Stefan Roesee732fae2006-11-28 16:09:24 +0100521 case PVR_440SP_RC:
Stefan Roesee02d4492010-09-03 13:27:02 +0200522 puts("440SP Rev. C");
Stefan Roese95981772007-01-13 08:01:03 +0100523 strcpy(addstr, "No RAID 6 support");
524 break;
525
526 case PVR_440SPe_6_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200527 puts("440SPe Rev. A");
Stefan Roese95981772007-01-13 08:01:03 +0100528 strcpy(addstr, "RAID 6 support");
Stefan Roesee732fae2006-11-28 16:09:24 +0100529 break;
530
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200531 case PVR_440SPe_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200532 puts("440SPe Rev. A");
Stefan Roese95981772007-01-13 08:01:03 +0100533 strcpy(addstr, "No RAID 6 support");
534 break;
535
536 case PVR_440SPe_6_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200537 puts("440SPe Rev. B");
Stefan Roese95981772007-01-13 08:01:03 +0100538 strcpy(addstr, "RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200539 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200540
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200541 case PVR_440SPe_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200542 puts("440SPe Rev. B");
Stefan Roese95981772007-01-13 08:01:03 +0100543 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200544 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200545
Stefan Roese89bcc482009-07-29 08:45:27 +0200546#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese2801b2d2008-03-11 15:05:50 +0100547 case PVR_460EX_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200548 puts("460EX Rev. A");
Stefan Roese2801b2d2008-03-11 15:05:50 +0100549 strcpy(addstr, "No Security/Kasumi support");
550 break;
551
552 case PVR_460EX_SE_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200553 puts("460EX Rev. A");
Stefan Roese2801b2d2008-03-11 15:05:50 +0100554 strcpy(addstr, "Security/Kasumi support");
555 break;
556
Stefan Roese89bcc482009-07-29 08:45:27 +0200557 case PVR_460EX_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200558 puts("460EX Rev. B");
Stefan Roese89bcc482009-07-29 08:45:27 +0200559 mfsdr(SDR0_ECID3, reg);
560 if (reg & 0x00100000)
561 strcpy(addstr, "No Security/Kasumi support");
562 else
563 strcpy(addstr, "Security/Kasumi support");
564 break;
565
Stefan Roese2801b2d2008-03-11 15:05:50 +0100566 case PVR_460GT_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200567 puts("460GT Rev. A");
Stefan Roese2801b2d2008-03-11 15:05:50 +0100568 strcpy(addstr, "No Security/Kasumi support");
569 break;
570
571 case PVR_460GT_SE_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200572 puts("460GT Rev. A");
Stefan Roese2801b2d2008-03-11 15:05:50 +0100573 strcpy(addstr, "Security/Kasumi support");
574 break;
575
Stefan Roese89bcc482009-07-29 08:45:27 +0200576 case PVR_460GT_RB:
Stefan Roesee02d4492010-09-03 13:27:02 +0200577 puts("460GT Rev. B");
Stefan Roese89bcc482009-07-29 08:45:27 +0200578 mfsdr(SDR0_ECID3, reg);
579 if (reg & 0x00100000)
580 strcpy(addstr, "No Security/Kasumi support");
581 else
582 strcpy(addstr, "Security/Kasumi support");
583 break;
584#endif
585
Feng Kan7d307932008-07-08 22:47:31 -0700586 case PVR_460SX_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200587 puts("460SX Rev. A");
Feng Kan7d307932008-07-08 22:47:31 -0700588 strcpy(addstr, "Security support");
589 break;
590
591 case PVR_460SX_RA_V1:
Stefan Roesee02d4492010-09-03 13:27:02 +0200592 puts("460SX Rev. A");
Feng Kan7d307932008-07-08 22:47:31 -0700593 strcpy(addstr, "No Security support");
594 break;
595
596 case PVR_460GX_RA:
Stefan Roesee02d4492010-09-03 13:27:02 +0200597 puts("460GX Rev. A");
Feng Kan7d307932008-07-08 22:47:31 -0700598 strcpy(addstr, "Security support");
599 break;
600
601 case PVR_460GX_RA_V1:
Stefan Roesee02d4492010-09-03 13:27:02 +0200602 puts("460GX Rev. A");
Feng Kan7d307932008-07-08 22:47:31 -0700603 strcpy(addstr, "No Security support");
604 break;
605
Tirumala Marri1b8fec12010-09-28 14:15:14 -0700606 case PVR_APM821XX_RA:
607 puts("APM821XX Rev. A");
608 strcpy(addstr, "Security support");
609 break;
610
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200611 case PVR_VIRTEX5:
Stefan Roesee02d4492010-09-03 13:27:02 +0200612 puts("440x5 VIRTEX5");
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200613 break;
Stefan Roesee02d4492010-09-03 13:27:02 +0200614#endif /* CONFIG_440 */
Ricardo Ribalda Delgadod865fd02008-07-17 11:44:12 +0200615
wdenk8bde7f72003-06-27 21:31:46 +0000616 default:
Stefan Roese17f50f222005-08-04 17:09:16 +0200617 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000618 break;
619 }
Stefan Roese3d9569b2005-11-27 19:36:26 +0100620
Stefan Roese08c6a262009-10-19 14:44:11 +0200621 printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
622 strmhz(buf, clock),
Stefan Roesee01bd212007-03-21 13:38:59 +0100623 sys_info.freqPLB / 1000000,
624 get_OPB_freq() / 1000000,
Stefan Roesedbbd1252007-10-05 17:10:59 +0200625 sys_info.freqEBC / 1000000);
Stefan Roese08c6a262009-10-19 14:44:11 +0200626#if defined(CONFIG_PCI) && \
627 (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
628 defined(CONFIG_440GR) || defined(CONFIG_440GRX))
629 printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
630#endif
631 printf(")\n");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100632
Stefan Roeseedf0b542006-10-18 15:59:35 +0200633 if (addstr[0] != 0)
634 printf(" %s\n", addstr);
635
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100636#if defined(I2C_BOOTROM)
637 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese90e6f412007-04-18 12:05:59 +0200638#endif /* I2C_BOOTROM */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200639#if defined(SDR0_PINSTP_SHIFT)
BenoƮt Monine3cbe1f2007-06-04 08:36:05 +0200640 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roesecf940982009-04-15 10:50:48 +0200641 printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
642#ifdef CONFIG_NAND_U_BOOT
643 puts(", booting from NAND");
644#endif /* CONFIG_NAND_U_BOOT */
645 putc('\n');
Wolfgang Denkba999c52006-10-20 17:54:33 +0200646#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100647
Stefan Roesedbbd1252007-10-05 17:10:59 +0200648#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100649 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100650#endif
651
Stefan Roese1bbae2b2009-05-27 10:34:32 +0200652#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100653 if (pci_async_enabled()) {
Stefan Roese3d9569b2005-11-27 19:36:26 +0100654 printf (", PCI async ext clock used");
655 } else {
656 printf (", PCI sync clock at %lu MHz",
657 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
658 }
659#endif
660
Stefan Roesedbbd1252007-10-05 17:10:59 +0200661#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100662 putc('\n');
663#endif
664
Stefan Roesedbbd1252007-10-05 17:10:59 +0200665#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100666 printf (" 16 kB I-Cache 16 kB D-Cache");
667#elif defined(CONFIG_440)
668 printf (" 32 kB I-Cache 32 kB D-Cache");
669#else
670 printf (" 16 kB I-Cache %d kB D-Cache",
671 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
672#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100673
674#endif /* !defined(CONFIG_405) */
675
676 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000677
678 return 0;
679}
680
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200681int ppc440spe_revB() {
682 unsigned int pvr;
683
684 pvr = get_pvr();
Stefan Roese5a5c5692007-01-15 09:46:29 +0100685 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200686 return 1;
687 else
688 return 0;
689}
wdenkc6097192002-11-03 00:24:07 +0000690
691/* ------------------------------------------------------------------------- */
692
Wolfgang Denk54841ab2010-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 Roese1f94d162006-11-27 14:48:41 +0100695#if defined(CONFIG_BOARD_RESET)
696 board_reset();
Stefan Roese1729b922006-11-27 14:52:04 +0100697#else
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200698#if defined(CONFIG_SYS_4xx_RESET_TYPE)
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200699 mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roesec157d8e2005-08-01 16:41:48 +0200700#else
wdenk8bde7f72003-06-27 21:31:46 +0000701 /*
702 * Initiate system reset in debug control register DBCR
703 */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200704 mtspr(SPRN_DBCR0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200705#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roesef3443862006-10-07 11:30:52 +0200706#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200707
wdenkc6097192002-11-03 00:24:07 +0000708 return 1;
709}
710
wdenkc6097192002-11-03 00:24:07 +0000711
712/*
713 * Get timebase clock frequency
714 */
715unsigned long get_tbclk (void)
716{
wdenkc6097192002-11-03 00:24:07 +0000717 sys_info_t sys_info;
718
719 get_sys_info(&sys_info);
720 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000721}
722
723
724#if defined(CONFIG_WATCHDOG)
Stefan Roesec7f69c32007-11-09 12:18:54 +0100725void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000726{
727 int re_enable = disable_interrupts();
728 reset_4xx_watchdog();
729 if (re_enable) enable_interrupts();
730}
731
Stefan Roesec7f69c32007-11-09 12:18:54 +0100732void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000733{
734 /*
735 * Clear TSR(WIS) bit
736 */
Matthias Fuchs58ea1422009-07-22 17:27:56 +0200737 mtspr(SPRN_TSR, 0x40000000);
wdenkc6097192002-11-03 00:24:07 +0000738}
739#endif /* CONFIG_WATCHDOG */
Ben Warren25a85902008-10-27 23:53:17 -0700740
741/*
742 * Initializes on-chip ethernet controllers.
743 * to override, implement board_eth_init()
744 */
745int cpu_eth_init(bd_t *bis)
746{
747#if defined(CONFIG_PPC4xx_EMAC)
748 ppc_4xx_eth_initialize(bis);
749#endif
750 return 0;
751}