powerpc, 8xx: remove support for 8xx
[oweals/u-boot.git] / arch / powerpc / lib / immap.c
1 /*
2  * (C) Copyright 2000-2003
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 /*
9  * MPC8xx/MPC8260 Internal Memory Map Functions
10  */
11
12 #include <common.h>
13 #include <command.h>
14
15 #if defined(CONFIG_MPC8260)
16
17 #include <asm/immap_8260.h>
18 #include <asm/cpm_8260.h>
19 #include <asm/iopin_8260.h>
20
21 DECLARE_GLOBAL_DATA_PTR;
22
23 static void
24 unimplemented ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
25 {
26         printf ("Sorry, but the '%s' command has not been implemented\n",
27                 cmdtp->name);
28 }
29
30 int
31 do_siuinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
32 {
33         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
34
35 #if defined(CONFIG_MPC8260)
36         volatile sysconf8260_t *sc = &immap->im_siu_conf;
37 #endif
38
39         printf ("SIUMCR= %08x SYPCR = %08x\n", sc->sc_siumcr, sc->sc_sypcr);
40 #if defined(CONFIG_MPC8260)
41         printf ("BCR   = %08x\n", sc->sc_bcr);
42         printf ("P_ACR =       %02x P_ALRH= %08x P_ALRL= %08x\n",
43                 sc->sc_ppc_acr, sc->sc_ppc_alrh, sc->sc_ppc_alrl);
44         printf ("L_ACR =       %02x L_ALRH= %08x L_ALRL= %08x\n",
45                 sc->sc_lcl_acr, sc->sc_lcl_alrh, sc->sc_lcl_alrl);
46         printf ("PTESR1= %08x PTESR2= %08x\n", sc->sc_tescr1, sc->sc_tescr2);
47         printf ("LTESR1= %08x LTESR2= %08x\n", sc->sc_ltescr1, sc->sc_ltescr2);
48         printf ("PDTEA = %08x PDTEM =       %02x\n", sc->sc_pdtea, sc->sc_pdtem);
49         printf ("LDTEA = %08x LDTEM =       %02x\n", sc->sc_ldtea, sc->sc_ldtem);
50 #endif
51         return 0;
52 }
53
54 int
55 do_memcinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
56 {
57         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
58
59 #if defined(CONFIG_MPC8260)
60         volatile memctl8260_t *memctl = &immap->im_memctl;
61         int nbanks = 12;
62 #endif
63         volatile uint *p = &memctl->memc_br0;
64         int i;
65
66         for (i = 0; i < nbanks; i++, p += 2) {
67                 if (i < 10) {
68                         printf ("BR%d   = %08x OR%d   = %08x\n",
69                                 i, p[0], i, p[1]);
70                 } else {
71                         printf ("BR%d  = %08x OR%d  = %08x\n",
72                                 i, p[0], i, p[1]);
73                 }
74         }
75
76         printf ("MAR   = %08x", memctl->memc_mar);
77 #if defined(CONFIG_MPC8260)
78         putc ('\n');
79 #endif
80         printf ("MAMR  = %08x MBMR  = %08x",
81                 memctl->memc_mamr, memctl->memc_mbmr);
82 #if defined(CONFIG_MPC8260)
83         printf (" MCMR  = %08x\n", memctl->memc_mcmr);
84 #endif
85         printf ("MPTPR =     %04x MDR   = %08x\n",
86                 memctl->memc_mptpr, memctl->memc_mdr);
87 #if defined(CONFIG_MPC8260)
88         printf ("PSDMR = %08x LSDMR = %08x\n",
89                 memctl->memc_psdmr, memctl->memc_lsdmr);
90         printf ("PURT  =       %02x PSRT  =       %02x\n",
91                 memctl->memc_purt, memctl->memc_psrt);
92         printf ("LURT  =       %02x LSRT  =       %02x\n",
93                 memctl->memc_lurt, memctl->memc_lsrt);
94         printf ("IMMR  = %08x\n", memctl->memc_immr);
95 #endif
96         return 0;
97 }
98
99 int
100 do_sitinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
101 {
102         unimplemented (cmdtp, flag, argc, argv);
103         return 0;
104 }
105
106 #ifdef CONFIG_MPC8260
107 int
108 do_icinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
109 {
110         unimplemented (cmdtp, flag, argc, argv);
111         return 0;
112 }
113 #endif
114
115 int
116 do_carinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
117 {
118         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
119
120 #if defined(CONFIG_MPC8260)
121         volatile car8260_t *car = &immap->im_clkrst;
122 #endif
123
124 #if defined(CONFIG_MPC8260)
125         printf ("SCCR  = %08x\n", car->car_sccr);
126         printf ("SCMR  = %08x\n", car->car_scmr);
127         printf ("RSR   = %08x\n", car->car_rsr);
128         printf ("RMR   = %08x\n", car->car_rmr);
129 #endif
130         return 0;
131 }
132
133 static int counter;
134
135 static void
136 header(void)
137 {
138         char *data = "\
139        --------------------------------        --------------------------------\
140        00000000001111111111222222222233        00000000001111111111222222222233\
141        01234567890123456789012345678901        01234567890123456789012345678901\
142        --------------------------------        --------------------------------\
143     ";
144         int i;
145
146         if (counter % 2)
147                 putc('\n');
148         counter = 0;
149
150         for (i = 0; i < 4; i++, data += 79)
151                 printf("%.79s\n", data);
152 }
153
154 static void binary (char *label, uint value, int nbits)
155 {
156         uint mask = 1 << (nbits - 1);
157         int i, second = (counter++ % 2);
158
159         if (second)
160                 putc (' ');
161         puts (label);
162         for (i = 32 + 1; i != nbits; i--)
163                 putc (' ');
164
165         while (mask != 0) {
166                 if (value & mask)
167                         putc ('1');
168                 else
169                         putc ('0');
170                 mask >>= 1;
171         }
172
173         if (second)
174                 putc ('\n');
175 }
176
177 #if defined(CONFIG_MPC8260)
178 #define PA_NBITS        32
179 #define PA_NB_ODR       32
180 #define PB_NBITS        28
181 #define PB_NB_ODR       28
182 #define PC_NBITS        32
183 #define PD_NBITS        28
184 #endif
185
186 int
187 do_iopinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
188 {
189         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
190
191 #if defined(CONFIG_MPC8260)
192         volatile iop8260_t *iop = &immap->im_ioport;
193         volatile uint *l, *r;
194 #endif
195         volatile uint *R;
196
197         counter = 0;
198         header ();
199
200         /*
201          * Ports A & B
202          */
203
204 #if defined(CONFIG_MPC8260)
205         l = &iop->iop_pdira;
206         R = &iop->iop_pdirb;
207 #endif
208         binary ("PA_DIR", *l++, PA_NBITS);
209         binary ("PB_DIR", *R++, PB_NBITS);
210         binary ("PA_PAR", *l++, PA_NBITS);
211         binary ("PB_PAR", *R++, PB_NBITS);
212 #if defined(CONFIG_MPC8260)
213         binary ("PA_SOR", *l++, PA_NBITS);
214         binary ("PB_SOR", *R++, PB_NBITS);
215 #endif
216         binary ("PA_ODR", *l++, PA_NB_ODR);
217         binary ("PB_ODR", *R++, PB_NB_ODR);
218         binary ("PA_DAT", *l++, PA_NBITS);
219         binary ("PB_DAT", *R++, PB_NBITS);
220
221         header ();
222
223         /*
224          * Ports C & D
225          */
226
227 #if defined(CONFIG_MPC8260)
228         l = &iop->iop_pdirc;
229         r = &iop->iop_pdird;
230 #endif
231         binary ("PC_DIR", *l++, PC_NBITS);
232         binary ("PD_DIR", *r++, PD_NBITS);
233         binary ("PC_PAR", *l++, PC_NBITS);
234         binary ("PD_PAR", *r++, PD_NBITS);
235 #if defined(CONFIG_MPC8260)
236         binary ("PC_SOR", *l++, PC_NBITS);
237         binary ("PD_SOR", *r++, PD_NBITS);
238         binary ("PC_ODR", *l++, PC_NBITS);
239         binary ("PD_ODR", *r++, PD_NBITS);
240 #endif
241         binary ("PC_DAT", *l++, PC_NBITS);
242         binary ("PD_DAT", *r++, PD_NBITS);
243
244         header ();
245         return 0;
246 }
247
248 /*
249  * set the io pins
250  * this needs a clean up for smaller tighter code
251  * use *uint and set the address based on cmd + port
252  */
253 int
254 do_iopset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
255 {
256         uint rcode = 0;
257         iopin_t iopin;
258         static uint port = 0;
259         static uint pin = 0;
260         static uint value = 0;
261         static enum {
262                 DIR,
263                 PAR,
264                 SOR,
265                 ODR,
266                 DAT,
267         } cmd = DAT;
268
269         if (argc != 5) {
270                 puts ("iopset PORT PIN CMD VALUE\n");
271                 return 1;
272         }
273         port = argv[1][0] - 'A';
274         if (port > 3)
275                 port -= 0x20;
276         if (port > 3)
277                 rcode = 1;
278         pin = simple_strtol (argv[2], NULL, 10);
279         if (pin > 31)
280                 rcode = 1;
281
282
283         switch (argv[3][0]) {
284         case 'd':
285                 if (argv[3][1] == 'a')
286                         cmd = DAT;
287                 else if (argv[3][1] == 'i')
288                         cmd = DIR;
289                 else
290                         rcode = 1;
291                 break;
292         case 'p':
293                 cmd = PAR;
294                 break;
295         case 'o':
296                 cmd = ODR;
297                 break;
298         case 's':
299                 cmd = SOR;
300                 break;
301         default:
302                 printf ("iopset: unknown command %s\n", argv[3]);
303                 rcode = 1;
304         }
305         if (argv[4][0] == '1')
306                 value = 1;
307         else if (argv[4][0] == '0')
308                 value = 0;
309         else
310                 rcode = 1;
311         if (rcode == 0) {
312                 iopin.port = port;
313                 iopin.pin = pin;
314                 iopin.flag = 0;
315                 switch (cmd) {
316                 case DIR:
317                         if (value)
318                                 iopin_set_out (&iopin);
319                         else
320                                 iopin_set_in (&iopin);
321                         break;
322                 case PAR:
323                         if (value)
324                                 iopin_set_ded (&iopin);
325                         else
326                                 iopin_set_gen (&iopin);
327                         break;
328                 case SOR:
329                         if (value)
330                                 iopin_set_opt2 (&iopin);
331                         else
332                                 iopin_set_opt1 (&iopin);
333                         break;
334                 case ODR:
335                         if (value)
336                                 iopin_set_odr (&iopin);
337                         else
338                                 iopin_set_act (&iopin);
339                         break;
340                 case DAT:
341                         if (value)
342                                 iopin_set_high (&iopin);
343                         else
344                                 iopin_set_low (&iopin);
345                         break;
346                 }
347
348         }
349         return rcode;
350 }
351
352 int
353 do_dmainfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
354 {
355         unimplemented (cmdtp, flag, argc, argv);
356         return 0;
357 }
358
359 int
360 do_fccinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
361 {
362         unimplemented (cmdtp, flag, argc, argv);
363         return 0;
364 }
365
366 static void prbrg (int n, uint val)
367 {
368         uint extc = (val >> 14) & 3;
369         uint cd = (val & CPM_BRG_CD_MASK) >> 1;
370         uint div16 = (val & CPM_BRG_DIV16) != 0;
371
372 #if defined(CONFIG_MPC8260)
373         ulong clock = gd->arch.brg_clk;
374 #endif
375
376         printf ("BRG%d:", n);
377
378         if (val & CPM_BRG_RST)
379                 puts (" RESET");
380         else
381                 puts ("      ");
382
383         if (val & CPM_BRG_EN)
384                 puts ("  ENABLED");
385         else
386                 puts (" DISABLED");
387
388         printf (" EXTC=%d", extc);
389
390         if (val & CPM_BRG_ATB)
391                 puts (" ATB");
392         else
393                 puts ("    ");
394
395         printf (" DIVIDER=%4d", cd);
396         if (extc == 0 && cd != 0) {
397                 uint baudrate;
398
399                 if (div16)
400                         baudrate = (clock / 16) / (cd + 1);
401                 else
402                         baudrate = clock / (cd + 1);
403
404                 printf ("=%6d bps", baudrate);
405         } else {
406                 puts ("           ");
407         }
408
409         if (val & CPM_BRG_DIV16)
410                 puts (" DIV16");
411         else
412                 puts ("      ");
413
414         putc ('\n');
415 }
416
417 int
418 do_brginfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
419 {
420         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
421
422 #if defined(CONFIG_MPC8260)
423         volatile uint *p = &immap->im_brgc1;
424 #endif
425         int i = 1;
426
427         while (i <= 4)
428                 prbrg (i++, *p++);
429
430 #if defined(CONFIG_MPC8260)
431         p = &immap->im_brgc5;
432         while (i <= 8)
433                 prbrg (i++, *p++);
434 #endif
435         return 0;
436 }
437
438 int
439 do_i2cinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
440 {
441         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
442
443 #if defined(CONFIG_MPC8260)
444         volatile i2c8260_t *i2c = &immap->im_i2c;
445         volatile iic_t *iip;
446         uint dpaddr;
447
448         dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];
449         if (dpaddr == 0)
450                 iip = NULL;
451         else
452                 iip = (iic_t *) & immap->im_dprambase[dpaddr];
453 #endif
454
455         printf ("I2MOD = %02x I2ADD = %02x\n", i2c->i2c_i2mod, i2c->i2c_i2add);
456         printf ("I2BRG = %02x I2COM = %02x\n", i2c->i2c_i2brg, i2c->i2c_i2com);
457         printf ("I2CER = %02x I2CMR = %02x\n", i2c->i2c_i2cer, i2c->i2c_i2cmr);
458
459         if (iip == NULL)
460                 puts ("i2c parameter ram not allocated\n");
461         else {
462                 printf ("RBASE = %08x TBASE = %08x\n",
463                         iip->iic_rbase, iip->iic_tbase);
464                 printf ("RFCR  =       %02x TFCR  =       %02x\n",
465                         iip->iic_rfcr, iip->iic_tfcr);
466                 printf ("MRBLR =     %04x\n", iip->iic_mrblr);
467                 printf ("RSTATE= %08x RDP   = %08x\n",
468                         iip->iic_rstate, iip->iic_rdp);
469                 printf ("RBPTR =     %04x RBC   =     %04x\n",
470                         iip->iic_rbptr, iip->iic_rbc);
471                 printf ("RXTMP = %08x\n", iip->iic_rxtmp);
472                 printf ("TSTATE= %08x TDP   = %08x\n",
473                         iip->iic_tstate, iip->iic_tdp);
474                 printf ("TBPTR =     %04x TBC   =     %04x\n",
475                         iip->iic_tbptr, iip->iic_tbc);
476                 printf ("TXTMP = %08x\n", iip->iic_txtmp);
477         }
478         return 0;
479 }
480
481 int
482 do_sccinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
483 {
484         unimplemented (cmdtp, flag, argc, argv);
485         return 0;
486 }
487
488 int
489 do_smcinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
490 {
491         unimplemented (cmdtp, flag, argc, argv);
492         return 0;
493 }
494
495 int
496 do_spiinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
497 {
498         unimplemented (cmdtp, flag, argc, argv);
499         return 0;
500 }
501
502 int
503 do_muxinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
504 {
505         unimplemented (cmdtp, flag, argc, argv);
506         return 0;
507 }
508
509 int
510 do_siinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
511 {
512         unimplemented (cmdtp, flag, argc, argv);
513         return 0;
514 }
515
516 int
517 do_mccinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
518 {
519         unimplemented (cmdtp, flag, argc, argv);
520         return 0;
521 }
522
523 /***************************************************/
524
525 U_BOOT_CMD(
526         siuinfo,        1,      1,      do_siuinfo,
527         "print System Interface Unit (SIU) registers",
528         ""
529 );
530
531 U_BOOT_CMD(
532         memcinfo,       1,      1,      do_memcinfo,
533         "print Memory Controller registers",
534         ""
535 );
536
537 U_BOOT_CMD(
538         sitinfo,        1,      1,      do_sitinfo,
539         "print System Integration Timers (SIT) registers",
540         ""
541 );
542
543 #ifdef CONFIG_MPC8260
544 U_BOOT_CMD(
545         icinfo, 1,      1,      do_icinfo,
546         "print Interrupt Controller registers",
547         ""
548 );
549 #endif
550
551 U_BOOT_CMD(
552         carinfo,        1,      1,      do_carinfo,
553         "print Clocks and Reset registers",
554         ""
555 );
556
557 U_BOOT_CMD(
558         iopinfo,        1,      1,      do_iopinfo,
559         "print I/O Port registers",
560         ""
561 );
562
563 U_BOOT_CMD(
564         iopset, 5,      0,      do_iopset,
565         "set I/O Port registers",
566         "PORT PIN CMD VALUE\nPORT: A-D, PIN: 0-31, CMD: [dat|dir|odr|sor], VALUE: 0|1"
567 );
568
569 U_BOOT_CMD(
570         dmainfo,        1,      1,      do_dmainfo,
571         "print SDMA/IDMA registers",
572         ""
573 );
574
575 U_BOOT_CMD(
576         fccinfo,        1,      1,      do_fccinfo,
577         "print FCC registers",
578         ""
579 );
580
581 U_BOOT_CMD(
582         brginfo,        1,      1,      do_brginfo,
583         "print Baud Rate Generator (BRG) registers",
584         ""
585 );
586
587 U_BOOT_CMD(
588         i2cinfo,        1,      1,      do_i2cinfo,
589         "print I2C registers",
590         ""
591 );
592
593 U_BOOT_CMD(
594         sccinfo,        1,      1,      do_sccinfo,
595         "print SCC registers",
596         ""
597 );
598
599 U_BOOT_CMD(
600         smcinfo,        1,      1,      do_smcinfo,
601         "print SMC registers",
602         ""
603 );
604
605 U_BOOT_CMD(
606         spiinfo,        1,      1,      do_spiinfo,
607         "print Serial Peripheral Interface (SPI) registers",
608         ""
609 );
610
611 U_BOOT_CMD(
612         muxinfo,        1,      1,      do_muxinfo,
613         "print CPM Multiplexing registers",
614         ""
615 );
616
617 U_BOOT_CMD(
618         siinfo, 1,      1,      do_siinfo,
619         "print Serial Interface (SI) registers",
620         ""
621 );
622
623 U_BOOT_CMD(
624         mccinfo,        1,      1,      do_mccinfo,
625         "print MCC registers",
626         ""
627 );
628
629 #endif