]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/powerpc/cpu/ppc4xx/cpu.c
karo: fdt: fix panel-dpi support
[karo-tx-uboot.git] / arch / powerpc / cpu / ppc4xx / cpu.c
1 /*
2  * (C) Copyright 2000-2007
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 /*
9  * 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>
22 #include <asm/ppc4xx.h>
23 #include <netdev.h>
24
25 DECLARE_GLOBAL_DATA_PTR;
26
27 void board_reset(void);
28
29 /*
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  */
35 int __get_cpu_num(void)
36 {
37         return NA_OR_UNKNOWN_CPU;
38 }
39 int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
40
41 #if defined(CONFIG_PCI)
42 #if defined(CONFIG_405GP) || \
43     defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
44     defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
45
46 #define PCI_ASYNC
47
48 static int pci_async_enabled(void)
49 {
50 #if defined(CONFIG_405GP)
51         return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
52 #endif
53
54 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
55     defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
56     defined(CONFIG_460EX) || defined(CONFIG_460GT)
57         unsigned long val;
58
59         mfsdr(SDR0_SDSTP1, val);
60         return (val & SDR0_SDSTP1_PAME_MASK);
61 #endif
62 }
63 #endif
64 #endif /* CONFIG_PCI */
65
66 #if defined(CONFIG_PCI) && \
67     !defined(CONFIG_405) && !defined(CONFIG_405EX)
68 int pci_arbiter_enabled(void)
69 {
70 #if defined(CONFIG_405GP)
71         return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
72 #endif
73
74 #if defined(CONFIG_405EP)
75         return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
76 #endif
77
78 #if defined(CONFIG_440GP)
79         return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
80 #endif
81
82 #if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
83         unsigned long val;
84
85         mfsdr(SDR0_XCR0, val);
86         return (val & SDR0_XCR0_PAE_MASK);
87 #endif
88 #if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
89     defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
90     defined(CONFIG_460EX) || defined(CONFIG_460GT)
91         unsigned long val;
92
93         mfsdr(SDR0_PCI0, val);
94         return (val & SDR0_PCI0_PAE_MASK);
95 #endif
96 }
97 #endif
98
99 #if defined(CONFIG_405EP)
100 #define I2C_BOOTROM
101
102 static int i2c_bootrom_enabled(void)
103 {
104 #if defined(CONFIG_405EP)
105         return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
106 #else
107         unsigned long val;
108
109         mfsdr(SDR0_SDCS0, val);
110         return (val & SDR0_SDCS_SDD);
111 #endif
112 }
113 #endif
114
115 #if defined(CONFIG_440GX)
116 #define SDR0_PINSTP_SHIFT       29
117 static 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 };
127 static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
128 #endif
129
130 #if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
131 #define SDR0_PINSTP_SHIFT       30
132 static char *bootstrap_str[] = {
133         "EBC (8 bits)",
134         "PCI",
135         "I2C (Addr 0x54)",
136         "I2C (Addr 0x50)",
137 };
138 static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
139 #endif
140
141 #if defined(CONFIG_440EP) || defined(CONFIG_440GR)
142 #define SDR0_PINSTP_SHIFT       29
143 static 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 };
153 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
154 #endif
155
156 #if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
157 #define SDR0_PINSTP_SHIFT       29
158 static 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 };
168 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
169 #endif
170
171 #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
172 #define SDR0_PINSTP_SHIFT       29
173 static 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 };
183 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
184 #endif
185
186 #if defined(CONFIG_460SX)
187 #define SDR0_PINSTP_SHIFT       29
188 static 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 };
196 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
197 #endif
198
199 #if defined(CONFIG_405EZ)
200 #define SDR0_PINSTP_SHIFT       28
201 static 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 };
219 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
220                                  'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
221 #endif
222
223 #if defined(CONFIG_405EX)
224 #define SDR0_PINSTP_SHIFT       29
225 static 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 };
235 static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
236 #endif
237
238 #if defined(SDR0_PINSTP_SHIFT)
239 static int bootstrap_option(void)
240 {
241         unsigned long val;
242
243         mfsdr(SDR0_PINSTP, val);
244         return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
245 }
246 #endif /* SDR0_PINSTP_SHIFT */
247
248
249 #if defined(CONFIG_440GP)
250 static int do_chip_reset (unsigned long sys0, unsigned long sys1)
251 {
252         /* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
253          * reset.
254          */
255         mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000);        /* Set SWE */
256         mtdcr (CPC0_SYS0, sys0);
257         mtdcr (CPC0_SYS1, sys1);
258         mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000);       /* Clr SWE */
259         mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
260
261         return 1;
262 }
263 #endif /* CONFIG_440GP */
264
265
266 int checkcpu (void)
267 {
268 #if !defined(CONFIG_405)        /* not used on Xilinx 405 FPGA implementations */
269         uint pvr = get_pvr();
270         ulong clock = gd->cpu_clk;
271         char buf[32];
272 #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
273         u32 reg;
274 #endif
275
276         char addstr[64] = "";
277         sys_info_t sys_info;
278         int cpu_num;
279
280         cpu_num = get_cpu_num();
281         if (cpu_num >= 0)
282                 printf("CPU%d:  ", cpu_num);
283         else
284                 puts("CPU:   ");
285
286         get_sys_info(&sys_info);
287
288 #if defined(CONFIG_XILINX_440)
289         puts("IBM PowerPC ");
290 #else
291         puts("AMCC PowerPC ");
292 #endif
293
294         switch (pvr) {
295
296 #if !defined(CONFIG_440)
297         case PVR_405GP_RB:
298                 puts("405GP Rev. B");
299                 break;
300
301         case PVR_405GP_RC:
302                 puts("405GP Rev. C");
303                 break;
304
305         case PVR_405GP_RD:
306                 puts("405GP Rev. D");
307                 break;
308
309         case PVR_405GP_RE:
310                 puts("405GP Rev. E");
311                 break;
312
313         case PVR_405GPR_RB:
314                 puts("405GPr Rev. B");
315                 break;
316
317         case PVR_405EP_RB:
318                 puts("405EP Rev. B");
319                 break;
320
321         case PVR_405EZ_RA:
322                 puts("405EZ Rev. A");
323                 break;
324
325         case PVR_405EX1_RA:
326                 puts("405EX Rev. A");
327                 strcpy(addstr, "Security support");
328                 break;
329
330         case PVR_405EXR2_RA:
331                 puts("405EXr Rev. A");
332                 strcpy(addstr, "No Security support");
333                 break;
334
335         case PVR_405EX1_RC:
336                 puts("405EX Rev. C");
337                 strcpy(addstr, "Security support");
338                 break;
339
340         case PVR_405EX2_RC:
341                 puts("405EX Rev. C");
342                 strcpy(addstr, "No Security support");
343                 break;
344
345         case PVR_405EXR1_RC:
346                 puts("405EXr Rev. C");
347                 strcpy(addstr, "Security support");
348                 break;
349
350         case PVR_405EXR2_RC:
351                 puts("405EXr Rev. C");
352                 strcpy(addstr, "No Security support");
353                 break;
354
355         case PVR_405EX1_RD:
356                 puts("405EX Rev. D");
357                 strcpy(addstr, "Security support");
358                 break;
359
360         case PVR_405EX2_RD:
361                 puts("405EX Rev. D");
362                 strcpy(addstr, "No Security support");
363                 break;
364
365         case PVR_405EXR1_RD:
366                 puts("405EXr Rev. D");
367                 strcpy(addstr, "Security support");
368                 break;
369
370         case PVR_405EXR2_RD:
371                 puts("405EXr Rev. D");
372                 strcpy(addstr, "No Security support");
373                 break;
374
375 #else /* CONFIG_440 */
376
377 #if defined(CONFIG_440GP)
378         case PVR_440GP_RB:
379                 puts("440GP Rev. B");
380                 /* See errata 1.12: CHIP_4 */
381                 if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
382                     (mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
383                         puts (  "\n\t CPC0_SYSx DCRs corrupted. "
384                                 "Resetting chip ...\n");
385                         udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
386                         do_chip_reset ( mfdcr(CPC0_STRP0),
387                                         mfdcr(CPC0_STRP1) );
388                 }
389                 break;
390
391         case PVR_440GP_RC:
392                 puts("440GP Rev. C");
393                 break;
394 #endif /* CONFIG_440GP */
395
396         case PVR_440GX_RA:
397                 puts("440GX Rev. A");
398                 break;
399
400         case PVR_440GX_RB:
401                 puts("440GX Rev. B");
402                 break;
403
404         case PVR_440GX_RC:
405                 puts("440GX Rev. C");
406                 break;
407
408         case PVR_440GX_RF:
409                 puts("440GX Rev. F");
410                 break;
411
412         case PVR_440EP_RA:
413                 puts("440EP Rev. A");
414                 break;
415
416 #ifdef CONFIG_440EP
417         case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
418                 puts("440EP Rev. B");
419                 break;
420
421         case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
422                 puts("440EP Rev. C");
423                 break;
424 #endif /*  CONFIG_440EP */
425
426 #ifdef CONFIG_440GR
427         case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
428                 puts("440GR Rev. A");
429                 break;
430
431         case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
432                 puts("440GR Rev. B");
433                 break;
434 #endif /* CONFIG_440GR */
435
436 #ifdef CONFIG_440EPX
437         case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
438                 puts("440EPx Rev. A");
439                 strcpy(addstr, "Security/Kasumi support");
440                 break;
441
442         case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
443                 puts("440EPx Rev. A");
444                 strcpy(addstr, "No Security/Kasumi support");
445                 break;
446 #endif /* CONFIG_440EPX */
447
448 #ifdef CONFIG_440GRX
449         case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
450                 puts("440GRx Rev. A");
451                 strcpy(addstr, "Security/Kasumi support");
452                 break;
453
454         case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
455                 puts("440GRx Rev. A");
456                 strcpy(addstr, "No Security/Kasumi support");
457                 break;
458 #endif /* CONFIG_440GRX */
459
460         case PVR_440SP_6_RAB:
461                 puts("440SP Rev. A/B");
462                 strcpy(addstr, "RAID 6 support");
463                 break;
464
465         case PVR_440SP_RAB:
466                 puts("440SP Rev. A/B");
467                 strcpy(addstr, "No RAID 6 support");
468                 break;
469
470         case PVR_440SP_6_RC:
471                 puts("440SP Rev. C");
472                 strcpy(addstr, "RAID 6 support");
473                 break;
474
475         case PVR_440SP_RC:
476                 puts("440SP Rev. C");
477                 strcpy(addstr, "No RAID 6 support");
478                 break;
479
480         case PVR_440SPe_6_RA:
481                 puts("440SPe Rev. A");
482                 strcpy(addstr, "RAID 6 support");
483                 break;
484
485         case PVR_440SPe_RA:
486                 puts("440SPe Rev. A");
487                 strcpy(addstr, "No RAID 6 support");
488                 break;
489
490         case PVR_440SPe_6_RB:
491                 puts("440SPe Rev. B");
492                 strcpy(addstr, "RAID 6 support");
493                 break;
494
495         case PVR_440SPe_RB:
496                 puts("440SPe Rev. B");
497                 strcpy(addstr, "No RAID 6 support");
498                 break;
499
500 #if defined(CONFIG_460EX) || defined(CONFIG_460GT)
501         case PVR_460EX_RA:
502                 puts("460EX Rev. A");
503                 strcpy(addstr, "No Security/Kasumi support");
504                 break;
505
506         case PVR_460EX_SE_RA:
507                 puts("460EX Rev. A");
508                 strcpy(addstr, "Security/Kasumi support");
509                 break;
510
511         case PVR_460EX_RB:
512                 puts("460EX Rev. B");
513                 mfsdr(SDR0_ECID3, reg);
514                 if (reg & 0x00100000)
515                         strcpy(addstr, "No Security/Kasumi support");
516                 else
517                         strcpy(addstr, "Security/Kasumi support");
518                 break;
519
520         case PVR_460GT_RA:
521                 puts("460GT Rev. A");
522                 strcpy(addstr, "No Security/Kasumi support");
523                 break;
524
525         case PVR_460GT_SE_RA:
526                 puts("460GT Rev. A");
527                 strcpy(addstr, "Security/Kasumi support");
528                 break;
529
530         case PVR_460GT_RB:
531                 puts("460GT Rev. B");
532                 mfsdr(SDR0_ECID3, reg);
533                 if (reg & 0x00100000)
534                         strcpy(addstr, "No Security/Kasumi support");
535                 else
536                         strcpy(addstr, "Security/Kasumi support");
537                 break;
538 #endif
539
540         case PVR_460SX_RA:
541                 puts("460SX Rev. A");
542                 strcpy(addstr, "Security support");
543                 break;
544
545         case PVR_460SX_RA_V1:
546                 puts("460SX Rev. A");
547                 strcpy(addstr, "No Security support");
548                 break;
549
550         case PVR_460GX_RA:
551                 puts("460GX Rev. A");
552                 strcpy(addstr, "Security support");
553                 break;
554
555         case PVR_460GX_RA_V1:
556                 puts("460GX Rev. A");
557                 strcpy(addstr, "No Security support");
558                 break;
559
560         case PVR_APM821XX_RA:
561                 puts("APM821XX Rev. A");
562                 strcpy(addstr, "Security support");
563                 break;
564
565         case PVR_VIRTEX5:
566                 puts("440x5 VIRTEX5");
567                 break;
568 #endif /* CONFIG_440 */
569
570         default:
571                 printf (" UNKNOWN (PVR=%08x)", pvr);
572                 break;
573         }
574
575         printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
576                 strmhz(buf, clock),
577                 sys_info.freqPLB / 1000000,
578                 get_OPB_freq() / 1000000,
579                 sys_info.freqEBC / 1000000);
580 #if defined(CONFIG_PCI) && \
581         (defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
582          defined(CONFIG_440GR) || defined(CONFIG_440GRX))
583         printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
584 #endif
585         printf(")\n");
586
587         if (addstr[0] != 0)
588                 printf("       %s\n", addstr);
589
590 #if defined(I2C_BOOTROM)
591         printf ("       I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
592 #endif  /* I2C_BOOTROM */
593 #if defined(SDR0_PINSTP_SHIFT)
594         printf ("       Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
595         printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
596         putc('\n');
597 #endif  /* SDR0_PINSTP_SHIFT */
598
599 #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
600         printf ("       Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
601 #endif
602
603 #if defined(CONFIG_PCI) && defined(PCI_ASYNC)
604         if (pci_async_enabled()) {
605                 printf (", PCI async ext clock used");
606         } else {
607                 printf (", PCI sync clock at %lu MHz",
608                        sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
609         }
610 #endif
611
612 #if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
613         putc('\n');
614 #endif
615
616 #if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
617         printf("       16 KiB I-Cache 16 KiB D-Cache");
618 #elif defined(CONFIG_440)
619         printf("       32 KiB I-Cache 32 KiB D-Cache");
620 #else
621         printf("       16 KiB I-Cache %d KiB D-Cache",
622                ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
623 #endif
624
625 #endif /* !defined(CONFIG_405) */
626
627         putc ('\n');
628
629         return 0;
630 }
631
632 int ppc440spe_revB() {
633         unsigned int pvr;
634
635         pvr = get_pvr();
636         if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
637                 return 1;
638         else
639                 return 0;
640 }
641
642 /* ------------------------------------------------------------------------- */
643
644 int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
645 {
646 #if defined(CONFIG_BOARD_RESET)
647         board_reset();
648 #else
649 #if defined(CONFIG_SYS_4xx_RESET_TYPE)
650         mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
651 #else
652         /*
653          * Initiate system reset in debug control register DBCR
654          */
655         mtspr(SPRN_DBCR0, 0x30000000);
656 #endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
657 #endif /* defined(CONFIG_BOARD_RESET) */
658
659         return 1;
660 }
661
662
663 /*
664  * Get timebase clock frequency
665  */
666 unsigned long get_tbclk (void)
667 {
668         sys_info_t  sys_info;
669
670         get_sys_info(&sys_info);
671         return (sys_info.freqProcessor);
672 }
673
674
675 #if defined(CONFIG_WATCHDOG)
676 void watchdog_reset(void)
677 {
678         int re_enable = disable_interrupts();
679         reset_4xx_watchdog();
680         if (re_enable) enable_interrupts();
681 }
682
683 void reset_4xx_watchdog(void)
684 {
685         /*
686          * Clear TSR(WIS) bit
687          */
688         mtspr(SPRN_TSR, 0x40000000);
689 }
690 #endif  /* CONFIG_WATCHDOG */
691
692 /*
693  * Initializes on-chip ethernet controllers.
694  * to override, implement board_eth_init()
695  */
696 int cpu_eth_init(bd_t *bis)
697 {
698 #if defined(CONFIG_PPC4xx_EMAC)
699         ppc_4xx_eth_initialize(bis);
700 #endif
701         return 0;
702 }