blob: 60aba8cefe41ac72ad90cdf0ced5ad167937e821 [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 Roese32ca04a2012-09-19 14:33:52 +020082#if defined(CONFIG_PCI) && \
Stefan Roese153b3e22007-10-05 17:10:59 +020083 !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
Wolfgang Denk65505432006-10-20 17:54:33 +0200306 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100307 sys_info_t sys_info;
Adam Grahamc31ff682008-10-08 10:13:19 -0700308 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000309
Adam Grahamc31ff682008-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 Delgado95c50202008-07-17 11:44:12 +0200318#if defined(CONFIG_XILINX_440)
Stefan Roese43e1b452010-09-03 13:27:02 +0200319 puts("IBM PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200320#else
Stefan Roese43e1b452010-09-03 13:27:02 +0200321 puts("AMCC PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200322#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100323
wdenkc6097192002-11-03 00:24:07 +0000324 switch (pvr) {
Stefan Roese43e1b452010-09-03 13:27:02 +0200325
326#if !defined(CONFIG_440)
wdenkc6097192002-11-03 00:24:07 +0000327 case PVR_405GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200328 puts("405GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000329 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100330
wdenkc6097192002-11-03 00:24:07 +0000331 case PVR_405GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200332 puts("405GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000333 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100334
wdenkc6097192002-11-03 00:24:07 +0000335 case PVR_405GP_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200336 puts("405GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000337 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100338
wdenkc35ba4e2004-03-14 22:25:36 +0000339#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100340 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200341 puts("405GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000342 break;
343#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100344
wdenkc6097192002-11-03 00:24:07 +0000345 case PVR_405CR_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200346 puts("405CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000347 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100348
wdenkc6097192002-11-03 00:24:07 +0000349 case PVR_405CR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200350 puts("405CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000351 break;
wdenkc6097192002-11-03 00:24:07 +0000352
Stefan Roese42f2a822005-11-27 19:36:26 +0100353#ifdef CONFIG_405CR
354 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200355 puts("405CR Rev. C");
Stefan Roese42f2a822005-11-27 19:36:26 +0100356 break;
wdenkc6097192002-11-03 00:24:07 +0000357#endif
358
Stefan Roese42f2a822005-11-27 19:36:26 +0100359 case PVR_405GPR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200360 puts("405GPr Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100361 break;
wdenkc6097192002-11-03 00:24:07 +0000362
Stefan Roese42f2a822005-11-27 19:36:26 +0100363 case PVR_405EP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200364 puts("405EP Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100365 break;
wdenkc6097192002-11-03 00:24:07 +0000366
Stefan Roese17ffbc82007-03-21 13:38:59 +0100367 case PVR_405EZ_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200368 puts("405EZ Rev. A");
Stefan Roese17ffbc82007-03-21 13:38:59 +0100369 break;
370
Stefan Roese153b3e22007-10-05 17:10:59 +0200371 case PVR_405EX1_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200372 puts("405EX Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200373 strcpy(addstr, "Security support");
374 break;
375
Stefan Roese153b3e22007-10-05 17:10:59 +0200376 case PVR_405EXR2_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200377 puts("405EXr Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200378 strcpy(addstr, "No Security support");
379 break;
380
Stefan Roesefbf24302008-05-13 20:22:01 +0200381 case PVR_405EX1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200382 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200383 strcpy(addstr, "Security support");
384 break;
385
386 case PVR_405EX2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200387 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200388 strcpy(addstr, "No Security support");
389 break;
390
391 case PVR_405EXR1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200392 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200393 strcpy(addstr, "Security support");
394 break;
395
396 case PVR_405EXR2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200397 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200398 strcpy(addstr, "No Security support");
399 break;
400
Stefan Roesef1a80e42009-10-06 07:21:08 +0200401 case PVR_405EX1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200402 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200403 strcpy(addstr, "Security support");
404 break;
405
406 case PVR_405EX2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200407 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200408 strcpy(addstr, "No Security support");
409 break;
410
411 case PVR_405EXR1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200412 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200413 strcpy(addstr, "Security support");
414 break;
415
416 case PVR_405EXR2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200417 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200418 strcpy(addstr, "No Security support");
419 break;
420
Stefan Roese43e1b452010-09-03 13:27:02 +0200421#else /* CONFIG_440 */
422
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200423#if defined(CONFIG_440GP)
wdenk57b2d802003-06-27 21:31:46 +0000424 case PVR_440GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200425 puts("440GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000426 /* See errata 1.12: CHIP_4 */
Stefan Roese918010a2009-09-09 16:25:29 +0200427 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
428 (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
wdenka4685fe2003-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 Roese918010a2009-09-09 16:25:29 +0200432 do_chip_reset ( mfdcr(CPC0_STRP0),
433 mfdcr(CPC0_STRP1) );
wdenka4685fe2003-09-03 14:03:26 +0000434 }
wdenkc6097192002-11-03 00:24:07 +0000435 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100436
wdenk57b2d802003-06-27 21:31:46 +0000437 case PVR_440GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200438 puts("440GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000439 break;
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200440#endif /* CONFIG_440GP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100441
wdenk544e9732004-02-06 23:19:44 +0000442 case PVR_440GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200443 puts("440GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000444 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100445
wdenk544e9732004-02-06 23:19:44 +0000446 case PVR_440GX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200447 puts("440GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000448 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100449
stroesec0125272005-04-07 05:33:41 +0000450 case PVR_440GX_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200451 puts("440GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000452 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100453
Stefan Roese08fb4042005-11-01 10:08:03 +0100454 case PVR_440GX_RF:
Stefan Roese43e1b452010-09-03 13:27:02 +0200455 puts("440GX Rev. F");
Stefan Roese08fb4042005-11-01 10:08:03 +0100456 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100457
Stefan Roese326c9712005-08-01 16:41:48 +0200458 case PVR_440EP_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200459 puts("440EP Rev. A");
Stefan Roese326c9712005-08-01 16:41:48 +0200460 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100461
Stefan Roese95258d52005-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 Roese43e1b452010-09-03 13:27:02 +0200464 puts("440EP Rev. B");
Stefan Roese326c9712005-08-01 16:41:48 +0200465 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200466
467 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200468 puts("440EP Rev. C");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200469 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200470#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100471
Stefan Roese95258d52005-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 Roese43e1b452010-09-03 13:27:02 +0200474 puts("440GR Rev. A");
Stefan Roese95258d52005-10-04 15:00:30 +0200475 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200476
Stefan Roese96467d62006-05-18 19:21:53 +0200477 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200478 puts("440GR Rev. B");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200479 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200480#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100481
Stefan Roese188fab62007-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 Roese43e1b452010-09-03 13:27:02 +0200484 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200485 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200486 break;
487
Stefan Roese188fab62007-01-31 16:56:10 +0100488 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200489 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200490 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200491 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100492#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200493
Stefan Roese188fab62007-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 Roese43e1b452010-09-03 13:27:02 +0200496 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200497 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200498 break;
499
Stefan Roese188fab62007-01-31 16:56:10 +0100500 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200501 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200502 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200503 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100504#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200505
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100506 case PVR_440SP_6_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200507 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100508 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100509 break;
510
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100511 case PVR_440SP_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200512 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100513 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100514 break;
515
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100516 case PVR_440SP_6_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200517 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100518 strcpy(addstr, "RAID 6 support");
519 break;
520
Stefan Roesec6d59302006-11-28 16:09:24 +0100521 case PVR_440SP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200522 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100523 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100524 break;
525
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100526 case PVR_440SPe_6_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200527 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100528 strcpy(addstr, "RAID 6 support");
529 break;
530
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200531 case PVR_440SPe_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200532 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100533 strcpy(addstr, "No RAID 6 support");
534 break;
535
536 case PVR_440SPe_6_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200537 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100538 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200539 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200540
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200541 case PVR_440SPe_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200542 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100543 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200544 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200545
Stefan Roese048f5a62009-07-29 08:45:27 +0200546#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesecc019d12008-03-11 15:05:50 +0100547 case PVR_460EX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200548 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100549 strcpy(addstr, "No Security/Kasumi support");
550 break;
551
552 case PVR_460EX_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200553 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100554 strcpy(addstr, "Security/Kasumi support");
555 break;
556
Stefan Roese048f5a62009-07-29 08:45:27 +0200557 case PVR_460EX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200558 puts("460EX Rev. B");
Stefan Roese048f5a62009-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 Roesecc019d12008-03-11 15:05:50 +0100566 case PVR_460GT_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200567 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100568 strcpy(addstr, "No Security/Kasumi support");
569 break;
570
571 case PVR_460GT_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200572 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100573 strcpy(addstr, "Security/Kasumi support");
574 break;
Stefan Roese048f5a62009-07-29 08:45:27 +0200575
576 case PVR_460GT_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200577 puts("460GT Rev. B");
Stefan Roese048f5a62009-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
Stefan Roesecc019d12008-03-11 15:05:50 +0100585
Feng Kan224bc962008-07-08 22:47:31 -0700586 case PVR_460SX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200587 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700588 strcpy(addstr, "Security support");
589 break;
590
591 case PVR_460SX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200592 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700593 strcpy(addstr, "No Security support");
594 break;
595
596 case PVR_460GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200597 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700598 strcpy(addstr, "Security support");
599 break;
600
601 case PVR_460GX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200602 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700603 strcpy(addstr, "No Security support");
604 break;
605
Tirumala Marri95ac4282010-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 Delgado95c50202008-07-17 11:44:12 +0200611 case PVR_VIRTEX5:
Stefan Roese43e1b452010-09-03 13:27:02 +0200612 puts("440x5 VIRTEX5");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200613 break;
Stefan Roese43e1b452010-09-03 13:27:02 +0200614#endif /* CONFIG_440 */
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200615
wdenk57b2d802003-06-27 21:31:46 +0000616 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200617 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000618 break;
619 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100620
Stefan Roesee620ff12009-10-19 14:44:11 +0200621 printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
622 strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100623 sys_info.freqPLB / 1000000,
624 get_OPB_freq() / 1000000,
Stefan Roese153b3e22007-10-05 17:10:59 +0200625 sys_info.freqEBC / 1000000);
Stefan Roesee620ff12009-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 Roese42f2a822005-11-27 19:36:26 +0100632
Stefan Roese11dd8812006-10-18 15:59:35 +0200633 if (addstr[0] != 0)
634 printf(" %s\n", addstr);
635
Stefan Roese99644742005-11-29 18:18:21 +0100636#if defined(I2C_BOOTROM)
637 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200638#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200639#if defined(SDR0_PINSTP_SHIFT)
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200640 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese8ebdb922009-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 Denk65505432006-10-20 17:54:33 +0200646#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100647
Stefan Roese153b3e22007-10-05 17:10:59 +0200648#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese99644742005-11-29 18:18:21 +0100649 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100650#endif
651
Stefan Roesef5150122009-05-27 10:34:32 +0200652#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
Stefan Roese99644742005-11-29 18:18:21 +0100653 if (pci_async_enabled()) {
Stefan Roese42f2a822005-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 }
wdenkc6097192002-11-03 00:24:07 +0000659#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100660
Stefan Roese153b3e22007-10-05 17:10:59 +0200661#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100662 putc('\n');
663#endif
664
Stefan Roese153b3e22007-10-05 17:10:59 +0200665#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Stefan Roese42f2a822005-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 Roese42f2a822005-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 Jaworowskia2e7ef02006-08-10 12:43:17 +0200681int ppc440spe_revB() {
682 unsigned int pvr;
683
684 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100685 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200686 return 1;
687 else
688 return 0;
689}
wdenkc6097192002-11-03 00:24:07 +0000690
691/* ------------------------------------------------------------------------- */
692
Wolfgang Denk6262d0212010-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 Roeseecf05b22006-11-27 14:48:41 +0100695#if defined(CONFIG_BOARD_RESET)
696 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100697#else
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200698#if defined(CONFIG_SYS_4xx_RESET_TYPE)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200699 mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200700#else
wdenk57b2d802003-06-27 21:31:46 +0000701 /*
702 * Initiate system reset in debug control register DBCR
703 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200704 mtspr(SPRN_DBCR0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200705#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200706#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200707
wdenkc6097192002-11-03 00:24:07 +0000708 return 1;
709}
wdenkc6097192002-11-03 00:24:07 +0000710
711
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 Roese6964fd62007-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 Roese6964fd62007-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 Fuchs730b2d22009-07-22 17:27:56 +0200737 mtspr(SPRN_TSR, 0x40000000);
wdenkc6097192002-11-03 00:24:07 +0000738}
739#endif /* CONFIG_WATCHDOG */
Ben Warren9e37c582008-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}