blob: 8e6bc84db038e4141f079b345e24c16dc5d689a5 [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)
Stefan Roese17ffbc82007-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 Roese99644742005-11-29 18:18:21 +010053#else
54#define FREQ_EBC (sys_info.freqPLB / sys_info.pllExtBusDiv)
Stefan Roese42f2a822005-11-27 19:36:26 +010055#endif
56
Stefan Roese42fbddd2006-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 Roese99644742005-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);
Stefan Roese42f2a822005-11-27 19:36:26 +010067#endif
68
Stefan Roese42fbddd2006-09-07 11:51:23 +020069#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
70 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
Stefan Roese99644742005-11-29 18:18:21 +010071 unsigned long val;
72
Wolfgang Denkaaa7c002005-12-12 16:06:05 +010073 mfsdr(sdr_sdstp1, val);
Stefan Roese99644742005-11-29 18:18:21 +010074 return (val & SDR0_SDSTP1_PAME_MASK);
75#endif
76}
77#endif
78
Stefan Roesee2c34122005-11-29 19:13:38 +010079#if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && !defined(CONFIG_405)
Stefan Roese99644742005-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
Stefan Roese42f2a822005-11-27 19:36:26 +010085
Stefan Roese99644742005-11-29 18:18:21 +010086#if defined(CONFIG_405EP)
87 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
Stefan Roese42f2a822005-11-27 19:36:26 +010088#endif
89
90#if defined(CONFIG_440GP)
Stefan Roese99644742005-11-29 18:18:21 +010091 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
92#endif
Stefan Roese42f2a822005-11-27 19:36:26 +010093
Stefan Roese84382432007-02-02 12:44:22 +010094#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
Stefan Roese99644742005-11-29 18:18:21 +010095 unsigned long val;
96
Stefan Roese84382432007-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 Roese42f2a822005-11-27 19:36:26 +0100106#endif
Stefan Roese99644742005-11-29 18:18:21 +0100107}
108#endif
109
Stefan Roese42fbddd2006-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 Roese42f2a822005-11-27 19:36:26 +0100114
Stefan Roese99644742005-11-29 18:18:21 +0100115#define I2C_BOOTROM
Stefan Roese42f2a822005-11-27 19:36:26 +0100116
Stefan Roese99644742005-11-29 18:18:21 +0100117int i2c_bootrom_enabled(void)
118{
119#if defined(CONFIG_405EP)
120 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
Stefan Roese42fbddd2006-09-07 11:51:23 +0200121#else
Stefan Roese99644742005-11-29 18:18:21 +0100122 unsigned long val;
123
124 mfsdr(sdr_sdcs, val);
125 return (val & SDR0_SDCS_SDD);
126#endif
Stefan Roese42fbddd2006-09-07 11:51:23 +0200127}
Stefan Roese3a75ac12007-04-18 12:05:59 +0200128#endif
Stefan Roese42fbddd2006-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};
142#endif
143
144#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
145#define SDR0_PINSTP_SHIFT 30
146static char *bootstrap_str[] = {
147 "EBC (8 bits)",
148 "PCI",
149 "I2C (Addr 0x54)",
150 "I2C (Addr 0x50)",
151};
152#endif
153
154#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
155#define SDR0_PINSTP_SHIFT 29
156static char *bootstrap_str[] = {
157 "EBC (8 bits)",
158 "PCI",
159 "NAND (8 bits)",
160 "EBC (16 bits)",
161 "EBC (16 bits)",
162 "I2C (Addr 0x54)",
163 "PCI",
164 "I2C (Addr 0x52)",
165};
166#endif
167
168#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
169#define SDR0_PINSTP_SHIFT 29
170static char *bootstrap_str[] = {
171 "EBC (8 bits)",
172 "EBC (16 bits)",
173 "EBC (16 bits)",
174 "NAND (8 bits)",
175 "PCI",
176 "I2C (Addr 0x54)",
177 "PCI",
178 "I2C (Addr 0x52)",
179};
180#endif
181
Stefan Roese3a75ac12007-04-18 12:05:59 +0200182#if defined(CONFIG_405EZ)
183#define SDR0_PINSTP_SHIFT 28
184static char *bootstrap_str[] = {
185 "EBC (8 bits)",
186 "SPI (fast)",
187 "NAND (512 page, 4 addr cycle)",
188 "I2C (Addr 0x50)",
189 "EBC (32 bits)",
190 "I2C (Addr 0x50)",
191 "NAND (2K page, 5 addr cycle)",
192 "I2C (Addr 0x50)",
193 "EBC (16 bits)",
194 "Reserved",
195 "NAND (2K page, 4 addr cycle)",
196 "I2C (Addr 0x50)",
197 "NAND (512 page, 3 addr cycle)",
198 "I2C (Addr 0x50)",
199 "SPI (slow)",
200 "I2C (Addr 0x50)",
201};
202#endif
203
Stefan Roese42fbddd2006-09-07 11:51:23 +0200204#if defined(SDR0_PINSTP_SHIFT)
205static int bootstrap_option(void)
206{
207 unsigned long val;
208
Stefan Roese3a75ac12007-04-18 12:05:59 +0200209 mfsdr(SDR_PINSTP, val);
210 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
Stefan Roese99644742005-11-29 18:18:21 +0100211}
Stefan Roese42fbddd2006-09-07 11:51:23 +0200212#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100213
214
wdenkc6097192002-11-03 00:24:07 +0000215#if defined(CONFIG_440)
Stefan Roese42f2a822005-11-27 19:36:26 +0100216static int do_chip_reset(unsigned long sys0, unsigned long sys1);
wdenkc6097192002-11-03 00:24:07 +0000217#endif
218
wdenkc6097192002-11-03 00:24:07 +0000219
220int checkcpu (void)
221{
Stefan Roese42f2a822005-11-27 19:36:26 +0100222#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
Stefan Roese42f2a822005-11-27 19:36:26 +0100223 uint pvr = get_pvr();
wdenkc6097192002-11-03 00:24:07 +0000224 ulong clock = gd->cpu_clk;
225 char buf[32];
wdenkc6097192002-11-03 00:24:07 +0000226
Stefan Roese42f2a822005-11-27 19:36:26 +0100227#if !defined(CONFIG_IOP480)
Wolfgang Denk65505432006-10-20 17:54:33 +0200228 char addstr[64] = "";
Stefan Roese42f2a822005-11-27 19:36:26 +0100229 sys_info_t sys_info;
wdenkc6097192002-11-03 00:24:07 +0000230
231 puts ("CPU: ");
232
233 get_sys_info(&sys_info);
234
Stefan Roese42f2a822005-11-27 19:36:26 +0100235 puts("AMCC PowerPC 4");
236
Stefan Roese17ffbc82007-03-21 13:38:59 +0100237#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
238 defined(CONFIG_405EP) || defined(CONFIG_405EZ)
Stefan Roese42f2a822005-11-27 19:36:26 +0100239 puts("05");
wdenkc6097192002-11-03 00:24:07 +0000240#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100241#if defined(CONFIG_440)
242 puts("40");
stroese434979e2003-05-23 11:18:02 +0000243#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100244
wdenkc6097192002-11-03 00:24:07 +0000245 switch (pvr) {
246 case PVR_405GP_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100247 puts("GP Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000248 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100249
wdenkc6097192002-11-03 00:24:07 +0000250 case PVR_405GP_RC:
Stefan Roese42f2a822005-11-27 19:36:26 +0100251 puts("GP Rev. C");
wdenkc6097192002-11-03 00:24:07 +0000252 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100253
wdenkc6097192002-11-03 00:24:07 +0000254 case PVR_405GP_RD:
Stefan Roese42f2a822005-11-27 19:36:26 +0100255 puts("GP Rev. D");
wdenkc6097192002-11-03 00:24:07 +0000256 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100257
wdenkc35ba4e2004-03-14 22:25:36 +0000258#ifdef CONFIG_405GP
Stefan Roese42f2a822005-11-27 19:36:26 +0100259 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
260 puts("GP Rev. E");
wdenkc6097192002-11-03 00:24:07 +0000261 break;
262#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100263
wdenkc6097192002-11-03 00:24:07 +0000264 case PVR_405CR_RA:
Stefan Roese42f2a822005-11-27 19:36:26 +0100265 puts("CR Rev. A");
wdenkc6097192002-11-03 00:24:07 +0000266 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100267
wdenkc6097192002-11-03 00:24:07 +0000268 case PVR_405CR_RB:
Stefan Roese42f2a822005-11-27 19:36:26 +0100269 puts("CR Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000270 break;
wdenkc6097192002-11-03 00:24:07 +0000271
Stefan Roese42f2a822005-11-27 19:36:26 +0100272#ifdef CONFIG_405CR
273 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
274 puts("CR Rev. C");
275 break;
wdenkc6097192002-11-03 00:24:07 +0000276#endif
277
Stefan Roese42f2a822005-11-27 19:36:26 +0100278 case PVR_405GPR_RB:
279 puts("GPr Rev. B");
280 break;
wdenkc6097192002-11-03 00:24:07 +0000281
Stefan Roese42f2a822005-11-27 19:36:26 +0100282 case PVR_405EP_RB:
283 puts("EP Rev. B");
284 break;
wdenkc6097192002-11-03 00:24:07 +0000285
Stefan Roese17ffbc82007-03-21 13:38:59 +0100286 case PVR_405EZ_RA:
287 puts("EZ Rev. A");
288 break;
289
wdenkc6097192002-11-03 00:24:07 +0000290#if defined(CONFIG_440)
wdenk57b2d802003-06-27 21:31:46 +0000291 case PVR_440GP_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200292 puts("GP Rev. B");
wdenka4685fe2003-09-03 14:03:26 +0000293 /* See errata 1.12: CHIP_4 */
294 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
295 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
296 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
297 "Resetting chip ...\n");
298 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
299 do_chip_reset ( mfdcr(cpc0_strp0),
300 mfdcr(cpc0_strp1) );
301 }
wdenkc6097192002-11-03 00:24:07 +0000302 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100303
wdenk57b2d802003-06-27 21:31:46 +0000304 case PVR_440GP_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200305 puts("GP Rev. C");
wdenk544e9732004-02-06 23:19:44 +0000306 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100307
wdenk544e9732004-02-06 23:19:44 +0000308 case PVR_440GX_RA:
Stefan Roese326c9712005-08-01 16:41:48 +0200309 puts("GX Rev. A");
wdenk544e9732004-02-06 23:19:44 +0000310 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100311
wdenk544e9732004-02-06 23:19:44 +0000312 case PVR_440GX_RB:
Stefan Roese326c9712005-08-01 16:41:48 +0200313 puts("GX Rev. B");
wdenkc6097192002-11-03 00:24:07 +0000314 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100315
stroesec0125272005-04-07 05:33:41 +0000316 case PVR_440GX_RC:
Stefan Roese326c9712005-08-01 16:41:48 +0200317 puts("GX Rev. C");
stroesec0125272005-04-07 05:33:41 +0000318 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100319
Stefan Roese08fb4042005-11-01 10:08:03 +0100320 case PVR_440GX_RF:
321 puts("GX Rev. F");
322 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100323
Stefan Roese326c9712005-08-01 16:41:48 +0200324 case PVR_440EP_RA:
325 puts("EP Rev. A");
326 break;
Stefan Roese42f2a822005-11-27 19:36:26 +0100327
Stefan Roese95258d52005-10-04 15:00:30 +0200328#ifdef CONFIG_440EP
329 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
Stefan Roese326c9712005-08-01 16:41:48 +0200330 puts("EP Rev. B");
331 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200332
333 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
334 puts("EP Rev. C");
335 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200336#endif /* CONFIG_440EP */
Stefan Roese42f2a822005-11-27 19:36:26 +0100337
Stefan Roese95258d52005-10-04 15:00:30 +0200338#ifdef CONFIG_440GR
339 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
340 puts("GR Rev. A");
341 break;
Stefan Roese31ce7de2006-05-10 14:10:41 +0200342
Stefan Roese96467d62006-05-18 19:21:53 +0200343 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
Stefan Roese31ce7de2006-05-10 14:10:41 +0200344 puts("GR Rev. B");
345 break;
Stefan Roese95258d52005-10-04 15:00:30 +0200346#endif /* CONFIG_440GR */
Stefan Roese42f2a822005-11-27 19:36:26 +0100347#endif /* CONFIG_440 */
348
Stefan Roese188fab62007-01-31 16:56:10 +0100349#ifdef CONFIG_440EPX
350 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200351 puts("EPx Rev. A");
352 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200353 break;
354
Stefan Roese188fab62007-01-31 16:56:10 +0100355 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200356 puts("EPx Rev. A");
357 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200358 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100359#endif /* CONFIG_440EPX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200360
Stefan Roese188fab62007-01-31 16:56:10 +0100361#ifdef CONFIG_440GRX
362 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200363 puts("GRx Rev. A");
364 strcpy(addstr, "Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200365 break;
366
Stefan Roese188fab62007-01-31 16:56:10 +0100367 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
Stefan Roese11dd8812006-10-18 15:59:35 +0200368 puts("GRx Rev. A");
369 strcpy(addstr, "No Security/Kasumi support");
Stefan Roese42fbddd2006-09-07 11:51:23 +0200370 break;
Stefan Roese188fab62007-01-31 16:56:10 +0100371#endif /* CONFIG_440GRX */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200372
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100373 case PVR_440SP_6_RAB:
374 puts("SP Rev. A/B");
375 strcpy(addstr, "RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100376 break;
377
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100378 case PVR_440SP_RAB:
379 puts("SP Rev. A/B");
380 strcpy(addstr, "No RAID 6 support");
Stefan Roese99644742005-11-29 18:18:21 +0100381 break;
382
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100383 case PVR_440SP_6_RC:
384 puts("SP Rev. C");
385 strcpy(addstr, "RAID 6 support");
386 break;
387
Stefan Roesec6d59302006-11-28 16:09:24 +0100388 case PVR_440SP_RC:
389 puts("SP Rev. C");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100390 strcpy(addstr, "No RAID 6 support");
Stefan Roesec6d59302006-11-28 16:09:24 +0100391 break;
392
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100393 case PVR_440SPe_6_RA:
394 puts("SPe Rev. A");
395 strcpy(addstr, "RAID 6 support");
396 break;
397
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200398 case PVR_440SPe_RA:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200399 puts("SPe Rev. A");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100400 strcpy(addstr, "No RAID 6 support");
401 break;
402
403 case PVR_440SPe_6_RB:
404 puts("SPe Rev. B");
405 strcpy(addstr, "RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200406 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200407
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200408 case PVR_440SPe_RB:
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200409 puts("SPe Rev. B");
Stefan Roesef4b01bf2007-01-13 08:01:03 +0100410 strcpy(addstr, "No RAID 6 support");
Marian Balakowicz49d0eee2006-06-30 16:30:46 +0200411 break;
Marian Balakowicz11b8c432006-07-03 23:42:36 +0200412
wdenk57b2d802003-06-27 21:31:46 +0000413 default:
Stefan Roese363330b2005-08-04 17:09:16 +0200414 printf (" UNKNOWN (PVR=%08x)", pvr);
wdenkc6097192002-11-03 00:24:07 +0000415 break;
416 }
Stefan Roese42f2a822005-11-27 19:36:26 +0100417
418 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
Stefan Roese17ffbc82007-03-21 13:38:59 +0100419 sys_info.freqPLB / 1000000,
420 get_OPB_freq() / 1000000,
421 FREQ_EBC / 1000000);
Stefan Roese42f2a822005-11-27 19:36:26 +0100422
Stefan Roese11dd8812006-10-18 15:59:35 +0200423 if (addstr[0] != 0)
424 printf(" %s\n", addstr);
425
Stefan Roese99644742005-11-29 18:18:21 +0100426#if defined(I2C_BOOTROM)
427 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
Stefan Roese3a75ac12007-04-18 12:05:59 +0200428#endif /* I2C_BOOTROM */
Stefan Roese42fbddd2006-09-07 11:51:23 +0200429#if defined(SDR0_PINSTP_SHIFT)
430 printf (" Bootstrap Option %c - ", (char)bootstrap_option() + 'A');
431 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
Wolfgang Denk65505432006-10-20 17:54:33 +0200432#endif /* SDR0_PINSTP_SHIFT */
Stefan Roese42f2a822005-11-27 19:36:26 +0100433
Stefan Roese99644742005-11-29 18:18:21 +0100434#if defined(CONFIG_PCI)
435 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
Stefan Roese42f2a822005-11-27 19:36:26 +0100436#endif
437
Stefan Roese99644742005-11-29 18:18:21 +0100438#if defined(PCI_ASYNC)
439 if (pci_async_enabled()) {
Stefan Roese42f2a822005-11-27 19:36:26 +0100440 printf (", PCI async ext clock used");
441 } else {
442 printf (", PCI sync clock at %lu MHz",
443 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
444 }
wdenkc6097192002-11-03 00:24:07 +0000445#endif
Stefan Roese42f2a822005-11-27 19:36:26 +0100446
Stefan Roese99644742005-11-29 18:18:21 +0100447#if defined(CONFIG_PCI)
Stefan Roese42f2a822005-11-27 19:36:26 +0100448 putc('\n');
449#endif
450
Stefan Roese17ffbc82007-03-21 13:38:59 +0100451#if defined(CONFIG_405EP) || defined(CONFIG_405EZ)
Stefan Roese42f2a822005-11-27 19:36:26 +0100452 printf (" 16 kB I-Cache 16 kB D-Cache");
453#elif defined(CONFIG_440)
454 printf (" 32 kB I-Cache 32 kB D-Cache");
455#else
456 printf (" 16 kB I-Cache %d kB D-Cache",
457 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
458#endif
459#endif /* !defined(CONFIG_IOP480) */
460
461#if defined(CONFIG_IOP480)
462 printf ("PLX IOP480 (PVR=%08x)", pvr);
463 printf (" at %s MHz:", strmhz(buf, clock));
464 printf (" %u kB I-Cache", 4);
465 printf (" %u kB D-Cache", 2);
466#endif
467
468#endif /* !defined(CONFIG_405) */
469
470 putc ('\n');
wdenkc6097192002-11-03 00:24:07 +0000471
472 return 0;
473}
474
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200475#if defined (CONFIG_440SPE)
476int ppc440spe_revB() {
477 unsigned int pvr;
478
479 pvr = get_pvr();
Stefan Roese1456a772007-01-15 09:46:29 +0100480 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
Rafal Jaworowskia2e7ef02006-08-10 12:43:17 +0200481 return 1;
482 else
483 return 0;
484}
485#endif
wdenkc6097192002-11-03 00:24:07 +0000486
487/* ------------------------------------------------------------------------- */
488
wdenk57b2d802003-06-27 21:31:46 +0000489int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
wdenkc6097192002-11-03 00:24:07 +0000490{
Stefan Roeseecf05b22006-11-27 14:48:41 +0100491#if defined(CONFIG_BOARD_RESET)
492 board_reset();
Stefan Roesea5232952006-11-27 14:52:04 +0100493#else
Stefan Roese2a4a9432006-11-27 14:12:17 +0100494#if defined(CFG_4xx_RESET_TYPE)
495 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
Stefan Roese326c9712005-08-01 16:41:48 +0200496#else
wdenk57b2d802003-06-27 21:31:46 +0000497 /*
498 * Initiate system reset in debug control register DBCR
499 */
Stefan Roese03687752006-10-07 11:30:52 +0200500 mtspr(dbcr0, 0x30000000);
Stefan Roesea5232952006-11-27 14:52:04 +0100501#endif /* defined(CFG_4xx_RESET_TYPE) */
Stefan Roese03687752006-10-07 11:30:52 +0200502#endif /* defined(CONFIG_BOARD_RESET) */
Stefan Roese326c9712005-08-01 16:41:48 +0200503
wdenkc6097192002-11-03 00:24:07 +0000504 return 1;
505}
506
507#if defined(CONFIG_440)
Stefan Roese42f2a822005-11-27 19:36:26 +0100508static int do_chip_reset (unsigned long sys0, unsigned long sys1)
wdenkc6097192002-11-03 00:24:07 +0000509{
wdenka4685fe2003-09-03 14:03:26 +0000510 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
511 * reset.
512 */
513 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
514 mtdcr (cpc0_sys0, sys0);
515 mtdcr (cpc0_sys1, sys1);
516 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
517 mtspr (dbcr0, 0x20000000); /* Reset the chip */
wdenkc6097192002-11-03 00:24:07 +0000518
wdenka4685fe2003-09-03 14:03:26 +0000519 return 1;
wdenkc6097192002-11-03 00:24:07 +0000520}
521#endif
522
523
524/*
525 * Get timebase clock frequency
526 */
527unsigned long get_tbclk (void)
528{
Stefan Roese42f2a822005-11-27 19:36:26 +0100529#if !defined(CONFIG_IOP480)
wdenkc6097192002-11-03 00:24:07 +0000530 sys_info_t sys_info;
531
532 get_sys_info(&sys_info);
533 return (sys_info.freqProcessor);
wdenkc6097192002-11-03 00:24:07 +0000534#else
Stefan Roese42f2a822005-11-27 19:36:26 +0100535 return (66000000);
wdenkc6097192002-11-03 00:24:07 +0000536#endif
537
538}
539
540
541#if defined(CONFIG_WATCHDOG)
542void
543watchdog_reset(void)
544{
545 int re_enable = disable_interrupts();
546 reset_4xx_watchdog();
547 if (re_enable) enable_interrupts();
548}
549
550void
551reset_4xx_watchdog(void)
552{
553 /*
554 * Clear TSR(WIS) bit
555 */
556 mtspr(tsr, 0x40000000);
557}
558#endif /* CONFIG_WATCHDOG */