blob: b02f6f4eefb099974902f2269551e23db54c45ee [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
Stefan Roese31ce7de2006-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 Denk6405a152006-03-31 18:32:53 +020040#if !defined(CONFIG_405)
41DECLARE_GLOBAL_DATA_PTR;
42#endif
43
Stefan Roese03687752006-10-07 11:30:52 +020044#if defined(CONFIG_BOARD_RESET)
45void board_reset(void);
46#endif
47
Stefan Roese99644742005-11-29 18:18:21 +010048#if defined(CONFIG_440)
49#define FREQ_EBC (sys_info.freqEPB)
50#else
51#define FREQ_EBC (sys_info.freqPLB / sys_info.pllExtBusDiv)
Stefan Roese42f2a822005-11-27 19:36:26 +010052#endif
53
Stefan Roese42fbddd2006-09-07 11:51:23 +020054#if defined(CONFIG_405GP) || \
55 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
56 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010057
58#define PCI_ASYNC
59
60int pci_async_enabled(void)
61{
62#if defined(CONFIG_405GP)
63 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010064#endif
65
Stefan Roese42fbddd2006-09-07 11:51:23 +020066#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
67 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010068 unsigned long val;
69
Wolfgang Denkaaa7c002005-12-12 16:06:05 +010070 mfsdr(sdr_sdstp1, val);
Stefan Roese99644742005-11-29 18:18:21 +010071 return (val & SDR0_SDSTP1_PAME_MASK);
72#endif
73}
74#endif
75
Stefan Roesee2c34122005-11-29 19:13:38 +010076#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && !defined(CONFIG_405)
Stefan Roese99644742005-11-29 18:18:21 +010077int pci_arbiter_enabled(void)
78{
79#if defined(CONFIG_405GP)
80 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
81#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010082
Stefan Roese99644742005-11-29 18:18:21 +010083#if defined(CONFIG_405EP)
84 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010085#endif
86
87#if defined(CONFIG_440GP)
Stefan Roese99644742005-11-29 18:18:21 +010088 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
89#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010090
Stefan Roese84382432007-02-02 12:44:22 +010091#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010092 unsigned long val;
93
Stefan Roese84382432007-02-02 12:44:22 +010094 mfsdr(sdr_xcr, val);
95 return (val & 0x80000000);
96#endif
97#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
98 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
99 unsigned long val;
100
101 mfsdr(sdr_pci0, val);
102 return (val & 0x80000000);
Stefan Roese42f2a822005-11-27 19:36:26 +0100103#endif
Stefan Roese99644742005-11-29 18:18:21 +0100104}
105#endif
106
Stefan Roese42fbddd2006-09-07 11:51:23 +0200107#if defined(CONFIG_405EP) || defined(CONFIG_440GX) || \
108 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
109 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
110 defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese42f2a822005-11-27 19:36:26 +0100111
Stefan Roese99644742005-11-29 18:18:21 +0100112#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100113
Stefan Roese99644742005-11-29 18:18:21 +0100114int i2c_bootrom_enabled(void)
115{
116#if defined(CONFIG_405EP)
117 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200118#else
Stefan Roese99644742005-11-29 18:18:21 +0100119 unsigned long val;
120
121 mfsdr(sdr_sdcs, val);
122 return (val & SDR0_SDCS_SDD);
123#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200124}
125
126#if defined(CONFIG_440GX)
127#define SDR0_PINSTP_SHIFT 29
128static char *bootstrap_str[] = {
129 "EBC (16 bits)",
130 "EBC (8 bits)",
131 "EBC (32 bits)",
132 "EBC (8 bits)",
133 "PCI",
134 "I2C (Addr 0x54)",
135 "Reserved",
136 "I2C (Addr 0x50)",
137};
138#endif
139
140#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
141#define SDR0_PINSTP_SHIFT 30
142static char *bootstrap_str[] = {
143 "EBC (8 bits)",
144 "PCI",
145 "I2C (Addr 0x54)",
146 "I2C (Addr 0x50)",
147};
148#endif
149
150#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
151#define SDR0_PINSTP_SHIFT 29
152static char *bootstrap_str[] = {
153 "EBC (8 bits)",
154 "PCI",
155 "NAND (8 bits)",
156 "EBC (16 bits)",
157 "EBC (16 bits)",
158 "I2C (Addr 0x54)",
159 "PCI",
160 "I2C (Addr 0x52)",
161};
162#endif
163
164#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
165#define SDR0_PINSTP_SHIFT 29
166static char *bootstrap_str[] = {
167 "EBC (8 bits)",
168 "EBC (16 bits)",
169 "EBC (16 bits)",
170 "NAND (8 bits)",
171 "PCI",
172 "I2C (Addr 0x54)",
173 "PCI",
174 "I2C (Addr 0x52)",
175};
176#endif
177
178#if defined(SDR0_PINSTP_SHIFT)
179static int bootstrap_option(void)
180{
181 unsigned long val;
182
183 mfsdr(sdr_pinstp, val);
184 return ((val & 0xe0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100185}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200186#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100187#endif
188
189
wdenkc6097192002-11-03 00:24:07 +0000190#if defined(CONFIG_440)
Stefan Roese42f2a822005-11-27 19:36:26 +0100191static int do_chip_reset(unsigned long sys0, unsigned long sys1);
wdenkc6097192002-11-03 00:24:07 +0000192#endif
193
wdenkc6097192002-11-03 00:24:07 +0000194
195int checkcpu (void)
196{
Stefan Roese42f2a822005-11-27 19:36:26 +0100197#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-11-27 19:36:26 +0100198 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000199 ulong clock = gd->cpu_clk;
200 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000201
Stefan Roese42f2a822005-11-27 19:36:26 +0100202#if !defined(CONFIG_IOP480)
Wolfgang Denk65505432006-10-20 17:54:33 +0200203 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100204 sys_info_t sys_info;
wdenkc6097192002-11-03 00:24:07 +0000205
206 puts ("CPU: ");
207
208 get_sys_info(&sys_info);
209
Stefan Roese42f2a822005-11-27 19:36:26 +0100210 puts("AMCC PowerPC 4");
211
212#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
213 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000214#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100215#if defined(CONFIG_440)
216 puts("40");
stroese434979e2003-05-23 11:18:02 +0000217#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100218
wdenkc6097192002-11-03 00:24:07 +0000219 switch (pvr) {
220 case PVR_405GP_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100221 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000222 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100223
wdenkc6097192002-11-03 00:24:07 +0000224 case PVR_405GP_RC:
Stefan Roese42f2a822005-11-27 19:36:26 +0100225 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000226 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100227
wdenkc6097192002-11-03 00:24:07 +0000228 case PVR_405GP_RD:
Stefan Roese42f2a822005-11-27 19:36:26 +0100229 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000230 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100231
wdenkc35ba4e2004-03-14 22:25:36 +0000232#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100233 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
234 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000235 break;
236#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100237
wdenkc6097192002-11-03 00:24:07 +0000238 case PVR_405CR_RA:
Stefan Roese42f2a822005-11-27 19:36:26 +0100239 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000240 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100241
wdenkc6097192002-11-03 00:24:07 +0000242 case PVR_405CR_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100243 puts("CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000244 break;
wdenkc6097192002-11-03 00:24:07 +0000245
Stefan Roese42f2a822005-11-27 19:36:26 +0100246#ifdef CONFIG_405CR
247 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
248 puts("CR Rev. C");
249 break;
wdenkc6097192002-11-03 00:24:07 +0000250#endif
251
Stefan Roese42f2a822005-11-27 19:36:26 +0100252 case PVR_405GPR_RB:
253 puts("GPr Rev. B");
254 break;
wdenkc6097192002-11-03 00:24:07 +0000255
Stefan Roese42f2a822005-11-27 19:36:26 +0100256 case PVR_405EP_RB:
257 puts("EP Rev. B");
258 break;
wdenkc6097192002-11-03 00:24:07 +0000259
260#if defined(CONFIG_440)
wdenk57b2d802003-06-27 21:31:46 +0000261 case PVR_440GP_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200262 puts("GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000263 /* See errata 1.12: CHIP_4 */
264 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
265 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
266 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
267 "Resetting chip ...\n");
268 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
269 do_chip_reset ( mfdcr(cpc0_strp0),
270 mfdcr(cpc0_strp1) );
271 }
wdenkc6097192002-11-03 00:24:07 +0000272 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100273
wdenk57b2d802003-06-27 21:31:46 +0000274 case PVR_440GP_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200275 puts("GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000276 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100277
wdenk544e9732004-02-06 23:19:44 +0000278 case PVR_440GX_RA:
Stefan Roese326c9712005-08-01 16:41:48 +0200279 puts("GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000280 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100281
wdenk544e9732004-02-06 23:19:44 +0000282 case PVR_440GX_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200283 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000284 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100285
stroesec0125272005-04-07 05:33:41 +0000286 case PVR_440GX_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200287 puts("GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000288 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100289
Stefan Roese08fb4042005-11-01 10:08:03 +0100290 case PVR_440GX_RF:
291 puts("GX Rev. F");
292 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100293
Stefan Roese326c9712005-08-01 16:41:48 +0200294 case PVR_440EP_RA:
295 puts("EP Rev. A");
296 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100297
Stefan Roese95258d52005-10-04 15:00:30 +0200298#ifdef CONFIG_440EP
299 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese326c9712005-08-01 16:41:48 +0200300 puts("EP Rev. B");
301 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200302
303 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
304 puts("EP Rev. C");
305 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200306#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100307
Stefan Roese95258d52005-10-04 15:00:30 +0200308#ifdef CONFIG_440GR
309 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
310 puts("GR Rev. A");
311 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200312
Stefan Roese96467d62006-05-18 19:21:53 +0200313 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese31ce7de2006-05-10 14:10:41 +0200314 puts("GR Rev. B");
315 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200316#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100317#endif /* CONFIG_440 */
318
Stefan Roese188fab62007-01-31 16:56:10 +0100319#ifdef CONFIG_440EPX
320 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200321 puts("EPx Rev. A");
322 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200323 break;
324
Stefan Roese188fab62007-01-31 16:56:10 +0100325 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200326 puts("EPx Rev. A");
327 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200328 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100329#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200330
Stefan Roese188fab62007-01-31 16:56:10 +0100331#ifdef CONFIG_440GRX
332 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200333 puts("GRx Rev. A");
334 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200335 break;
336
Stefan Roese188fab62007-01-31 16:56:10 +0100337 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200338 puts("GRx Rev. A");
339 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200340 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100341#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200342
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100343 case PVR_440SP_6_RAB:
344 puts("SP Rev. A/B");
345 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100346 break;
347
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100348 case PVR_440SP_RAB:
349 puts("SP Rev. A/B");
350 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100351 break;
352
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100353 case PVR_440SP_6_RC:
354 puts("SP Rev. C");
355 strcpy(addstr, "RAID 6 support");
356 break;
357
Stefan Roesec6d59302006-11-28 16:09:24 +0100358 case PVR_440SP_RC:
359 puts("SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100360 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100361 break;
362
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100363 case PVR_440SPe_6_RA:
364 puts("SPe Rev. A");
365 strcpy(addstr, "RAID 6 support");
366 break;
367
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200368 case PVR_440SPe_RA:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200369 puts("SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100370 strcpy(addstr, "No RAID 6 support");
371 break;
372
373 case PVR_440SPe_6_RB:
374 puts("SPe Rev. B");
375 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200376 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200377
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200378 case PVR_440SPe_RB:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200379 puts("SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100380 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200381 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200382
wdenk57b2d802003-06-27 21:31:46 +0000383 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200384 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000385 break;
386 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100387
388 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
389 sys_info.freqPLB / 1000000,
390 sys_info.freqPLB / sys_info.pllOpbDiv / 1000000,
391 FREQ_EBC / 1000000);
392
Stefan Roese11dd8812006-10-18 15:59:35 +0200393 if (addstr[0] != 0)
394 printf(" %s\n", addstr);
395
Stefan Roese99644742005-11-29 18:18:21 +0100396#if defined(I2C_BOOTROM)
397 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200398#if defined(SDR0_PINSTP_SHIFT)
399 printf (" Bootstrap Option %c - ", (char)bootstrap_option() + 'A');
400 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denk65505432006-10-20 17:54:33 +0200401#endif /* SDR0_PINSTP_SHIFT */
402#endif /* I2C_BOOTROM */
Stefan Roese42f2a822005-11-27 19:36:26 +0100403
Stefan Roese99644742005-11-29 18:18:21 +0100404#if defined(CONFIG_PCI)
405 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100406#endif
407
Stefan Roese99644742005-11-29 18:18:21 +0100408#if defined(PCI_ASYNC)
409 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100410 printf (", PCI async ext clock used");
411 } else {
412 printf (", PCI sync clock at %lu MHz",
413 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
414 }
wdenkc6097192002-11-03 00:24:07 +0000415#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100416
Stefan Roese99644742005-11-29 18:18:21 +0100417#if defined(CONFIG_PCI)
Stefan Roese42f2a822005-11-27 19:36:26 +0100418 putc('\n');
419#endif
420
421#if defined(CONFIG_405EP)
422 printf (" 16 kB I-Cache 16 kB D-Cache");
423#elif defined(CONFIG_440)
424 printf (" 32 kB I-Cache 32 kB D-Cache");
425#else
426 printf (" 16 kB I-Cache %d kB D-Cache",
427 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
428#endif
429#endif /* !defined(CONFIG_IOP480) */
430
431#if defined(CONFIG_IOP480)
432 printf ("PLX IOP480 (PVR=%08x)", pvr);
433 printf (" at %s MHz:", strmhz(buf, clock));
434 printf (" %u kB I-Cache", 4);
435 printf (" %u kB D-Cache", 2);
436#endif
437
438#endif /* !defined(CONFIG_405) */
439
440 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000441
442 return 0;
443}
444
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200445#if defined (CONFIG_440SPE)
446int ppc440spe_revB() {
447 unsigned int pvr;
448
449 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100450 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200451 return 1;
452 else
453 return 0;
454}
455#endif
wdenkc6097192002-11-03 00:24:07 +0000456
457/* ------------------------------------------------------------------------- */
458
wdenk57b2d802003-06-27 21:31:46 +0000459int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000460{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100461#if defined(CONFIG_BOARD_RESET)
462 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100463#else
Stefan Roese2a4a9432006-11-27 14:12:17 +0100464#if defined(CFG_4xx_RESET_TYPE)
465 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200466#else
wdenk57b2d802003-06-27 21:31:46 +0000467 /*
468 * Initiate system reset in debug control register DBCR
469 */
Stefan Roese03687752006-10-07 11:30:52 +0200470 mtspr(dbcr0, 0x30000000);
Stefan Roesea5232952006-11-27 14:52:04 +0100471#endif /* defined(CFG_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200472#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200473
wdenkc6097192002-11-03 00:24:07 +0000474 return 1;
475}
476
477#if defined(CONFIG_440)
Stefan Roese42f2a822005-11-27 19:36:26 +0100478static int do_chip_reset (unsigned long sys0, unsigned long sys1)
wdenkc6097192002-11-03 00:24:07 +0000479{
wdenka4685fe2003-09-03 14:03:26 +0000480 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
481 * reset.
482 */
483 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
484 mtdcr (cpc0_sys0, sys0);
485 mtdcr (cpc0_sys1, sys1);
486 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
487 mtspr (dbcr0, 0x20000000); /* Reset the chip */
wdenkc6097192002-11-03 00:24:07 +0000488
wdenka4685fe2003-09-03 14:03:26 +0000489 return 1;
wdenkc6097192002-11-03 00:24:07 +0000490}
491#endif
492
493
494/*
495 * Get timebase clock frequency
496 */
497unsigned long get_tbclk (void)
498{
Stefan Roese42f2a822005-11-27 19:36:26 +0100499#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000500 sys_info_t sys_info;
501
502 get_sys_info(&sys_info);
503 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000504#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100505 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000506#endif
507
508}
509
510
511#if defined(CONFIG_WATCHDOG)
512void
513watchdog_reset(void)
514{
515 int re_enable = disable_interrupts();
516 reset_4xx_watchdog();
517 if (re_enable) enable_interrupts();
518}
519
520void
521reset_4xx_watchdog(void)
522{
523 /*
524 * Clear TSR(WIS) bit
525 */
526 mtspr(tsr, 0x40000000);
527}
528#endif /* CONFIG_WATCHDOG */