blob: 67f1fff7efe7613f6f7ce83632aa018028f7dca8 [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Stefan Roese153b3e22007-10-05 17:10:59 +02002 * (C) Copyright 2000-2007
wdenkc6097192002-11-03 00:24:07 +00003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
wdenkc6097192002-11-03 00:24:07 +000025 * CPU specific code
26 *
27 * written or collected and sometimes rewritten by
28 * Magnus Damm <damm@bitsmart.com>
29 *
30 * minor modifications by
31 * Wolfgang Denk <wd@denx.de>
32 */
33
34#include <common.h>
35#include <watchdog.h>
36#include <command.h>
37#include <asm/cache.h>
Stefan Roese247e9d72010-09-09 19:18:00 +020038#include <asm/ppc4xx.h>
Ben Warren9e37c582008-10-27 23:53:17 -070039#include <netdev.h>
wdenkc6097192002-11-03 00:24:07 +000040
Wolfgang Denk6405a152006-03-31 18:32:53 +020041DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denk6405a152006-03-31 18:32:53 +020042
Stefan Roese03687752006-10-07 11:30:52 +020043void board_reset(void);
Stefan Roese03687752006-10-07 11:30:52 +020044
Adam Grahamc31ff682008-10-08 10:13:19 -070045/*
46 * To provide an interface to detect CPU number for boards that support
47 * more then one CPU, we implement the "weak" default functions here.
48 *
49 * Returns CPU number
50 */
51int __get_cpu_num(void)
52{
53 return NA_OR_UNKNOWN_CPU;
54}
55int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
56
Stefan Roese9f500fa2009-07-06 11:44:33 +020057#if defined(CONFIG_PCI)
Stefan Roese42fbddd2006-09-07 11:51:23 +020058#if defined(CONFIG_405GP) || \
59 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
60 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010061
62#define PCI_ASYNC
63
Stefan Roese6964fd62007-11-09 12:18:54 +010064static int pci_async_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010065{
66#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020067 return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010068#endif
69
Stefan Roese42fbddd2006-09-07 11:51:23 +020070#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +010071 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
72 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese99644742005-11-29 18:18:21 +010073 unsigned long val;
74
Stefan Roese918010a2009-09-09 16:25:29 +020075 mfsdr(SDR0_SDSTP1, val);
Stefan Roese99644742005-11-29 18:18:21 +010076 return (val & SDR0_SDSTP1_PAME_MASK);
77#endif
78}
79#endif
Stefan Roese9f500fa2009-07-06 11:44:33 +020080#endif /* CONFIG_PCI */
Stefan Roese99644742005-11-29 18:18:21 +010081
Stefan Roese153b3e22007-10-05 17:10:59 +020082#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
83 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roese5d8033e2009-11-12 16:41:09 +010084int pci_arbiter_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010085{
86#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020087 return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
Stefan Roese99644742005-11-29 18:18:21 +010088#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010089
Stefan Roese99644742005-11-29 18:18:21 +010090#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +020091 return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010092#endif
93
94#if defined(CONFIG_440GP)
Stefan Roese918010a2009-09-09 16:25:29 +020095 return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
Stefan Roese99644742005-11-29 18:18:21 +010096#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010097
Stefan Roese84382432007-02-02 12:44:22 +010098#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010099 unsigned long val;
100
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200101 mfsdr(SDR0_XCR0, val);
102 return (val & SDR0_XCR0_PAE_MASK);
Stefan Roese84382432007-02-02 12:44:22 +0100103#endif
104#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +0100105 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
106 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese84382432007-02-02 12:44:22 +0100107 unsigned long val;
108
Stefan Roese918010a2009-09-09 16:25:29 +0200109 mfsdr(SDR0_PCI0, val);
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200110 return (val & SDR0_PCI0_PAE_MASK);
Stefan Roese42f2a822005-11-27 19:36:26 +0100111#endif
Stefan Roese99644742005-11-29 18:18:21 +0100112}
113#endif
114
Stefan Roese6964fd62007-11-09 12:18:54 +0100115#if defined(CONFIG_405EP)
Stefan Roese99644742005-11-29 18:18:21 +0100116#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100117
Stefan Roese6964fd62007-11-09 12:18:54 +0100118static int i2c_bootrom_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +0100119{
120#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +0200121 return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200122#else
Stefan Roese99644742005-11-29 18:18:21 +0100123 unsigned long val;
124
Stefan Roese918010a2009-09-09 16:25:29 +0200125 mfsdr(SDR0_SDCS0, val);
Stefan Roese99644742005-11-29 18:18:21 +0100126 return (val & SDR0_SDCS_SDD);
127#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200128}
Stefan Roese3a75ac12007-04-18 12:05:59 +0200129#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200130
131#if defined(CONFIG_440GX)
132#define SDR0_PINSTP_SHIFT 29
133static char *bootstrap_str[] = {
134 "EBC (16 bits)",
135 "EBC (8 bits)",
136 "EBC (32 bits)",
137 "EBC (8 bits)",
138 "PCI",
139 "I2C (Addr 0x54)",
140 "Reserved",
141 "I2C (Addr 0x50)",
142};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200143static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200144#endif
145
146#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
147#define SDR0_PINSTP_SHIFT 30
148static char *bootstrap_str[] = {
149 "EBC (8 bits)",
150 "PCI",
151 "I2C (Addr 0x54)",
152 "I2C (Addr 0x50)",
153};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200154static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese42fbddd2006-09-07 11:51:23 +0200155#endif
156
157#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
158#define SDR0_PINSTP_SHIFT 29
159static char *bootstrap_str[] = {
160 "EBC (8 bits)",
161 "PCI",
162 "NAND (8 bits)",
163 "EBC (16 bits)",
164 "EBC (16 bits)",
165 "I2C (Addr 0x54)",
166 "PCI",
167 "I2C (Addr 0x52)",
168};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200169static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200170#endif
171
172#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
173#define SDR0_PINSTP_SHIFT 29
174static char *bootstrap_str[] = {
175 "EBC (8 bits)",
176 "EBC (16 bits)",
177 "EBC (16 bits)",
178 "NAND (8 bits)",
179 "PCI",
180 "I2C (Addr 0x54)",
181 "PCI",
182 "I2C (Addr 0x52)",
183};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200184static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200185#endif
186
Stefan Roesecc019d12008-03-11 15:05:50 +0100187#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
188#define SDR0_PINSTP_SHIFT 29
189static char *bootstrap_str[] = {
190 "EBC (8 bits)",
191 "EBC (16 bits)",
192 "PCI",
193 "PCI",
194 "EBC (16 bits)",
195 "NAND (8 bits)",
196 "I2C (Addr 0x54)", /* A8 */
197 "I2C (Addr 0x52)", /* A4 */
198};
Felix Radenskye6be1452010-01-19 17:37:13 +0200199static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
Stefan Roesecc019d12008-03-11 15:05:50 +0100200#endif
201
Feng Kan224bc962008-07-08 22:47:31 -0700202#if defined(CONFIG_460SX)
203#define SDR0_PINSTP_SHIFT 29
204static char *bootstrap_str[] = {
205 "EBC (8 bits)",
206 "EBC (16 bits)",
207 "EBC (32 bits)",
208 "NAND (8 bits)",
209 "I2C (Addr 0x54)", /* A8 */
210 "I2C (Addr 0x52)", /* A4 */
211};
212static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
213#endif
214
Stefan Roese3a75ac12007-04-18 12:05:59 +0200215#if defined(CONFIG_405EZ)
216#define SDR0_PINSTP_SHIFT 28
217static char *bootstrap_str[] = {
218 "EBC (8 bits)",
219 "SPI (fast)",
220 "NAND (512 page, 4 addr cycle)",
221 "I2C (Addr 0x50)",
222 "EBC (32 bits)",
223 "I2C (Addr 0x50)",
224 "NAND (2K page, 5 addr cycle)",
225 "I2C (Addr 0x50)",
226 "EBC (16 bits)",
227 "Reserved",
228 "NAND (2K page, 4 addr cycle)",
229 "I2C (Addr 0x50)",
230 "NAND (512 page, 3 addr cycle)",
231 "I2C (Addr 0x50)",
232 "SPI (slow)",
233 "I2C (Addr 0x50)",
234};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200235static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
236 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese3a75ac12007-04-18 12:05:59 +0200237#endif
238
Stefan Roese153b3e22007-10-05 17:10:59 +0200239#if defined(CONFIG_405EX)
240#define SDR0_PINSTP_SHIFT 29
241static char *bootstrap_str[] = {
242 "EBC (8 bits)",
243 "EBC (16 bits)",
244 "EBC (16 bits)",
245 "NAND (8 bits)",
246 "NAND (8 bits)",
247 "I2C (Addr 0x54)",
248 "EBC (8 bits)",
249 "I2C (Addr 0x52)",
250};
251static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
252#endif
Tirumala Marri95ac4282010-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 Roese153b3e22007-10-05 17:10:59 +0200267
Stefan Roese42fbddd2006-09-07 11:51:23 +0200268#if defined(SDR0_PINSTP_SHIFT)
269static int bootstrap_option(void)
270{
271 unsigned long val;
272
Stefan Roese918010a2009-09-09 16:25:29 +0200273 mfsdr(SDR0_PINSTP, val);
Stefan Roese3a75ac12007-04-18 12:05:59 +0200274 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100275}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200276#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100277
278
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200279#if defined(CONFIG_440GP)
Stefan Roese6964fd62007-11-09 12:18:54 +0100280static int do_chip_reset (unsigned long sys0, unsigned long sys1)
281{
Stefan Roese918010a2009-09-09 16:25:29 +0200282 /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
Stefan Roese6964fd62007-11-09 12:18:54 +0100283 * reset.
284 */
Stefan Roese918010a2009-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 Fuchs730b2d22009-07-22 17:27:56 +0200289 mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
Stefan Roese6964fd62007-11-09 12:18:54 +0100290
291 return 1;
292}
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200293#endif /* CONFIG_440GP */
wdenkc6097192002-11-03 00:24:07 +0000294
wdenkc6097192002-11-03 00:24:07 +0000295
296int checkcpu (void)
297{
Stefan Roese42f2a822005-11-27 19:36:26 +0100298#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-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 Roese048f5a62009-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
Stefan Roese42f2a822005-11-27 19:36:26 +0100306#if !defined(CONFIG_IOP480)
Wolfgang Denk65505432006-10-20 17:54:33 +0200307 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100308 sys_info_t sys_info;
Adam Grahamc31ff682008-10-08 10:13:19 -0700309 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000310
Adam Grahamc31ff682008-10-08 10:13:19 -0700311 cpu_num = get_cpu_num();
312 if (cpu_num >= 0)
313 printf("CPU%d: ", cpu_num);
314 else
315 puts("CPU: ");
wdenkc6097192002-11-03 00:24:07 +0000316
317 get_sys_info(&sys_info);
318
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200319#if defined(CONFIG_XILINX_440)
Stefan Roese43e1b452010-09-03 13:27:02 +0200320 puts("IBM PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200321#else
Stefan Roese43e1b452010-09-03 13:27:02 +0200322 puts("AMCC PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200323#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100324
wdenkc6097192002-11-03 00:24:07 +0000325 switch (pvr) {
Stefan Roese43e1b452010-09-03 13:27:02 +0200326
327#if !defined(CONFIG_440)
wdenkc6097192002-11-03 00:24:07 +0000328 case PVR_405GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200329 puts("405GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000330 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100331
wdenkc6097192002-11-03 00:24:07 +0000332 case PVR_405GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200333 puts("405GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000334 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100335
wdenkc6097192002-11-03 00:24:07 +0000336 case PVR_405GP_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200337 puts("405GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000338 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100339
wdenkc35ba4e2004-03-14 22:25:36 +0000340#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100341 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200342 puts("405GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000343 break;
344#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100345
wdenkc6097192002-11-03 00:24:07 +0000346 case PVR_405CR_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200347 puts("405CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000348 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100349
wdenkc6097192002-11-03 00:24:07 +0000350 case PVR_405CR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200351 puts("405CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000352 break;
wdenkc6097192002-11-03 00:24:07 +0000353
Stefan Roese42f2a822005-11-27 19:36:26 +0100354#ifdef CONFIG_405CR
355 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200356 puts("405CR Rev. C");
Stefan Roese42f2a822005-11-27 19:36:26 +0100357 break;
wdenkc6097192002-11-03 00:24:07 +0000358#endif
359
Stefan Roese42f2a822005-11-27 19:36:26 +0100360 case PVR_405GPR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200361 puts("405GPr Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100362 break;
wdenkc6097192002-11-03 00:24:07 +0000363
Stefan Roese42f2a822005-11-27 19:36:26 +0100364 case PVR_405EP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200365 puts("405EP Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100366 break;
wdenkc6097192002-11-03 00:24:07 +0000367
Stefan Roese17ffbc82007-03-21 13:38:59 +0100368 case PVR_405EZ_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200369 puts("405EZ Rev. A");
Stefan Roese17ffbc82007-03-21 13:38:59 +0100370 break;
371
Stefan Roese153b3e22007-10-05 17:10:59 +0200372 case PVR_405EX1_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200373 puts("405EX Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200374 strcpy(addstr, "Security support");
375 break;
376
Stefan Roese153b3e22007-10-05 17:10:59 +0200377 case PVR_405EXR2_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200378 puts("405EXr Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200379 strcpy(addstr, "No Security support");
380 break;
381
Stefan Roesefbf24302008-05-13 20:22:01 +0200382 case PVR_405EX1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200383 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200384 strcpy(addstr, "Security support");
385 break;
386
387 case PVR_405EX2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200388 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200389 strcpy(addstr, "No Security support");
390 break;
391
392 case PVR_405EXR1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200393 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200394 strcpy(addstr, "Security support");
395 break;
396
397 case PVR_405EXR2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200398 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200399 strcpy(addstr, "No Security support");
400 break;
401
Stefan Roesef1a80e42009-10-06 07:21:08 +0200402 case PVR_405EX1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200403 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200404 strcpy(addstr, "Security support");
405 break;
406
407 case PVR_405EX2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200408 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200409 strcpy(addstr, "No Security support");
410 break;
411
412 case PVR_405EXR1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200413 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200414 strcpy(addstr, "Security support");
415 break;
416
417 case PVR_405EXR2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200418 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200419 strcpy(addstr, "No Security support");
420 break;
421
Stefan Roese43e1b452010-09-03 13:27:02 +0200422#else /* CONFIG_440 */
423
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200424#if defined(CONFIG_440GP)
wdenk57b2d802003-06-27 21:31:46 +0000425 case PVR_440GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200426 puts("440GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000427 /* See errata 1.12: CHIP_4 */
Stefan Roese918010a2009-09-09 16:25:29 +0200428 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
429 (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
wdenka4685fe2003-09-03 14:03:26 +0000430 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
431 "Resetting chip ...\n");
432 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
Stefan Roese918010a2009-09-09 16:25:29 +0200433 do_chip_reset ( mfdcr(CPC0_STRP0),
434 mfdcr(CPC0_STRP1) );
wdenka4685fe2003-09-03 14:03:26 +0000435 }
wdenkc6097192002-11-03 00:24:07 +0000436 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100437
wdenk57b2d802003-06-27 21:31:46 +0000438 case PVR_440GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200439 puts("440GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000440 break;
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200441#endif /* CONFIG_440GP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100442
wdenk544e9732004-02-06 23:19:44 +0000443 case PVR_440GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200444 puts("440GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000445 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100446
wdenk544e9732004-02-06 23:19:44 +0000447 case PVR_440GX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200448 puts("440GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000449 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100450
stroesec0125272005-04-07 05:33:41 +0000451 case PVR_440GX_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200452 puts("440GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000453 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100454
Stefan Roese08fb4042005-11-01 10:08:03 +0100455 case PVR_440GX_RF:
Stefan Roese43e1b452010-09-03 13:27:02 +0200456 puts("440GX Rev. F");
Stefan Roese08fb4042005-11-01 10:08:03 +0100457 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100458
Stefan Roese326c9712005-08-01 16:41:48 +0200459 case PVR_440EP_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200460 puts("440EP Rev. A");
Stefan Roese326c9712005-08-01 16:41:48 +0200461 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100462
Stefan Roese95258d52005-10-04 15:00:30 +0200463#ifdef CONFIG_440EP
464 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200465 puts("440EP Rev. B");
Stefan Roese326c9712005-08-01 16:41:48 +0200466 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200467
468 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200469 puts("440EP Rev. C");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200470 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200471#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100472
Stefan Roese95258d52005-10-04 15:00:30 +0200473#ifdef CONFIG_440GR
474 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200475 puts("440GR Rev. A");
Stefan Roese95258d52005-10-04 15:00:30 +0200476 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200477
Stefan Roese96467d62006-05-18 19:21:53 +0200478 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200479 puts("440GR Rev. B");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200480 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200481#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100482
Stefan Roese188fab62007-01-31 16:56:10 +0100483#ifdef CONFIG_440EPX
484 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200485 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200486 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200487 break;
488
Stefan Roese188fab62007-01-31 16:56:10 +0100489 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200490 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200491 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200492 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100493#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200494
Stefan Roese188fab62007-01-31 16:56:10 +0100495#ifdef CONFIG_440GRX
496 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200497 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200498 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200499 break;
500
Stefan Roese188fab62007-01-31 16:56:10 +0100501 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200502 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200503 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200504 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100505#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200506
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100507 case PVR_440SP_6_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200508 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100509 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100510 break;
511
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100512 case PVR_440SP_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200513 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100514 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100515 break;
516
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100517 case PVR_440SP_6_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200518 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100519 strcpy(addstr, "RAID 6 support");
520 break;
521
Stefan Roesec6d59302006-11-28 16:09:24 +0100522 case PVR_440SP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200523 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100524 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100525 break;
526
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100527 case PVR_440SPe_6_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200528 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100529 strcpy(addstr, "RAID 6 support");
530 break;
531
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200532 case PVR_440SPe_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200533 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100534 strcpy(addstr, "No RAID 6 support");
535 break;
536
537 case PVR_440SPe_6_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200538 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100539 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200540 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200541
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200542 case PVR_440SPe_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200543 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100544 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200545 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200546
Stefan Roese048f5a62009-07-29 08:45:27 +0200547#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesecc019d12008-03-11 15:05:50 +0100548 case PVR_460EX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200549 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100550 strcpy(addstr, "No Security/Kasumi support");
551 break;
552
553 case PVR_460EX_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200554 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100555 strcpy(addstr, "Security/Kasumi support");
556 break;
557
Stefan Roese048f5a62009-07-29 08:45:27 +0200558 case PVR_460EX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200559 puts("460EX Rev. B");
Stefan Roese048f5a62009-07-29 08:45:27 +0200560 mfsdr(SDR0_ECID3, reg);
561 if (reg & 0x00100000)
562 strcpy(addstr, "No Security/Kasumi support");
563 else
564 strcpy(addstr, "Security/Kasumi support");
565 break;
566
Stefan Roesecc019d12008-03-11 15:05:50 +0100567 case PVR_460GT_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200568 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100569 strcpy(addstr, "No Security/Kasumi support");
570 break;
571
572 case PVR_460GT_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200573 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100574 strcpy(addstr, "Security/Kasumi support");
575 break;
Stefan Roese048f5a62009-07-29 08:45:27 +0200576
577 case PVR_460GT_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200578 puts("460GT Rev. B");
Stefan Roese048f5a62009-07-29 08:45:27 +0200579 mfsdr(SDR0_ECID3, reg);
580 if (reg & 0x00100000)
581 strcpy(addstr, "No Security/Kasumi support");
582 else
583 strcpy(addstr, "Security/Kasumi support");
584 break;
585#endif
Stefan Roesecc019d12008-03-11 15:05:50 +0100586
Feng Kan224bc962008-07-08 22:47:31 -0700587 case PVR_460SX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200588 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700589 strcpy(addstr, "Security support");
590 break;
591
592 case PVR_460SX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200593 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700594 strcpy(addstr, "No Security support");
595 break;
596
597 case PVR_460GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200598 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700599 strcpy(addstr, "Security support");
600 break;
601
602 case PVR_460GX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200603 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700604 strcpy(addstr, "No Security support");
605 break;
606
Tirumala Marri95ac4282010-09-28 14:15:14 -0700607 case PVR_APM821XX_RA:
608 puts("APM821XX Rev. A");
609 strcpy(addstr, "Security support");
610 break;
611
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200612 case PVR_VIRTEX5:
Stefan Roese43e1b452010-09-03 13:27:02 +0200613 puts("440x5 VIRTEX5");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200614 break;
Stefan Roese43e1b452010-09-03 13:27:02 +0200615#endif /* CONFIG_440 */
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200616
wdenk57b2d802003-06-27 21:31:46 +0000617 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200618 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000619 break;
620 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100621
Stefan Roesee620ff12009-10-19 14:44:11 +0200622 printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
623 strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100624 sys_info.freqPLB / 1000000,
625 get_OPB_freq() / 1000000,
Stefan Roese153b3e22007-10-05 17:10:59 +0200626 sys_info.freqEBC / 1000000);
Stefan Roesee620ff12009-10-19 14:44:11 +0200627#if defined(CONFIG_PCI) && \
628 (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
629 defined(CONFIG_440GR) || defined(CONFIG_440GRX))
630 printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
631#endif
632 printf(")\n");
Stefan Roese42f2a822005-11-27 19:36:26 +0100633
Stefan Roese11dd8812006-10-18 15:59:35 +0200634 if (addstr[0] != 0)
635 printf(" %s\n", addstr);
636
Stefan Roese99644742005-11-29 18:18:21 +0100637#if defined(I2C_BOOTROM)
638 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200639#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200640#if defined(SDR0_PINSTP_SHIFT)
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200641 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese8ebdb922009-04-15 10:50:48 +0200642 printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
643#ifdef CONFIG_NAND_U_BOOT
644 puts(", booting from NAND");
645#endif /* CONFIG_NAND_U_BOOT */
646 putc('\n');
Wolfgang Denk65505432006-10-20 17:54:33 +0200647#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100648
Stefan Roese153b3e22007-10-05 17:10:59 +0200649#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese99644742005-11-29 18:18:21 +0100650 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100651#endif
652
Stefan Roesef5150122009-05-27 10:34:32 +0200653#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
Stefan Roese99644742005-11-29 18:18:21 +0100654 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100655 printf (", PCI async ext clock used");
656 } else {
657 printf (", PCI sync clock at %lu MHz",
658 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
659 }
wdenkc6097192002-11-03 00:24:07 +0000660#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100661
Stefan Roese153b3e22007-10-05 17:10:59 +0200662#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100663 putc('\n');
664#endif
665
Stefan Roese153b3e22007-10-05 17:10:59 +0200666#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100667 printf (" 16 kB I-Cache 16 kB D-Cache");
668#elif defined(CONFIG_440)
669 printf (" 32 kB I-Cache 32 kB D-Cache");
670#else
671 printf (" 16 kB I-Cache %d kB D-Cache",
672 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
673#endif
674#endif /* !defined(CONFIG_IOP480) */
675
676#if defined(CONFIG_IOP480)
677 printf ("PLX IOP480 (PVR=%08x)", pvr);
678 printf (" at %s MHz:", strmhz(buf, clock));
679 printf (" %u kB I-Cache", 4);
680 printf (" %u kB D-Cache", 2);
681#endif
682
683#endif /* !defined(CONFIG_405) */
684
685 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000686
687 return 0;
688}
689
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200690int ppc440spe_revB() {
691 unsigned int pvr;
692
693 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100694 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200695 return 1;
696 else
697 return 0;
698}
wdenkc6097192002-11-03 00:24:07 +0000699
700/* ------------------------------------------------------------------------- */
701
Wolfgang Denk6262d0212010-06-28 22:00:46 +0200702int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenkc6097192002-11-03 00:24:07 +0000703{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100704#if defined(CONFIG_BOARD_RESET)
705 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100706#else
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200707#if defined(CONFIG_SYS_4xx_RESET_TYPE)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200708 mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200709#else
wdenk57b2d802003-06-27 21:31:46 +0000710 /*
711 * Initiate system reset in debug control register DBCR
712 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200713 mtspr(SPRN_DBCR0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200714#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200715#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200716
wdenkc6097192002-11-03 00:24:07 +0000717 return 1;
718}
wdenkc6097192002-11-03 00:24:07 +0000719
720
721/*
722 * Get timebase clock frequency
723 */
724unsigned long get_tbclk (void)
725{
Stefan Roese42f2a822005-11-27 19:36:26 +0100726#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000727 sys_info_t sys_info;
728
729 get_sys_info(&sys_info);
730 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000731#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100732 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000733#endif
734
735}
736
737
738#if defined(CONFIG_WATCHDOG)
Stefan Roese6964fd62007-11-09 12:18:54 +0100739void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000740{
741 int re_enable = disable_interrupts();
742 reset_4xx_watchdog();
743 if (re_enable) enable_interrupts();
744}
745
Stefan Roese6964fd62007-11-09 12:18:54 +0100746void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000747{
748 /*
749 * Clear TSR(WIS) bit
750 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200751 mtspr(SPRN_TSR, 0x40000000);
wdenkc6097192002-11-03 00:24:07 +0000752}
753#endif /* CONFIG_WATCHDOG */
Ben Warren9e37c582008-10-27 23:53:17 -0700754
755/*
756 * Initializes on-chip ethernet controllers.
757 * to override, implement board_eth_init()
758 */
759int cpu_eth_init(bd_t *bis)
760{
761#if defined(CONFIG_PPC4xx_EMAC)
762 ppc_4xx_eth_initialize(bis);
763#endif
764 return 0;
765}