powerpc: Partialy restore core of mpc8xx
[platform/kernel/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 Internal Memory Map Functions
10  */
11
12 #include <common.h>
13 #include <command.h>
14
15 #if defined(CONFIG_8xx)
16
17 #include <asm/8xx_immap.h>
18 #include <commproc.h>
19 #include <asm/iopin_8xx.h>
20
21 DECLARE_GLOBAL_DATA_PTR;
22
23 int
24 do_siuinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
25 {
26         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
27
28         volatile sysconf8xx_t *sc = &immap->im_siu_conf;
29
30         printf ("SIUMCR= %08x SYPCR = %08x\n", sc->sc_siumcr, sc->sc_sypcr);
31         printf ("SWT   = %08x\n", sc->sc_swt);
32         printf ("SIPEND= %08x SIMASK= %08x\n", sc->sc_sipend, sc->sc_simask);
33         printf ("SIEL  = %08x SIVEC = %08x\n", sc->sc_siel, sc->sc_sivec);
34         printf ("TESR  = %08x SDCR  = %08x\n", sc->sc_tesr, sc->sc_sdcr);
35         return 0;
36 }
37
38 int
39 do_memcinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
40 {
41         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
42
43         volatile memctl8xx_t *memctl = &immap->im_memctl;
44         int nbanks = 8;
45         volatile uint *p = &memctl->memc_br0;
46         int i;
47
48         for (i = 0; i < nbanks; i++, p += 2) {
49                 if (i < 10) {
50                         printf ("BR%d   = %08x OR%d   = %08x\n",
51                                 i, p[0], i, p[1]);
52                 } else {
53                         printf ("BR%d  = %08x OR%d  = %08x\n",
54                                 i, p[0], i, p[1]);
55                 }
56         }
57
58         printf ("MAR   = %08x", memctl->memc_mar);
59         printf (" MCR   = %08x\n", memctl->memc_mcr);
60         printf ("MAMR  = %08x MBMR  = %08x",
61                 memctl->memc_mamr, memctl->memc_mbmr);
62         printf ("\nMSTAT =     %04x\n", memctl->memc_mstat);
63         printf ("MPTPR =     %04x MDR   = %08x\n",
64                 memctl->memc_mptpr, memctl->memc_mdr);
65         return 0;
66 }
67
68 int
69 do_carinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
70 {
71         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
72
73         volatile car8xx_t *car = &immap->im_clkrst;
74
75         printf ("SCCR  = %08x\n", car->car_sccr);
76         printf ("PLPRCR= %08x\n", car->car_plprcr);
77         printf ("RSR   = %08x\n", car->car_rsr);
78         return 0;
79 }
80
81 static int counter;
82
83 static void
84 header(void)
85 {
86         char *data = "\
87        --------------------------------        --------------------------------\
88        00000000001111111111222222222233        00000000001111111111222222222233\
89        01234567890123456789012345678901        01234567890123456789012345678901\
90        --------------------------------        --------------------------------\
91     ";
92         int i;
93
94         if (counter % 2)
95                 putc('\n');
96         counter = 0;
97
98         for (i = 0; i < 4; i++, data += 79)
99                 printf("%.79s\n", data);
100 }
101
102 static void binary (char *label, uint value, int nbits)
103 {
104         uint mask = 1 << (nbits - 1);
105         int i, second = (counter++ % 2);
106
107         if (second)
108                 putc (' ');
109         puts (label);
110         for (i = 32 + 1; i != nbits; i--)
111                 putc (' ');
112
113         while (mask != 0) {
114                 if (value & mask)
115                         putc ('1');
116                 else
117                         putc ('0');
118                 mask >>= 1;
119         }
120
121         if (second)
122                 putc ('\n');
123 }
124
125 #define PA_NBITS        16
126 #define PA_NB_ODR        8
127 #define PB_NBITS        18
128 #define PB_NB_ODR       16
129 #define PC_NBITS        12
130 #define PD_NBITS        13
131
132 int
133 do_iopinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
134 {
135         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
136
137         volatile iop8xx_t *iop = &immap->im_ioport;
138         volatile ushort *l, *r;
139         volatile uint *R;
140
141         counter = 0;
142         header ();
143
144         /*
145          * Ports A & B
146          */
147
148         l = &iop->iop_padir;
149         R = &immap->im_cpm.cp_pbdir;
150         binary ("PA_DIR", *l++, PA_NBITS);
151         binary ("PB_DIR", *R++, PB_NBITS);
152         binary ("PA_PAR", *l++, PA_NBITS);
153         binary ("PB_PAR", *R++, PB_NBITS);
154         binary ("PA_ODR", *l++, PA_NB_ODR);
155         binary ("PB_ODR", *R++, PB_NB_ODR);
156         binary ("PA_DAT", *l++, PA_NBITS);
157         binary ("PB_DAT", *R++, PB_NBITS);
158
159         header ();
160
161         /*
162          * Ports C & D
163          */
164
165         l = &iop->iop_pcdir;
166         r = &iop->iop_pddir;
167         binary ("PC_DIR", *l++, PC_NBITS);
168         binary ("PD_DIR", *r++, PD_NBITS);
169         binary ("PC_PAR", *l++, PC_NBITS);
170         binary ("PD_PAR", *r++, PD_NBITS);
171         binary ("PC_SO ", *l++, PC_NBITS);
172         binary ("      ", 0, 0);
173         r++;
174         binary ("PC_DAT", *l++, PC_NBITS);
175         binary ("PD_DAT", *r++, PD_NBITS);
176         binary ("PC_INT", *l++, PC_NBITS);
177
178         header ();
179         return 0;
180 }
181
182 /*
183  * set the io pins
184  * this needs a clean up for smaller tighter code
185  * use *uint and set the address based on cmd + port
186  */
187 int
188 do_iopset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
189 {
190         uint rcode = 0;
191         iopin_t iopin;
192         static uint port = 0;
193         static uint pin = 0;
194         static uint value = 0;
195         static enum {
196                 DIR,
197                 PAR,
198                 SOR,
199                 ODR,
200                 DAT,
201                 INT
202         } cmd = DAT;
203
204         if (argc != 5) {
205                 puts ("iopset PORT PIN CMD VALUE\n");
206                 return 1;
207         }
208         port = argv[1][0] - 'A';
209         if (port > 3)
210                 port -= 0x20;
211         if (port > 3)
212                 rcode = 1;
213         pin = simple_strtol (argv[2], NULL, 10);
214         if (pin > 31)
215                 rcode = 1;
216
217
218         switch (argv[3][0]) {
219         case 'd':
220                 if (argv[3][1] == 'a')
221                         cmd = DAT;
222                 else if (argv[3][1] == 'i')
223                         cmd = DIR;
224                 else
225                         rcode = 1;
226                 break;
227         case 'p':
228                 cmd = PAR;
229                 break;
230         case 'o':
231                 cmd = ODR;
232                 break;
233         case 's':
234                 cmd = SOR;
235                 break;
236         case 'i':
237                 cmd = INT;
238                 break;
239         default:
240                 printf ("iopset: unknown command %s\n", argv[3]);
241                 rcode = 1;
242         }
243         if (argv[4][0] == '1')
244                 value = 1;
245         else if (argv[4][0] == '0')
246                 value = 0;
247         else
248                 rcode = 1;
249         if (rcode == 0) {
250                 iopin.port = port;
251                 iopin.pin = pin;
252                 iopin.flag = 0;
253                 switch (cmd) {
254                 case DIR:
255                         if (value)
256                                 iopin_set_out (&iopin);
257                         else
258                                 iopin_set_in (&iopin);
259                         break;
260                 case PAR:
261                         if (value)
262                                 iopin_set_ded (&iopin);
263                         else
264                                 iopin_set_gen (&iopin);
265                         break;
266                 case SOR:
267                         if (value)
268                                 iopin_set_opt2 (&iopin);
269                         else
270                                 iopin_set_opt1 (&iopin);
271                         break;
272                 case ODR:
273                         if (value)
274                                 iopin_set_odr (&iopin);
275                         else
276                                 iopin_set_act (&iopin);
277                         break;
278                 case DAT:
279                         if (value)
280                                 iopin_set_high (&iopin);
281                         else
282                                 iopin_set_low (&iopin);
283                         break;
284                 case INT:
285                         if (value)
286                                 iopin_set_falledge (&iopin);
287                         else
288                                 iopin_set_anyedge (&iopin);
289                         break;
290                 }
291
292         }
293         return rcode;
294 }
295
296 static void prbrg (int n, uint val)
297 {
298         uint extc = (val >> 14) & 3;
299         uint cd = (val & CPM_BRG_CD_MASK) >> 1;
300         uint div16 = (val & CPM_BRG_DIV16) != 0;
301
302         ulong clock = gd->cpu_clk;
303
304         printf ("BRG%d:", n);
305
306         if (val & CPM_BRG_RST)
307                 puts (" RESET");
308         else
309                 puts ("      ");
310
311         if (val & CPM_BRG_EN)
312                 puts ("  ENABLED");
313         else
314                 puts (" DISABLED");
315
316         printf (" EXTC=%d", extc);
317
318         if (val & CPM_BRG_ATB)
319                 puts (" ATB");
320         else
321                 puts ("    ");
322
323         printf (" DIVIDER=%4d", cd);
324         if (extc == 0 && cd != 0) {
325                 uint baudrate;
326
327                 if (div16)
328                         baudrate = (clock / 16) / (cd + 1);
329                 else
330                         baudrate = clock / (cd + 1);
331
332                 printf ("=%6d bps", baudrate);
333         } else {
334                 puts ("           ");
335         }
336
337         if (val & CPM_BRG_DIV16)
338                 puts (" DIV16");
339         else
340                 puts ("      ");
341
342         putc ('\n');
343 }
344
345 int
346 do_brginfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
347 {
348         volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
349
350         volatile cpm8xx_t *cp = &immap->im_cpm;
351         volatile uint *p = &cp->cp_brgc1;
352         int i = 1;
353
354         while (i <= 4)
355                 prbrg (i++, *p++);
356
357         return 0;
358 }
359
360 /***************************************************/
361
362 U_BOOT_CMD(
363         siuinfo,        1,      1,      do_siuinfo,
364         "print System Interface Unit (SIU) registers",
365         ""
366 );
367
368 U_BOOT_CMD(
369         memcinfo,       1,      1,      do_memcinfo,
370         "print Memory Controller registers",
371         ""
372 );
373
374 U_BOOT_CMD(
375         carinfo,        1,      1,      do_carinfo,
376         "print Clocks and Reset registers",
377         ""
378 );
379
380 U_BOOT_CMD(
381         iopinfo,        1,      1,      do_iopinfo,
382         "print I/O Port registers",
383         ""
384 );
385
386 U_BOOT_CMD(
387         iopset, 5,      0,      do_iopset,
388         "set I/O Port registers",
389         "PORT PIN CMD VALUE\nPORT: A-D, PIN: 0-31, CMD: [dat|dir|odr|sor], VALUE: 0|1"
390 );
391
392 U_BOOT_CMD(
393         brginfo,        1,      1,      do_brginfo,
394         "print Baud Rate Generator (BRG) registers",
395         ""
396 );
397 #endif