Change boot command to boot kernel from 0xc1028380
[u-boot-m93030.git] / cpu / ppc4xx / cpu.c
blob39f439df9881dabc3d85196bc9892cf87c919009
1 /*
2 * (C) Copyright 2000-2007
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * See file CREDITS for list of people who contributed to this
6 * project.
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.
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.
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
25 * CPU specific code
27 * written or collected and sometimes rewritten by
28 * Magnus Damm <damm@bitsmart.com>
30 * minor modifications by
31 * Wolfgang Denk <wd@denx.de>
34 #include <common.h>
35 #include <watchdog.h>
36 #include <command.h>
37 #include <asm/cache.h>
38 #include <ppc4xx.h>
40 DECLARE_GLOBAL_DATA_PTR;
42 void board_reset(void);
44 #if defined(CONFIG_405GP) || \
45 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
46 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
48 #define PCI_ASYNC
50 static int pci_async_enabled(void)
52 #if defined(CONFIG_405GP)
53 return (mfdcr(strap) & PSR_PCI_ASYNC_EN);
54 #endif
56 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
57 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
58 defined(CONFIG_460EX) || defined(CONFIG_460GT)
59 unsigned long val;
61 mfsdr(sdr_sdstp1, val);
62 return (val & SDR0_SDSTP1_PAME_MASK);
63 #endif
65 #endif
67 #if defined(CONFIG_PCI) && !defined(CONFIG_IOP480) && \
68 !defined(CONFIG_405) && !defined(CONFIG_405EX)
69 static int pci_arbiter_enabled(void)
71 #if defined(CONFIG_405GP)
72 return (mfdcr(strap) & PSR_PCI_ARBIT_EN);
73 #endif
75 #if defined(CONFIG_405EP)
76 return (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN);
77 #endif
79 #if defined(CONFIG_440GP)
80 return (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE_MASK);
81 #endif
83 #if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
84 unsigned long val;
86 mfsdr(sdr_xcr, val);
87 return (val & 0x80000000);
88 #endif
89 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
90 defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
91 defined(CONFIG_460EX) || defined(CONFIG_460GT)
92 unsigned long val;
94 mfsdr(sdr_pci0, val);
95 return (val & 0x80000000);
96 #endif
98 #endif
100 #if defined(CONFIG_405EP)
101 #define I2C_BOOTROM
103 static int i2c_bootrom_enabled(void)
105 #if defined(CONFIG_405EP)
106 return (mfdcr(cpc0_boot) & CPC0_BOOT_SEP);
107 #else
108 unsigned long val;
110 mfsdr(sdr_sdcs, val);
111 return (val & SDR0_SDCS_SDD);
112 #endif
114 #endif
116 #if defined(CONFIG_440GX)
117 #define SDR0_PINSTP_SHIFT 29
118 static char *bootstrap_str[] = {
119 "EBC (16 bits)",
120 "EBC (8 bits)",
121 "EBC (32 bits)",
122 "EBC (8 bits)",
123 "PCI",
124 "I2C (Addr 0x54)",
125 "Reserved",
126 "I2C (Addr 0x50)",
128 static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
129 #endif
131 #if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
132 #define SDR0_PINSTP_SHIFT 30
133 static char *bootstrap_str[] = {
134 "EBC (8 bits)",
135 "PCI",
136 "I2C (Addr 0x54)",
137 "I2C (Addr 0x50)",
139 static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
140 #endif
142 #if defined(CONFIG_440EP) || defined(CONFIG_440GR)
143 #define SDR0_PINSTP_SHIFT 29
144 static char *bootstrap_str[] = {
145 "EBC (8 bits)",
146 "PCI",
147 "NAND (8 bits)",
148 "EBC (16 bits)",
149 "EBC (16 bits)",
150 "I2C (Addr 0x54)",
151 "PCI",
152 "I2C (Addr 0x52)",
154 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
155 #endif
157 #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
158 #define SDR0_PINSTP_SHIFT 29
159 static char *bootstrap_str[] = {
160 "EBC (8 bits)",
161 "EBC (16 bits)",
162 "EBC (16 bits)",
163 "NAND (8 bits)",
164 "PCI",
165 "I2C (Addr 0x54)",
166 "PCI",
167 "I2C (Addr 0x52)",
169 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
170 #endif
172 #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
173 #define SDR0_PINSTP_SHIFT 29
174 static char *bootstrap_str[] = {
175 "EBC (8 bits)",
176 "EBC (16 bits)",
177 "PCI",
178 "PCI",
179 "EBC (16 bits)",
180 "NAND (8 bits)",
181 "I2C (Addr 0x54)", /* A8 */
182 "I2C (Addr 0x52)", /* A4 */
184 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
185 #endif
187 #if defined(CONFIG_405EZ)
188 #define SDR0_PINSTP_SHIFT 28
189 static char *bootstrap_str[] = {
190 "EBC (8 bits)",
191 "SPI (fast)",
192 "NAND (512 page, 4 addr cycle)",
193 "I2C (Addr 0x50)",
194 "EBC (32 bits)",
195 "I2C (Addr 0x50)",
196 "NAND (2K page, 5 addr cycle)",
197 "I2C (Addr 0x50)",
198 "EBC (16 bits)",
199 "Reserved",
200 "NAND (2K page, 4 addr cycle)",
201 "I2C (Addr 0x50)",
202 "NAND (512 page, 3 addr cycle)",
203 "I2C (Addr 0x50)",
204 "SPI (slow)",
205 "I2C (Addr 0x50)",
207 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
208 'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
209 #endif
211 #if defined(CONFIG_405EX)
212 #define SDR0_PINSTP_SHIFT 29
213 static char *bootstrap_str[] = {
214 "EBC (8 bits)",
215 "EBC (16 bits)",
216 "EBC (16 bits)",
217 "NAND (8 bits)",
218 "NAND (8 bits)",
219 "I2C (Addr 0x54)",
220 "EBC (8 bits)",
221 "I2C (Addr 0x52)",
223 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
224 #endif
226 #if defined(SDR0_PINSTP_SHIFT)
227 static int bootstrap_option(void)
229 unsigned long val;
231 mfsdr(SDR_PINSTP, val);
232 return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
234 #endif /* SDR0_PINSTP_SHIFT */
237 #if defined(CONFIG_440)
238 static int do_chip_reset (unsigned long sys0, unsigned long sys1)
240 /* Changes to cpc0_sys0 and cpc0_sys1 require chip
241 * reset.
243 mtdcr (cntrl0, mfdcr (cntrl0) | 0x80000000); /* Set SWE */
244 mtdcr (cpc0_sys0, sys0);
245 mtdcr (cpc0_sys1, sys1);
246 mtdcr (cntrl0, mfdcr (cntrl0) & ~0x80000000); /* Clr SWE */
247 mtspr (dbcr0, 0x20000000); /* Reset the chip */
249 return 1;
251 #endif
254 int checkcpu (void)
256 #if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
257 uint pvr = get_pvr();
258 ulong clock = gd->cpu_clk;
259 char buf[32];
261 #if !defined(CONFIG_IOP480)
262 char addstr[64] = "";
263 sys_info_t sys_info;
265 puts ("CPU: ");
267 get_sys_info(&sys_info);
269 puts("AMCC PowerPC 4");
271 #if defined(CONFIG_405GP) || defined(CONFIG_405CR) || \
272 defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
273 defined(CONFIG_405EX)
274 puts("05");
275 #endif
276 #if defined(CONFIG_440)
277 #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
278 puts("60");
279 #else
280 puts("40");
281 #endif
282 #endif
284 switch (pvr) {
285 case PVR_405GP_RB:
286 puts("GP Rev. B");
287 break;
289 case PVR_405GP_RC:
290 puts("GP Rev. C");
291 break;
293 case PVR_405GP_RD:
294 puts("GP Rev. D");
295 break;
297 #ifdef CONFIG_405GP
298 case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
299 puts("GP Rev. E");
300 break;
301 #endif
303 case PVR_405CR_RA:
304 puts("CR Rev. A");
305 break;
307 case PVR_405CR_RB:
308 puts("CR Rev. B");
309 break;
311 #ifdef CONFIG_405CR
312 case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
313 puts("CR Rev. C");
314 break;
315 #endif
317 case PVR_405GPR_RB:
318 puts("GPr Rev. B");
319 break;
321 case PVR_405EP_RB:
322 puts("EP Rev. B");
323 break;
325 case PVR_405EZ_RA:
326 puts("EZ Rev. A");
327 break;
329 case PVR_405EX1_RA:
330 puts("EX Rev. A");
331 strcpy(addstr, "Security support");
332 break;
334 case PVR_405EX2_RA:
335 puts("EX Rev. A");
336 strcpy(addstr, "No Security support");
337 break;
339 case PVR_405EXR1_RA:
340 puts("EXr Rev. A");
341 strcpy(addstr, "Security support");
342 break;
344 case PVR_405EXR2_RA:
345 puts("EXr Rev. A");
346 strcpy(addstr, "No Security support");
347 break;
349 case PVR_405EX1_RC:
350 puts("EX Rev. C");
351 strcpy(addstr, "Security support");
352 break;
354 case PVR_405EX2_RC:
355 puts("EX Rev. C");
356 strcpy(addstr, "No Security support");
357 break;
359 case PVR_405EXR1_RC:
360 puts("EXr Rev. C");
361 strcpy(addstr, "Security support");
362 break;
364 case PVR_405EXR2_RC:
365 puts("EXr Rev. C");
366 strcpy(addstr, "No Security support");
367 break;
369 #if defined(CONFIG_440)
370 case PVR_440GP_RB:
371 puts("GP Rev. B");
372 /* See errata 1.12: CHIP_4 */
373 if ((mfdcr(cpc0_sys0) != mfdcr(cpc0_strp0)) ||
374 (mfdcr(cpc0_sys1) != mfdcr(cpc0_strp1)) ){
375 puts ( "\n\t CPC0_SYSx DCRs corrupted. "
376 "Resetting chip ...\n");
377 udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
378 do_chip_reset ( mfdcr(cpc0_strp0),
379 mfdcr(cpc0_strp1) );
381 break;
383 case PVR_440GP_RC:
384 puts("GP Rev. C");
385 break;
387 case PVR_440GX_RA:
388 puts("GX Rev. A");
389 break;
391 case PVR_440GX_RB:
392 puts("GX Rev. B");
393 break;
395 case PVR_440GX_RC:
396 puts("GX Rev. C");
397 break;
399 case PVR_440GX_RF:
400 puts("GX Rev. F");
401 break;
403 case PVR_440EP_RA:
404 puts("EP Rev. A");
405 break;
407 #ifdef CONFIG_440EP
408 case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
409 puts("EP Rev. B");
410 break;
412 case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
413 puts("EP Rev. C");
414 break;
415 #endif /* CONFIG_440EP */
417 #ifdef CONFIG_440GR
418 case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
419 puts("GR Rev. A");
420 break;
422 case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
423 puts("GR Rev. B");
424 break;
425 #endif /* CONFIG_440GR */
426 #endif /* CONFIG_440 */
428 #ifdef CONFIG_440EPX
429 case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
430 puts("EPx Rev. A");
431 strcpy(addstr, "Security/Kasumi support");
432 break;
434 case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
435 puts("EPx Rev. A");
436 strcpy(addstr, "No Security/Kasumi support");
437 break;
438 #endif /* CONFIG_440EPX */
440 #ifdef CONFIG_440GRX
441 case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
442 puts("GRx Rev. A");
443 strcpy(addstr, "Security/Kasumi support");
444 break;
446 case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
447 puts("GRx Rev. A");
448 strcpy(addstr, "No Security/Kasumi support");
449 break;
450 #endif /* CONFIG_440GRX */
452 case PVR_440SP_6_RAB:
453 puts("SP Rev. A/B");
454 strcpy(addstr, "RAID 6 support");
455 break;
457 case PVR_440SP_RAB:
458 puts("SP Rev. A/B");
459 strcpy(addstr, "No RAID 6 support");
460 break;
462 case PVR_440SP_6_RC:
463 puts("SP Rev. C");
464 strcpy(addstr, "RAID 6 support");
465 break;
467 case PVR_440SP_RC:
468 puts("SP Rev. C");
469 strcpy(addstr, "No RAID 6 support");
470 break;
472 case PVR_440SPe_6_RA:
473 puts("SPe Rev. A");
474 strcpy(addstr, "RAID 6 support");
475 break;
477 case PVR_440SPe_RA:
478 puts("SPe Rev. A");
479 strcpy(addstr, "No RAID 6 support");
480 break;
482 case PVR_440SPe_6_RB:
483 puts("SPe Rev. B");
484 strcpy(addstr, "RAID 6 support");
485 break;
487 case PVR_440SPe_RB:
488 puts("SPe Rev. B");
489 strcpy(addstr, "No RAID 6 support");
490 break;
492 case PVR_460EX_RA:
493 puts("EX Rev. A");
494 strcpy(addstr, "No Security/Kasumi support");
495 break;
497 case PVR_460EX_SE_RA:
498 puts("EX Rev. A");
499 strcpy(addstr, "Security/Kasumi support");
500 break;
502 case PVR_460GT_RA:
503 puts("GT Rev. A");
504 strcpy(addstr, "No Security/Kasumi support");
505 break;
507 case PVR_460GT_SE_RA:
508 puts("GT Rev. A");
509 strcpy(addstr, "Security/Kasumi support");
510 break;
512 default:
513 printf (" UNKNOWN (PVR=%08x)", pvr);
514 break;
517 printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
518 sys_info.freqPLB / 1000000,
519 get_OPB_freq() / 1000000,
520 sys_info.freqEBC / 1000000);
522 if (addstr[0] != 0)
523 printf(" %s\n", addstr);
525 #if defined(I2C_BOOTROM)
526 printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
527 #endif /* I2C_BOOTROM */
528 #if defined(SDR0_PINSTP_SHIFT)
529 printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
530 printf ("Boot ROM Location %s\n", bootstrap_str[bootstrap_option()]);
531 #endif /* SDR0_PINSTP_SHIFT */
533 #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
534 printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
535 #endif
537 #if defined(PCI_ASYNC)
538 if (pci_async_enabled()) {
539 printf (", PCI async ext clock used");
540 } else {
541 printf (", PCI sync clock at %lu MHz",
542 sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
544 #endif
546 #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
547 putc('\n');
548 #endif
550 #if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
551 printf (" 16 kB I-Cache 16 kB D-Cache");
552 #elif defined(CONFIG_440)
553 printf (" 32 kB I-Cache 32 kB D-Cache");
554 #else
555 printf (" 16 kB I-Cache %d kB D-Cache",
556 ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
557 #endif
558 #endif /* !defined(CONFIG_IOP480) */
560 #if defined(CONFIG_IOP480)
561 printf ("PLX IOP480 (PVR=%08x)", pvr);
562 printf (" at %s MHz:", strmhz(buf, clock));
563 printf (" %u kB I-Cache", 4);
564 printf (" %u kB D-Cache", 2);
565 #endif
567 #endif /* !defined(CONFIG_405) */
569 putc ('\n');
571 return 0;
574 int ppc440spe_revB() {
575 unsigned int pvr;
577 pvr = get_pvr();
578 if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
579 return 1;
580 else
581 return 0;
584 /* ------------------------------------------------------------------------- */
586 int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
588 #if defined(CONFIG_BOARD_RESET)
589 board_reset();
590 #else
591 #if defined(CFG_4xx_RESET_TYPE)
592 mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28);
593 #else
595 * Initiate system reset in debug control register DBCR
597 mtspr(dbcr0, 0x30000000);
598 #endif /* defined(CFG_4xx_RESET_TYPE) */
599 #endif /* defined(CONFIG_BOARD_RESET) */
601 return 1;
606 * Get timebase clock frequency
608 unsigned long get_tbclk (void)
610 #if !defined(CONFIG_IOP480)
611 sys_info_t sys_info;
613 get_sys_info(&sys_info);
614 return (sys_info.freqProcessor);
615 #else
616 return (66000000);
617 #endif
622 #if defined(CONFIG_WATCHDOG)
623 void watchdog_reset(void)
625 int re_enable = disable_interrupts();
626 reset_4xx_watchdog();
627 if (re_enable) enable_interrupts();
630 void reset_4xx_watchdog(void)
633 * Clear TSR(WIS) bit
635 mtspr(tsr, 0x40000000);
637 #endif /* CONFIG_WATCHDOG */