blob: 78d212d563606fa799973e7e88bf3278f8e19363 [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 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
wdenkc6097192002-11-03 00:24:07 +00006 */
7
8/*
wdenkc6097192002-11-03 00:24:07 +00009 * CPU specific code
10 *
11 * written or collected and sometimes rewritten by
12 * Magnus Damm <damm@bitsmart.com>
13 *
14 * minor modifications by
15 * Wolfgang Denk <wd@denx.de>
16 */
17
18#include <common.h>
19#include <watchdog.h>
20#include <command.h>
21#include <asm/cache.h>
Stefan Roese247e9d72010-09-09 19:18:00 +020022#include <asm/ppc4xx.h>
Ben Warren9e37c582008-10-27 23:53:17 -070023#include <netdev.h>
wdenkc6097192002-11-03 00:24:07 +000024
Wolfgang Denk6405a152006-03-31 18:32:53 +020025DECLARE_GLOBAL_DATA_PTR;
Wolfgang Denk6405a152006-03-31 18:32:53 +020026
Stefan Roese03687752006-10-07 11:30:52 +020027void board_reset(void);
Stefan Roese03687752006-10-07 11:30:52 +020028
Adam Grahamc31ff682008-10-08 10:13:19 -070029/*
30 * To provide an interface to detect CPU number for boards that support
31 * more then one CPU, we implement the "weak" default functions here.
32 *
33 * Returns CPU number
34 */
35int __get_cpu_num(void)
36{
37 return NA_OR_UNKNOWN_CPU;
38}
39int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
40
Stefan Roese9f500fa2009-07-06 11:44:33 +020041#if defined(CONFIG_PCI)
Stefan Roese42fbddd2006-09-07 11:51:23 +020042#if defined(CONFIG_405GP) || \
43 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
44 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010045
46#define PCI_ASYNC
47
Stefan Roese6964fd62007-11-09 12:18:54 +010048static int pci_async_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010049{
50#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020051 return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010052#endif
53
Stefan Roese42fbddd2006-09-07 11:51:23 +020054#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +010055 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
56 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese99644742005-11-29 18:18:21 +010057 unsigned long val;
58
Stefan Roese918010a2009-09-09 16:25:29 +020059 mfsdr(SDR0_SDSTP1, val);
Stefan Roese99644742005-11-29 18:18:21 +010060 return (val & SDR0_SDSTP1_PAME_MASK);
61#endif
62}
63#endif
Stefan Roese9f500fa2009-07-06 11:44:33 +020064#endif /* CONFIG_PCI */
Stefan Roese99644742005-11-29 18:18:21 +010065
Stefan Roese32ca04a2012-09-19 14:33:52 +020066#if defined(CONFIG_PCI) && \
Stefan Roese153b3e22007-10-05 17:10:59 +020067 !defined(CONFIG_405) && !defined(CONFIG_405EX)
Stefan Roese5d8033e2009-11-12 16:41:09 +010068int pci_arbiter_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +010069{
70#if defined(CONFIG_405GP)
Stefan Roese918010a2009-09-09 16:25:29 +020071 return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
Stefan Roese99644742005-11-29 18:18:21 +010072#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010073
Stefan Roese99644742005-11-29 18:18:21 +010074#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +020075 return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010076#endif
77
78#if defined(CONFIG_440GP)
Stefan Roese918010a2009-09-09 16:25:29 +020079 return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
Stefan Roese99644742005-11-29 18:18:21 +010080#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010081
Stefan Roese84382432007-02-02 12:44:22 +010082#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010083 unsigned long val;
84
Stefan Roese95ca5fa2010-09-11 09:31:43 +020085 mfsdr(SDR0_XCR0, val);
86 return (val & SDR0_XCR0_PAE_MASK);
Stefan Roese84382432007-02-02 12:44:22 +010087#endif
88#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
Stefan Roesecc019d12008-03-11 15:05:50 +010089 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
90 defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roese84382432007-02-02 12:44:22 +010091 unsigned long val;
92
Stefan Roese918010a2009-09-09 16:25:29 +020093 mfsdr(SDR0_PCI0, val);
Stefan Roese95ca5fa2010-09-11 09:31:43 +020094 return (val & SDR0_PCI0_PAE_MASK);
Stefan Roese42f2a822005-11-27 19:36:26 +010095#endif
Stefan Roese99644742005-11-29 18:18:21 +010096}
97#endif
98
Stefan Roese6964fd62007-11-09 12:18:54 +010099#if defined(CONFIG_405EP)
Stefan Roese99644742005-11-29 18:18:21 +0100100#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100101
Stefan Roese6964fd62007-11-09 12:18:54 +0100102static int i2c_bootrom_enabled(void)
Stefan Roese99644742005-11-29 18:18:21 +0100103{
104#if defined(CONFIG_405EP)
Stefan Roese918010a2009-09-09 16:25:29 +0200105 return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200106#else
Stefan Roese99644742005-11-29 18:18:21 +0100107 unsigned long val;
108
Stefan Roese918010a2009-09-09 16:25:29 +0200109 mfsdr(SDR0_SDCS0, val);
Stefan Roese99644742005-11-29 18:18:21 +0100110 return (val & SDR0_SDCS_SDD);
111#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200112}
Stefan Roese3a75ac12007-04-18 12:05:59 +0200113#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200114
115#if defined(CONFIG_440GX)
116#define SDR0_PINSTP_SHIFT 29
117static char *bootstrap_str[] = {
118 "EBC (16 bits)",
119 "EBC (8 bits)",
120 "EBC (32 bits)",
121 "EBC (8 bits)",
122 "PCI",
123 "I2C (Addr 0x54)",
124 "Reserved",
125 "I2C (Addr 0x50)",
126};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200127static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200128#endif
129
130#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
131#define SDR0_PINSTP_SHIFT 30
132static char *bootstrap_str[] = {
133 "EBC (8 bits)",
134 "PCI",
135 "I2C (Addr 0x54)",
136 "I2C (Addr 0x50)",
137};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200138static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese42fbddd2006-09-07 11:51:23 +0200139#endif
140
141#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
142#define SDR0_PINSTP_SHIFT 29
143static char *bootstrap_str[] = {
144 "EBC (8 bits)",
145 "PCI",
146 "NAND (8 bits)",
147 "EBC (16 bits)",
148 "EBC (16 bits)",
149 "I2C (Addr 0x54)",
150 "PCI",
151 "I2C (Addr 0x52)",
152};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200153static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200154#endif
155
156#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
157#define SDR0_PINSTP_SHIFT 29
158static char *bootstrap_str[] = {
159 "EBC (8 bits)",
160 "EBC (16 bits)",
161 "EBC (16 bits)",
162 "NAND (8 bits)",
163 "PCI",
164 "I2C (Addr 0x54)",
165 "PCI",
166 "I2C (Addr 0x52)",
167};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200168static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese42fbddd2006-09-07 11:51:23 +0200169#endif
170
Stefan Roesecc019d12008-03-11 15:05:50 +0100171#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
172#define SDR0_PINSTP_SHIFT 29
173static char *bootstrap_str[] = {
174 "EBC (8 bits)",
175 "EBC (16 bits)",
176 "PCI",
177 "PCI",
178 "EBC (16 bits)",
179 "NAND (8 bits)",
180 "I2C (Addr 0x54)", /* A8 */
181 "I2C (Addr 0x52)", /* A4 */
182};
Felix Radenskye6be1452010-01-19 17:37:13 +0200183static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
Stefan Roesecc019d12008-03-11 15:05:50 +0100184#endif
185
Feng Kan224bc962008-07-08 22:47:31 -0700186#if defined(CONFIG_460SX)
187#define SDR0_PINSTP_SHIFT 29
188static char *bootstrap_str[] = {
189 "EBC (8 bits)",
190 "EBC (16 bits)",
191 "EBC (32 bits)",
192 "NAND (8 bits)",
193 "I2C (Addr 0x54)", /* A8 */
194 "I2C (Addr 0x52)", /* A4 */
195};
196static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
197#endif
198
Stefan Roese3a75ac12007-04-18 12:05:59 +0200199#if defined(CONFIG_405EZ)
200#define SDR0_PINSTP_SHIFT 28
201static char *bootstrap_str[] = {
202 "EBC (8 bits)",
203 "SPI (fast)",
204 "NAND (512 page, 4 addr cycle)",
205 "I2C (Addr 0x50)",
206 "EBC (32 bits)",
207 "I2C (Addr 0x50)",
208 "NAND (2K page, 5 addr cycle)",
209 "I2C (Addr 0x50)",
210 "EBC (16 bits)",
211 "Reserved",
212 "NAND (2K page, 4 addr cycle)",
213 "I2C (Addr 0x50)",
214 "NAND (512 page, 3 addr cycle)",
215 "I2C (Addr 0x50)",
216 "SPI (slow)",
217 "I2C (Addr 0x50)",
218};
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200219static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
220 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese3a75ac12007-04-18 12:05:59 +0200221#endif
222
Stefan Roese153b3e22007-10-05 17:10:59 +0200223#if defined(CONFIG_405EX)
224#define SDR0_PINSTP_SHIFT 29
225static char *bootstrap_str[] = {
226 "EBC (8 bits)",
227 "EBC (16 bits)",
228 "EBC (16 bits)",
229 "NAND (8 bits)",
230 "NAND (8 bits)",
231 "I2C (Addr 0x54)",
232 "EBC (8 bits)",
233 "I2C (Addr 0x52)",
234};
235static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
236#endif
Tirumala Marri95ac4282010-09-28 14:15:14 -0700237#if defined(CONFIG_APM821XX)
238#define SDR0_PINSTP_SHIFT 29
239static char *bootstrap_str[] = {
240 "RESERVED",
241 "RESERVED",
242 "RESERVED",
243 "NAND (8 bits)",
244 "NOR (8 bits)",
245 "NOR (8 bits) w/PLL Bypassed",
246 "I2C (Addr 0x54)",
247 "I2C (Addr 0x52)",
248};
249static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
250#endif
Stefan Roese153b3e22007-10-05 17:10:59 +0200251
Stefan Roese42fbddd2006-09-07 11:51:23 +0200252#if defined(SDR0_PINSTP_SHIFT)
253static int bootstrap_option(void)
254{
255 unsigned long val;
256
Stefan Roese918010a2009-09-09 16:25:29 +0200257 mfsdr(SDR0_PINSTP, val);
Stefan Roese3a75ac12007-04-18 12:05:59 +0200258 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100259}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200260#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100261
262
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200263#if defined(CONFIG_440GP)
Stefan Roese6964fd62007-11-09 12:18:54 +0100264static int do_chip_reset (unsigned long sys0, unsigned long sys1)
265{
Stefan Roese918010a2009-09-09 16:25:29 +0200266 /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
Stefan Roese6964fd62007-11-09 12:18:54 +0100267 * reset.
268 */
Stefan Roese918010a2009-09-09 16:25:29 +0200269 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000); /* Set SWE */
270 mtdcr (CPC0_SYS0, sys0);
271 mtdcr (CPC0_SYS1, sys1);
272 mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000); /* Clr SWE */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200273 mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
Stefan Roese6964fd62007-11-09 12:18:54 +0100274
275 return 1;
276}
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200277#endif /* CONFIG_440GP */
wdenkc6097192002-11-03 00:24:07 +0000278
wdenkc6097192002-11-03 00:24:07 +0000279
280int checkcpu (void)
281{
Stefan Roese42f2a822005-11-27 19:36:26 +0100282#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-11-27 19:36:26 +0100283 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000284 ulong clock = gd->cpu_clk;
285 char buf[32];
Stefan Roese048f5a62009-07-29 08:45:27 +0200286#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
287 u32 reg;
288#endif
wdenkc6097192002-11-03 00:24:07 +0000289
Wolfgang Denk65505432006-10-20 17:54:33 +0200290 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100291 sys_info_t sys_info;
Adam Grahamc31ff682008-10-08 10:13:19 -0700292 int cpu_num;
wdenkc6097192002-11-03 00:24:07 +0000293
Adam Grahamc31ff682008-10-08 10:13:19 -0700294 cpu_num = get_cpu_num();
295 if (cpu_num >= 0)
296 printf("CPU%d: ", cpu_num);
297 else
298 puts("CPU: ");
wdenkc6097192002-11-03 00:24:07 +0000299
300 get_sys_info(&sys_info);
301
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200302#if defined(CONFIG_XILINX_440)
Stefan Roese43e1b452010-09-03 13:27:02 +0200303 puts("IBM PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200304#else
Stefan Roese43e1b452010-09-03 13:27:02 +0200305 puts("AMCC PowerPC ");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200306#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100307
wdenkc6097192002-11-03 00:24:07 +0000308 switch (pvr) {
Stefan Roese43e1b452010-09-03 13:27:02 +0200309
310#if !defined(CONFIG_440)
wdenkc6097192002-11-03 00:24:07 +0000311 case PVR_405GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200312 puts("405GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000313 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100314
wdenkc6097192002-11-03 00:24:07 +0000315 case PVR_405GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200316 puts("405GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000317 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100318
wdenkc6097192002-11-03 00:24:07 +0000319 case PVR_405GP_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200320 puts("405GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000321 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100322
wdenkc35ba4e2004-03-14 22:25:36 +0000323#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100324 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200325 puts("405GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000326 break;
327#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100328
wdenkc6097192002-11-03 00:24:07 +0000329 case PVR_405CR_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200330 puts("405CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000331 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100332
wdenkc6097192002-11-03 00:24:07 +0000333 case PVR_405CR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200334 puts("405CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000335 break;
wdenkc6097192002-11-03 00:24:07 +0000336
Stefan Roese42f2a822005-11-27 19:36:26 +0100337#ifdef CONFIG_405CR
338 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200339 puts("405CR Rev. C");
Stefan Roese42f2a822005-11-27 19:36:26 +0100340 break;
wdenkc6097192002-11-03 00:24:07 +0000341#endif
342
Stefan Roese42f2a822005-11-27 19:36:26 +0100343 case PVR_405GPR_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200344 puts("405GPr Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100345 break;
wdenkc6097192002-11-03 00:24:07 +0000346
Stefan Roese42f2a822005-11-27 19:36:26 +0100347 case PVR_405EP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200348 puts("405EP Rev. B");
Stefan Roese42f2a822005-11-27 19:36:26 +0100349 break;
wdenkc6097192002-11-03 00:24:07 +0000350
Stefan Roese17ffbc82007-03-21 13:38:59 +0100351 case PVR_405EZ_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200352 puts("405EZ Rev. A");
Stefan Roese17ffbc82007-03-21 13:38:59 +0100353 break;
354
Stefan Roese153b3e22007-10-05 17:10:59 +0200355 case PVR_405EX1_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200356 puts("405EX Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200357 strcpy(addstr, "Security support");
358 break;
359
Stefan Roese153b3e22007-10-05 17:10:59 +0200360 case PVR_405EXR2_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200361 puts("405EXr Rev. A");
Stefan Roese153b3e22007-10-05 17:10:59 +0200362 strcpy(addstr, "No Security support");
363 break;
364
Stefan Roesefbf24302008-05-13 20:22:01 +0200365 case PVR_405EX1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200366 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200367 strcpy(addstr, "Security support");
368 break;
369
370 case PVR_405EX2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200371 puts("405EX Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200372 strcpy(addstr, "No Security support");
373 break;
374
375 case PVR_405EXR1_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200376 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200377 strcpy(addstr, "Security support");
378 break;
379
380 case PVR_405EXR2_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200381 puts("405EXr Rev. C");
Stefan Roesefbf24302008-05-13 20:22:01 +0200382 strcpy(addstr, "No Security support");
383 break;
384
Stefan Roesef1a80e42009-10-06 07:21:08 +0200385 case PVR_405EX1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200386 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200387 strcpy(addstr, "Security support");
388 break;
389
390 case PVR_405EX2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200391 puts("405EX Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200392 strcpy(addstr, "No Security support");
393 break;
394
395 case PVR_405EXR1_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200396 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200397 strcpy(addstr, "Security support");
398 break;
399
400 case PVR_405EXR2_RD:
Stefan Roese43e1b452010-09-03 13:27:02 +0200401 puts("405EXr Rev. D");
Stefan Roesef1a80e42009-10-06 07:21:08 +0200402 strcpy(addstr, "No Security support");
403 break;
404
Stefan Roese43e1b452010-09-03 13:27:02 +0200405#else /* CONFIG_440 */
406
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200407#if defined(CONFIG_440GP)
wdenk57b2d802003-06-27 21:31:46 +0000408 case PVR_440GP_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200409 puts("440GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000410 /* See errata 1.12: CHIP_4 */
Stefan Roese918010a2009-09-09 16:25:29 +0200411 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
412 (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
wdenka4685fe2003-09-03 14:03:26 +0000413 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
414 "Resetting chip ...\n");
415 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
Stefan Roese918010a2009-09-09 16:25:29 +0200416 do_chip_reset ( mfdcr(CPC0_STRP0),
417 mfdcr(CPC0_STRP1) );
wdenka4685fe2003-09-03 14:03:26 +0000418 }
wdenkc6097192002-11-03 00:24:07 +0000419 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100420
wdenk57b2d802003-06-27 21:31:46 +0000421 case PVR_440GP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200422 puts("440GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000423 break;
Stefan Roese95ca5fa2010-09-11 09:31:43 +0200424#endif /* CONFIG_440GP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100425
wdenk544e9732004-02-06 23:19:44 +0000426 case PVR_440GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200427 puts("440GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000428 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100429
wdenk544e9732004-02-06 23:19:44 +0000430 case PVR_440GX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200431 puts("440GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000432 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100433
stroesec0125272005-04-07 05:33:41 +0000434 case PVR_440GX_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200435 puts("440GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000436 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100437
Stefan Roese08fb4042005-11-01 10:08:03 +0100438 case PVR_440GX_RF:
Stefan Roese43e1b452010-09-03 13:27:02 +0200439 puts("440GX Rev. F");
Stefan Roese08fb4042005-11-01 10:08:03 +0100440 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100441
Stefan Roese326c9712005-08-01 16:41:48 +0200442 case PVR_440EP_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200443 puts("440EP Rev. A");
Stefan Roese326c9712005-08-01 16:41:48 +0200444 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100445
Stefan Roese95258d52005-10-04 15:00:30 +0200446#ifdef CONFIG_440EP
447 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200448 puts("440EP Rev. B");
Stefan Roese326c9712005-08-01 16:41:48 +0200449 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200450
451 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200452 puts("440EP Rev. C");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200453 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200454#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100455
Stefan Roese95258d52005-10-04 15:00:30 +0200456#ifdef CONFIG_440GR
457 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200458 puts("440GR Rev. A");
Stefan Roese95258d52005-10-04 15:00:30 +0200459 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200460
Stefan Roese96467d62006-05-18 19:21:53 +0200461 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200462 puts("440GR Rev. B");
Stefan Roese31ce7de2006-05-10 14:10:41 +0200463 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200464#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100465
Stefan Roese188fab62007-01-31 16:56:10 +0100466#ifdef CONFIG_440EPX
467 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200468 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200469 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200470 break;
471
Stefan Roese188fab62007-01-31 16:56:10 +0100472 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200473 puts("440EPx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200474 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200475 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100476#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200477
Stefan Roese188fab62007-01-31 16:56:10 +0100478#ifdef CONFIG_440GRX
479 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200480 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200481 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200482 break;
483
Stefan Roese188fab62007-01-31 16:56:10 +0100484 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese43e1b452010-09-03 13:27:02 +0200485 puts("440GRx Rev. A");
Stefan Roese11dd8812006-10-18 15:59:35 +0200486 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200487 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100488#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200489
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100490 case PVR_440SP_6_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200491 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100492 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100493 break;
494
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100495 case PVR_440SP_RAB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200496 puts("440SP Rev. A/B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100497 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100498 break;
499
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100500 case PVR_440SP_6_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200501 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100502 strcpy(addstr, "RAID 6 support");
503 break;
504
Stefan Roesec6d59302006-11-28 16:09:24 +0100505 case PVR_440SP_RC:
Stefan Roese43e1b452010-09-03 13:27:02 +0200506 puts("440SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100507 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100508 break;
509
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100510 case PVR_440SPe_6_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200511 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100512 strcpy(addstr, "RAID 6 support");
513 break;
514
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200515 case PVR_440SPe_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200516 puts("440SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100517 strcpy(addstr, "No RAID 6 support");
518 break;
519
520 case PVR_440SPe_6_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200521 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100522 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200523 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200524
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200525 case PVR_440SPe_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200526 puts("440SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100527 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200528 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200529
Stefan Roese048f5a62009-07-29 08:45:27 +0200530#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
Stefan Roesecc019d12008-03-11 15:05:50 +0100531 case PVR_460EX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200532 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100533 strcpy(addstr, "No Security/Kasumi support");
534 break;
535
536 case PVR_460EX_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200537 puts("460EX Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100538 strcpy(addstr, "Security/Kasumi support");
539 break;
540
Stefan Roese048f5a62009-07-29 08:45:27 +0200541 case PVR_460EX_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200542 puts("460EX Rev. B");
Stefan Roese048f5a62009-07-29 08:45:27 +0200543 mfsdr(SDR0_ECID3, reg);
544 if (reg & 0x00100000)
545 strcpy(addstr, "No Security/Kasumi support");
546 else
547 strcpy(addstr, "Security/Kasumi support");
548 break;
549
Stefan Roesecc019d12008-03-11 15:05:50 +0100550 case PVR_460GT_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200551 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100552 strcpy(addstr, "No Security/Kasumi support");
553 break;
554
555 case PVR_460GT_SE_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200556 puts("460GT Rev. A");
Stefan Roesecc019d12008-03-11 15:05:50 +0100557 strcpy(addstr, "Security/Kasumi support");
558 break;
Stefan Roese048f5a62009-07-29 08:45:27 +0200559
560 case PVR_460GT_RB:
Stefan Roese43e1b452010-09-03 13:27:02 +0200561 puts("460GT Rev. B");
Stefan Roese048f5a62009-07-29 08:45:27 +0200562 mfsdr(SDR0_ECID3, reg);
563 if (reg & 0x00100000)
564 strcpy(addstr, "No Security/Kasumi support");
565 else
566 strcpy(addstr, "Security/Kasumi support");
567 break;
568#endif
Stefan Roesecc019d12008-03-11 15:05:50 +0100569
Feng Kan224bc962008-07-08 22:47:31 -0700570 case PVR_460SX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200571 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700572 strcpy(addstr, "Security support");
573 break;
574
575 case PVR_460SX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200576 puts("460SX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700577 strcpy(addstr, "No Security support");
578 break;
579
580 case PVR_460GX_RA:
Stefan Roese43e1b452010-09-03 13:27:02 +0200581 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700582 strcpy(addstr, "Security support");
583 break;
584
585 case PVR_460GX_RA_V1:
Stefan Roese43e1b452010-09-03 13:27:02 +0200586 puts("460GX Rev. A");
Feng Kan224bc962008-07-08 22:47:31 -0700587 strcpy(addstr, "No Security support");
588 break;
589
Tirumala Marri95ac4282010-09-28 14:15:14 -0700590 case PVR_APM821XX_RA:
591 puts("APM821XX Rev. A");
592 strcpy(addstr, "Security support");
593 break;
594
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200595 case PVR_VIRTEX5:
Stefan Roese43e1b452010-09-03 13:27:02 +0200596 puts("440x5 VIRTEX5");
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200597 break;
Stefan Roese43e1b452010-09-03 13:27:02 +0200598#endif /* CONFIG_440 */
Ricardo Ribalda Delgado95c50202008-07-17 11:44:12 +0200599
wdenk57b2d802003-06-27 21:31:46 +0000600 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200601 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000602 break;
603 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100604
Stefan Roesee620ff12009-10-19 14:44:11 +0200605 printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
606 strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100607 sys_info.freqPLB / 1000000,
608 get_OPB_freq() / 1000000,
Stefan Roese153b3e22007-10-05 17:10:59 +0200609 sys_info.freqEBC / 1000000);
Stefan Roesee620ff12009-10-19 14:44:11 +0200610#if defined(CONFIG_PCI) && \
611 (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
612 defined(CONFIG_440GR) || defined(CONFIG_440GRX))
613 printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
614#endif
615 printf(")\n");
Stefan Roese42f2a822005-11-27 19:36:26 +0100616
Stefan Roese11dd8812006-10-18 15:59:35 +0200617 if (addstr[0] != 0)
618 printf(" %s\n", addstr);
619
Stefan Roese99644742005-11-29 18:18:21 +0100620#if defined(I2C_BOOTROM)
621 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200622#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200623#if defined(SDR0_PINSTP_SHIFT)
BenoƮt Monin1a70cf22007-06-04 08:36:05 +0200624 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese8ebdb922009-04-15 10:50:48 +0200625 printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
626#ifdef CONFIG_NAND_U_BOOT
627 puts(", booting from NAND");
628#endif /* CONFIG_NAND_U_BOOT */
629 putc('\n');
Wolfgang Denk65505432006-10-20 17:54:33 +0200630#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100631
Stefan Roese153b3e22007-10-05 17:10:59 +0200632#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese99644742005-11-29 18:18:21 +0100633 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100634#endif
635
Stefan Roesef5150122009-05-27 10:34:32 +0200636#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
Stefan Roese99644742005-11-29 18:18:21 +0100637 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100638 printf (", PCI async ext clock used");
639 } else {
640 printf (", PCI sync clock at %lu MHz",
641 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
642 }
wdenkc6097192002-11-03 00:24:07 +0000643#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100644
Stefan Roese153b3e22007-10-05 17:10:59 +0200645#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
Stefan Roese42f2a822005-11-27 19:36:26 +0100646 putc('\n');
647#endif
648
Stefan Roese153b3e22007-10-05 17:10:59 +0200649#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
Shruti Kanetkar81159362013-08-15 11:25:38 -0500650 printf(" 16 KiB I-Cache 16 KiB D-Cache");
Stefan Roese42f2a822005-11-27 19:36:26 +0100651#elif defined(CONFIG_440)
Shruti Kanetkar81159362013-08-15 11:25:38 -0500652 printf(" 32 KiB I-Cache 32 KiB D-Cache");
Stefan Roese42f2a822005-11-27 19:36:26 +0100653#else
Shruti Kanetkar81159362013-08-15 11:25:38 -0500654 printf(" 16 KiB I-Cache %d KiB D-Cache",
655 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
Stefan Roese42f2a822005-11-27 19:36:26 +0100656#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100657
658#endif /* !defined(CONFIG_405) */
659
660 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000661
662 return 0;
663}
664
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200665int ppc440spe_revB() {
666 unsigned int pvr;
667
668 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100669 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200670 return 1;
671 else
672 return 0;
673}
wdenkc6097192002-11-03 00:24:07 +0000674
675/* ------------------------------------------------------------------------- */
676
Wolfgang Denk6262d0212010-06-28 22:00:46 +0200677int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
wdenkc6097192002-11-03 00:24:07 +0000678{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100679#if defined(CONFIG_BOARD_RESET)
680 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100681#else
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200682#if defined(CONFIG_SYS_4xx_RESET_TYPE)
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200683 mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200684#else
wdenk57b2d802003-06-27 21:31:46 +0000685 /*
686 * Initiate system reset in debug control register DBCR
687 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200688 mtspr(SPRN_DBCR0, 0x30000000);
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200689#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200690#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200691
wdenkc6097192002-11-03 00:24:07 +0000692 return 1;
693}
wdenkc6097192002-11-03 00:24:07 +0000694
695
696/*
697 * Get timebase clock frequency
698 */
699unsigned long get_tbclk (void)
700{
wdenkc6097192002-11-03 00:24:07 +0000701 sys_info_t sys_info;
702
703 get_sys_info(&sys_info);
704 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000705}
706
707
708#if defined(CONFIG_WATCHDOG)
Stefan Roese6964fd62007-11-09 12:18:54 +0100709void watchdog_reset(void)
wdenkc6097192002-11-03 00:24:07 +0000710{
711 int re_enable = disable_interrupts();
712 reset_4xx_watchdog();
713 if (re_enable) enable_interrupts();
714}
715
Stefan Roese6964fd62007-11-09 12:18:54 +0100716void reset_4xx_watchdog(void)
wdenkc6097192002-11-03 00:24:07 +0000717{
718 /*
719 * Clear TSR(WIS) bit
720 */
Matthias Fuchs730b2d22009-07-22 17:27:56 +0200721 mtspr(SPRN_TSR, 0x40000000);
wdenkc6097192002-11-03 00:24:07 +0000722}
723#endif /* CONFIG_WATCHDOG */
Ben Warren9e37c582008-10-27 23:53:17 -0700724
725/*
726 * Initializes on-chip ethernet controllers.
727 * to override, implement board_eth_init()
728 */
729int cpu_eth_init(bd_t *bis)
730{
731#if defined(CONFIG_PPC4xx_EMAC)
732 ppc_4xx_eth_initialize(bis);
733#endif
734 return 0;
735}