blob: c07bc0c325e0a9ef5c1f123f6906378c94d14b83 [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Stefan Roese512f8d52006-05-10 14:10:41 +02002 * (C) Copyright 2000-2006
wdenkc6097192002-11-03 00:24:07 +00003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 */
23
24/*
wdenkc6097192002-11-03 00:24:07 +000025 * CPU specific code
26 *
27 * written or collected and sometimes rewritten by
28 * Magnus Damm <damm@bitsmart.com>
29 *
30 * minor modifications by
31 * Wolfgang Denk <wd@denx.de>
32 */
33
34#include <common.h>
35#include <watchdog.h>
36#include <command.h>
37#include <asm/cache.h>
38#include <ppc4xx.h>
39
Wolfgang Denkd87080b2006-03-31 18:32:53 +020040#if !defined(CONFIG_405)
41DECLARE_GLOBAL_DATA_PTR;
42#endif
43
Stefan Roesef3443862006-10-07 11:30:52 +020044#if defined(CONFIG_BOARD_RESET)
45void board_reset(void);
46#endif
47
Stefan Roese3d9569b2005-11-27 19:36:26 +010048#if defined(CONFIG_440)
49#define FREQ_EBC (sys_info.freqEPB)
Stefan Roesee01bd212007-03-21 13:38:59 +010050#elif defined(CONFIG_405EZ)
51#define FREQ_EBC ((CONFIG_SYS_CLK_FREQ * sys_info.pllFbkDiv) / \
52 sys_info.pllExtBusDiv)
Stefan Roese3d9569b2005-11-27 19:36:26 +010053#else
54#define FREQ_EBC (sys_info.freqPLB / sys_info.pllExtBusDiv)
55#endif
56
Stefan Roese887e2ec2006-09-07 11:51:23 +020057#if defined(CONFIG_405GP) || \
58 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
59 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010060
61#define PCI_ASYNC
62
63int pci_async_enabled(void)
64{
65#if defined(CONFIG_405GP)
66 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
67#endif
68
Stefan Roese887e2ec2006-09-07 11:51:23 +020069#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
70 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010071 unsigned long val;
72
Wolfgang Denk74812662005-12-12 16:06:05 +010073 mfsdr(sdr_sdstp1, val);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010074 return (val & SDR0_SDSTP1_PAME_MASK);
75#endif
76}
77#endif
78
Stefan Roesea46726f2005-11-29 19:13:38 +010079#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && !defined(CONFIG_405)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010080int pci_arbiter_enabled(void)
81{
82#if defined(CONFIG_405GP)
83 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
84#endif
85
86#if defined(CONFIG_405EP)
87 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
88#endif
89
90#if defined(CONFIG_440GP)
91 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
92#endif
93
Stefan Roese7372ca62007-02-02 12:44:22 +010094#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +010095 unsigned long val;
96
Stefan Roese7372ca62007-02-02 12:44:22 +010097 mfsdr(sdr_xcr, val);
98 return (val & 0x80000000);
99#endif
100#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
101 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
102 unsigned long val;
103
104 mfsdr(sdr_pci0, val);
105 return (val & 0x80000000);
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100106#endif
107}
108#endif
109
Stefan Roese887e2ec2006-09-07 11:51:23 +0200110#if defined(CONFIG_405EP) || defined(CONFIG_440GX) || \
111 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
112 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
113 defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100114
115#define I2C_BOOTROM
116
117int i2c_bootrom_enabled(void)
118{
119#if defined(CONFIG_405EP)
120 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200121#else
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100122 unsigned long val;
123
124 mfsdr(sdr_sdcs, val);
125 return (val & SDR0_SDCS_SDD);
126#endif
127}
Stefan Roese90e6f412007-04-18 12:05:59 +0200128#endif
Stefan Roese887e2ec2006-09-07 11:51:23 +0200129
130#if defined(CONFIG_440GX)
131#define SDR0_PINSTP_SHIFT 29
132static char *bootstrap_str[] = {
133 "EBC (16 bits)",
134 "EBC (8 bits)",
135 "EBC (32 bits)",
136 "EBC (8 bits)",
137 "PCI",
138 "I2C (Addr 0x54)",
139 "Reserved",
140 "I2C (Addr 0x50)",
141};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200142static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200143#endif
144
145#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
146#define SDR0_PINSTP_SHIFT 30
147static char *bootstrap_str[] = {
148 "EBC (8 bits)",
149 "PCI",
150 "I2C (Addr 0x54)",
151 "I2C (Addr 0x50)",
152};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200153static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
Stefan Roese887e2ec2006-09-07 11:51:23 +0200154#endif
155
156#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
157#define SDR0_PINSTP_SHIFT 29
158static char *bootstrap_str[] = {
159 "EBC (8 bits)",
160 "PCI",
161 "NAND (8 bits)",
162 "EBC (16 bits)",
163 "EBC (16 bits)",
164 "I2C (Addr 0x54)",
165 "PCI",
166 "I2C (Addr 0x52)",
167};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200168static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200169#endif
170
171#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
172#define SDR0_PINSTP_SHIFT 29
173static char *bootstrap_str[] = {
174 "EBC (8 bits)",
175 "EBC (16 bits)",
176 "EBC (16 bits)",
177 "NAND (8 bits)",
178 "PCI",
179 "I2C (Addr 0x54)",
180 "PCI",
181 "I2C (Addr 0x52)",
182};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200183static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
Stefan Roese887e2ec2006-09-07 11:51:23 +0200184#endif
185
Stefan Roese90e6f412007-04-18 12:05:59 +0200186#if defined(CONFIG_405EZ)
187#define SDR0_PINSTP_SHIFT 28
188static char *bootstrap_str[] = {
189 "EBC (8 bits)",
190 "SPI (fast)",
191 "NAND (512 page, 4 addr cycle)",
192 "I2C (Addr 0x50)",
193 "EBC (32 bits)",
194 "I2C (Addr 0x50)",
195 "NAND (2K page, 5 addr cycle)",
196 "I2C (Addr 0x50)",
197 "EBC (16 bits)",
198 "Reserved",
199 "NAND (2K page, 4 addr cycle)",
200 "I2C (Addr 0x50)",
201 "NAND (512 page, 3 addr cycle)",
202 "I2C (Addr 0x50)",
203 "SPI (slow)",
204 "I2C (Addr 0x50)",
205};
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200206static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
207 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
Stefan Roese90e6f412007-04-18 12:05:59 +0200208#endif
209
Stefan Roese887e2ec2006-09-07 11:51:23 +0200210#if defined(SDR0_PINSTP_SHIFT)
211static int bootstrap_option(void)
212{
213 unsigned long val;
214
Stefan Roese90e6f412007-04-18 12:05:59 +0200215 mfsdr(SDR_PINSTP, val);
216 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200217}
218#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100219
Stefan Roese3d9569b2005-11-27 19:36:26 +0100220
221#if defined(CONFIG_440)
222static int do_chip_reset(unsigned long sys0, unsigned long sys1);
223#endif
224
wdenkc6097192002-11-03 00:24:07 +0000225
226int checkcpu (void)
227{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100228#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100229 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000230 ulong clock = gd->cpu_clk;
231 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000232
Stefan Roese3d9569b2005-11-27 19:36:26 +0100233#if !defined(CONFIG_IOP480)
Wolfgang Denkba999c52006-10-20 17:54:33 +0200234 char addstr[64] = "";
Stefan Roese3d9569b2005-11-27 19:36:26 +0100235 sys_info_t sys_info;
wdenkc6097192002-11-03 00:24:07 +0000236
237 puts ("CPU: ");
238
239 get_sys_info(&sys_info);
240
Stefan Roese3d9569b2005-11-27 19:36:26 +0100241 puts("AMCC PowerPC 4");
242
Stefan Roesee01bd212007-03-21 13:38:59 +0100243#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
244 defined(CONFIG_405EP) || defined(CONFIG_405EZ)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100245 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000246#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100247#if defined(CONFIG_440)
248 puts("40");
wdenkc6097192002-11-03 00:24:07 +0000249#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100250
wdenkc6097192002-11-03 00:24:07 +0000251 switch (pvr) {
252 case PVR_405GP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100253 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000254 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100255
wdenkc6097192002-11-03 00:24:07 +0000256 case PVR_405GP_RC:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100257 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000258 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100259
wdenkc6097192002-11-03 00:24:07 +0000260 case PVR_405GP_RD:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100261 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000262 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100263
wdenk42dfe7a2004-03-14 22:25:36 +0000264#ifdef CONFIG_405GP
Stefan Roese3d9569b2005-11-27 19:36:26 +0100265 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
266 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000267 break;
268#endif
Stefan Roese3d9569b2005-11-27 19:36:26 +0100269
wdenkc6097192002-11-03 00:24:07 +0000270 case PVR_405CR_RA:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100271 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000272 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100273
wdenkc6097192002-11-03 00:24:07 +0000274 case PVR_405CR_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100275 puts("CR Rev. B");
276 break;
277
278#ifdef CONFIG_405CR
279 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
280 puts("CR Rev. C");
281 break;
282#endif
283
284 case PVR_405GPR_RB:
285 puts("GPr Rev. B");
286 break;
287
stroeseb867d702003-05-23 11:18:02 +0000288 case PVR_405EP_RB:
Stefan Roese3d9569b2005-11-27 19:36:26 +0100289 puts("EP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000290 break;
wdenkc6097192002-11-03 00:24:07 +0000291
Stefan Roesee01bd212007-03-21 13:38:59 +0100292 case PVR_405EZ_RA:
293 puts("EZ Rev. A");
294 break;
295
wdenkc6097192002-11-03 00:24:07 +0000296#if defined(CONFIG_440)
wdenk8bde7f72003-06-27 21:31:46 +0000297 case PVR_440GP_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200298 puts("GP Rev. B");
wdenk4d816772003-09-03 14:03:26 +0000299 /* See errata 1.12: CHIP_4 */
300 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
301 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
302 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
303 "Resetting chip ...\n");
304 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
305 do_chip_reset ( mfdcr(cpc0_strp0),
306 mfdcr(cpc0_strp1) );
307 }
wdenkc6097192002-11-03 00:24:07 +0000308 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100309
wdenk8bde7f72003-06-27 21:31:46 +0000310 case PVR_440GP_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200311 puts("GP Rev. C");
wdenkba56f622004-02-06 23:19:44 +0000312 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100313
wdenkba56f622004-02-06 23:19:44 +0000314 case PVR_440GX_RA:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200315 puts("GX Rev. A");
wdenkba56f622004-02-06 23:19:44 +0000316 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100317
wdenkba56f622004-02-06 23:19:44 +0000318 case PVR_440GX_RB:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200319 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000320 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100321
stroese0a7c5392005-04-07 05:33:41 +0000322 case PVR_440GX_RC:
Stefan Roesec157d8e2005-08-01 16:41:48 +0200323 puts("GX Rev. C");
stroese0a7c5392005-04-07 05:33:41 +0000324 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100325
Stefan Roese57275b62005-11-01 10:08:03 +0100326 case PVR_440GX_RF:
327 puts("GX Rev. F");
328 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100329
Stefan Roesec157d8e2005-08-01 16:41:48 +0200330 case PVR_440EP_RA:
331 puts("EP Rev. A");
332 break;
Stefan Roese3d9569b2005-11-27 19:36:26 +0100333
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200334#ifdef CONFIG_440EP
335 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200336 puts("EP Rev. B");
337 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200338
339 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
340 puts("EP Rev. C");
341 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200342#endif /* CONFIG_440EP */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100343
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200344#ifdef CONFIG_440GR
345 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
346 puts("GR Rev. A");
347 break;
Stefan Roese512f8d52006-05-10 14:10:41 +0200348
Stefan Roese5770a1e2006-05-18 19:21:53 +0200349 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese512f8d52006-05-10 14:10:41 +0200350 puts("GR Rev. B");
351 break;
Stefan Roese9a8d82f2005-10-04 15:00:30 +0200352#endif /* CONFIG_440GR */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100353#endif /* CONFIG_440 */
354
Stefan Roese2902fad2007-01-31 16:56:10 +0100355#ifdef CONFIG_440EPX
356 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200357 puts("EPx Rev. A");
358 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200359 break;
360
Stefan Roese2902fad2007-01-31 16:56:10 +0100361 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200362 puts("EPx Rev. A");
363 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200364 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100365#endif /* CONFIG_440EPX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200366
Stefan Roese2902fad2007-01-31 16:56:10 +0100367#ifdef CONFIG_440GRX
368 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200369 puts("GRx Rev. A");
370 strcpy(addstr, "Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200371 break;
372
Stefan Roese2902fad2007-01-31 16:56:10 +0100373 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roeseedf0b542006-10-18 15:59:35 +0200374 puts("GRx Rev. A");
375 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese887e2ec2006-09-07 11:51:23 +0200376 break;
Stefan Roese2902fad2007-01-31 16:56:10 +0100377#endif /* CONFIG_440GRX */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200378
Stefan Roese95981772007-01-13 08:01:03 +0100379 case PVR_440SP_6_RAB:
380 puts("SP Rev. A/B");
381 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100382 break;
383
Stefan Roese95981772007-01-13 08:01:03 +0100384 case PVR_440SP_RAB:
385 puts("SP Rev. A/B");
386 strcpy(addstr, "No RAID 6 support");
387 break;
388
389 case PVR_440SP_6_RC:
390 puts("SP Rev. C");
391 strcpy(addstr, "RAID 6 support");
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100392 break;
393
Stefan Roesee732fae2006-11-28 16:09:24 +0100394 case PVR_440SP_RC:
395 puts("SP Rev. C");
Stefan Roese95981772007-01-13 08:01:03 +0100396 strcpy(addstr, "No RAID 6 support");
397 break;
398
399 case PVR_440SPe_6_RA:
400 puts("SPe Rev. A");
401 strcpy(addstr, "RAID 6 support");
Stefan Roesee732fae2006-11-28 16:09:24 +0100402 break;
403
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200404 case PVR_440SPe_RA:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200405 puts("SPe Rev. A");
Stefan Roese95981772007-01-13 08:01:03 +0100406 strcpy(addstr, "No RAID 6 support");
407 break;
408
409 case PVR_440SPe_6_RB:
410 puts("SPe Rev. B");
411 strcpy(addstr, "RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200412 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200413
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200414 case PVR_440SPe_RB:
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200415 puts("SPe Rev. B");
Stefan Roese95981772007-01-13 08:01:03 +0100416 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz6c5879f2006-06-30 16:30:46 +0200417 break;
Marian Balakowiczfe84b482006-07-03 23:42:36 +0200418
wdenk8bde7f72003-06-27 21:31:46 +0000419 default:
Stefan Roese17f50f222005-08-04 17:09:16 +0200420 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000421 break;
422 }
Stefan Roese3d9569b2005-11-27 19:36:26 +0100423
424 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
Stefan Roesee01bd212007-03-21 13:38:59 +0100425 sys_info.freqPLB / 1000000,
426 get_OPB_freq() / 1000000,
427 FREQ_EBC / 1000000);
Stefan Roese3d9569b2005-11-27 19:36:26 +0100428
Stefan Roeseedf0b542006-10-18 15:59:35 +0200429 if (addstr[0] != 0)
430 printf(" %s\n", addstr);
431
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100432#if defined(I2C_BOOTROM)
433 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese90e6f412007-04-18 12:05:59 +0200434#endif /* I2C_BOOTROM */
Stefan Roese887e2ec2006-09-07 11:51:23 +0200435#if defined(SDR0_PINSTP_SHIFT)
Benoît Monine3cbe1f2007-06-04 08:36:05 +0200436 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
Stefan Roese887e2ec2006-09-07 11:51:23 +0200437 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denkba999c52006-10-20 17:54:33 +0200438#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese3d9569b2005-11-27 19:36:26 +0100439
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100440#if defined(CONFIG_PCI)
441 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese3d9569b2005-11-27 19:36:26 +0100442#endif
443
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100444#if defined(PCI_ASYNC)
445 if (pci_async_enabled()) {
Stefan Roese3d9569b2005-11-27 19:36:26 +0100446 printf (", PCI async ext clock used");
447 } else {
448 printf (", PCI sync clock at %lu MHz",
449 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
450 }
451#endif
452
Stefan Roese6e7fb6e2005-11-29 18:18:21 +0100453#if defined(CONFIG_PCI)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100454 putc('\n');
455#endif
456
Stefan Roesee01bd212007-03-21 13:38:59 +0100457#if defined(CONFIG_405EP) || defined(CONFIG_405EZ)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100458 printf (" 16 kB I-Cache 16 kB D-Cache");
459#elif defined(CONFIG_440)
460 printf (" 32 kB I-Cache 32 kB D-Cache");
461#else
462 printf (" 16 kB I-Cache %d kB D-Cache",
463 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
464#endif
465#endif /* !defined(CONFIG_IOP480) */
466
467#if defined(CONFIG_IOP480)
468 printf ("PLX IOP480 (PVR=%08x)", pvr);
469 printf (" at %s MHz:", strmhz(buf, clock));
470 printf (" %u kB I-Cache", 4);
471 printf (" %u kB D-Cache", 2);
472#endif
473
474#endif /* !defined(CONFIG_405) */
475
476 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000477
478 return 0;
479}
480
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200481#if defined (CONFIG_440SPE)
482int ppc440spe_revB() {
483 unsigned int pvr;
484
485 pvr = get_pvr();
Stefan Roese5a5c5692007-01-15 09:46:29 +0100486 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowski692519b2006-08-10 12:43:17 +0200487 return 1;
488 else
489 return 0;
490}
491#endif
wdenkc6097192002-11-03 00:24:07 +0000492
493/* ------------------------------------------------------------------------- */
494
wdenk8bde7f72003-06-27 21:31:46 +0000495int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000496{
Stefan Roese1f94d162006-11-27 14:48:41 +0100497#if defined(CONFIG_BOARD_RESET)
498 board_reset();
Stefan Roese1729b922006-11-27 14:52:04 +0100499#else
Stefan Roese1c2ce222006-11-27 14:12:17 +0100500#if defined(CFG_4xx_RESET_TYPE)
501 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
Stefan Roesec157d8e2005-08-01 16:41:48 +0200502#else
wdenk8bde7f72003-06-27 21:31:46 +0000503 /*
504 * Initiate system reset in debug control register DBCR
505 */
Stefan Roesef3443862006-10-07 11:30:52 +0200506 mtspr(dbcr0, 0x30000000);
Stefan Roese1729b922006-11-27 14:52:04 +0100507#endif /* defined(CFG_4xx_RESET_TYPE) */
Stefan Roesef3443862006-10-07 11:30:52 +0200508#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roesec157d8e2005-08-01 16:41:48 +0200509
wdenkc6097192002-11-03 00:24:07 +0000510 return 1;
511}
512
513#if defined(CONFIG_440)
Stefan Roese3d9569b2005-11-27 19:36:26 +0100514static int do_chip_reset (unsigned long sys0, unsigned long sys1)
wdenkc6097192002-11-03 00:24:07 +0000515{
wdenk4d816772003-09-03 14:03:26 +0000516 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
517 * reset.
518 */
519 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
520 mtdcr (cpc0_sys0, sys0);
521 mtdcr (cpc0_sys1, sys1);
522 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
523 mtspr (dbcr0, 0x20000000); /* Reset the chip */
wdenkc6097192002-11-03 00:24:07 +0000524
wdenk4d816772003-09-03 14:03:26 +0000525 return 1;
wdenkc6097192002-11-03 00:24:07 +0000526}
527#endif
528
529
530/*
531 * Get timebase clock frequency
532 */
533unsigned long get_tbclk (void)
534{
Stefan Roese3d9569b2005-11-27 19:36:26 +0100535#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000536 sys_info_t sys_info;
537
538 get_sys_info(&sys_info);
539 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000540#else
Stefan Roese3d9569b2005-11-27 19:36:26 +0100541 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000542#endif
543
544}
545
546
547#if defined(CONFIG_WATCHDOG)
548void
549watchdog_reset(void)
550{
551 int re_enable = disable_interrupts();
552 reset_4xx_watchdog();
553 if (re_enable) enable_interrupts();
554}
555
556void
557reset_4xx_watchdog(void)
558{
559 /*
560 * Clear TSR(WIS) bit
561 */
562 mtspr(tsr, 0x40000000);
563}
564#endif /* CONFIG_WATCHDOG */