59de04a2d8a42c5d0273cd1d3fa3ff17dc36ab86
[platform/kernel/u-boot.git] / arch / powerpc / cpu / ppc4xx / reginfo.c
1 /*
2  *(C) Copyright 2005-2009 Netstal Maschinen AG
3  *    Bruno Hars (Bruno.Hars@netstal.com)
4  *    Niklaus Giger (Niklaus.Giger@netstal.com)
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  */
8
9 /*
10  * reginfo.c - register dump of HW-configuratin register for PPC4xx based board
11  */
12
13 #include <common.h>
14 #include <command.h>
15 #include <asm/processor.h>
16 #include <asm/io.h>
17 #include <asm/ppc4xx.h>
18 #include <asm/ppc4xx-uic.h>
19 #include <asm/ppc4xx-emac.h>
20
21 enum REGISTER_TYPE {
22         IDCR1,  /* Indirectly Accessed DCR via SDRAM0_CFGADDR/SDRAM0_CFGDATA */
23         IDCR2,  /* Indirectly Accessed DCR via EBC0_CFGADDR/EBC0_CFGDATA */
24         IDCR3,  /* Indirectly Accessed DCR via EBM0_CFGADDR/EBM0_CFGDATA */
25         IDCR4,  /* Indirectly Accessed DCR via PPM0_CFGADDR/PPM0_CFGDATA */
26         IDCR5,  /* Indirectly Accessed DCR via CPR0_CFGADDR/CPR0_CFGDATA */
27         IDCR6,  /* Indirectly Accessed DCR via SDR0_CFGADDR/SDR0_CFGDATA */
28         MM      /* Directly Accessed MMIO Register */
29 };
30
31 struct cpu_register {
32         char *name;
33         enum REGISTER_TYPE type;
34         u32 address;
35 };
36
37 /*
38  * PPC440EPx registers ordered for output
39  * name           type    addr            size
40  * -------------------------------------------
41  */
42
43 const struct cpu_register ppc4xx_reg[] = {
44         {"PB0CR",               IDCR2,  PB0CR},
45         {"PB0AP",               IDCR2,  PB0AP},
46         {"PB1CR",               IDCR2,  PB1CR},
47         {"PB1AP",               IDCR2,  PB1AP},
48         {"PB2CR",               IDCR2,  PB2CR},
49         {"PB2AP",               IDCR2,  PB2AP},
50         {"PB3CR",               IDCR2,  PB3CR},
51         {"PB3AP",               IDCR2,  PB3AP},
52
53         {"PB4CR",               IDCR2,  PB4CR},
54         {"PB4AP",               IDCR2,  PB4AP},
55 #if !defined(CONFIG_405EP)
56         {"PB5CR",               IDCR2,  PB5CR},
57         {"PB5AP",               IDCR2,  PB5AP},
58         {"PB6CR",               IDCR2,  PB6CR},
59         {"PB6AP",               IDCR2,  PB6AP},
60         {"PB7CR",               IDCR2,  PB7CR},
61         {"PB7AP",               IDCR2,  PB7AP},
62 #endif
63
64         {"PBEAR",               IDCR2,  PBEAR},
65 #if defined(CONFIG_405EP) || defined (CONFIG_405GP)
66         {"PBESR0",              IDCR2,  PBESR0},
67         {"PBESR1",              IDCR2,  PBESR1},
68 #endif
69         {"EBC0_CFG",            IDCR2,  EBC0_CFG},
70
71 #ifdef CONFIG_405GP
72         {"SDRAM0_BESR0",        IDCR1,  SDRAM0_BESR0},
73         {"SDRAM0_BESRS0",       IDCR1,  SDRAM0_BESRS0},
74         {"SDRAM0_BESR1",        IDCR1,  SDRAM0_BESR1},
75         {"SDRAM0_BESRS1",       IDCR1,  SDRAM0_BESRS1},
76         {"SDRAM0_BEAR",         IDCR1,  SDRAM0_BEAR},
77         {"SDRAM0_CFG",          IDCR1,  SDRAM0_CFG},
78         {"SDRAM0_RTR",          IDCR1,  SDRAM0_RTR},
79         {"SDRAM0_PMIT",         IDCR1,  SDRAM0_PMIT},
80
81         {"SDRAM0_B0CR",         IDCR1,  SDRAM0_B0CR},
82         {"SDRAM0_B1CR",         IDCR1,  SDRAM0_B1CR},
83         {"SDRAM0_B2CR",         IDCR1,  SDRAM0_B2CR},
84         {"SDRAM0_B3CR",         IDCR1,  SDRAM0_B1CR},
85         {"SDRAM0_TR",           IDCR1,  SDRAM0_TR},
86         {"SDRAM0_ECCCFG",       IDCR1,  SDRAM0_B1CR},
87         {"SDRAM0_ECCESR",       IDCR1,  SDRAM0_ECCESR},
88
89
90 #endif
91
92 #ifdef CONFIG_440EPX
93         {"SDR0_SDSTP0",         IDCR6,  SDR0_SDSTP0},
94         {"SDR0_SDSTP1",         IDCR6,  SDR0_SDSTP1},
95         {"SDR0_SDSTP2",         IDCR6,  SDR0_SDSTP2},
96         {"SDR0_SDSTP3",         IDCR6,  SDR0_SDSTP3},
97         {"SDR0_CUST0",          IDCR6,  SDR0_CUST0},
98         {"SDR0_CUST1",          IDCR6,  SDR0_CUST1},
99         {"SDR0_EBC",            IDCR6,  SDR0_EBC},
100         {"SDR0_AMP0",           IDCR6,  SDR0_AMP0},
101         {"SDR0_AMP1",           IDCR6,  SDR0_AMP1},
102         {"SDR0_CP440",          IDCR6,  SDR0_CP440},
103         {"SDR0_CRYP0",          IDCR6,  SDR0_CRYP0},
104         {"SDR0_DDRCFG",         IDCR6,  SDR0_DDRCFG},
105         {"SDR0_EMAC0RXST",      IDCR6,  SDR0_EMAC0RXST},
106         {"SDR0_EMAC0TXST",      IDCR6,  SDR0_EMAC0TXST},
107         {"SDR0_MFR",            IDCR6,  SDR0_MFR},
108         {"SDR0_PCI0",           IDCR6,  SDR0_PCI0},
109         {"SDR0_PFC0",           IDCR6,  SDR0_PFC0},
110         {"SDR0_PFC1",           IDCR6,  SDR0_PFC1},
111         {"SDR0_PFC2",           IDCR6,  SDR0_PFC2},
112         {"SDR0_PFC4",           IDCR6,  SDR0_PFC4},
113         {"SDR0_UART0",          IDCR6,  SDR0_UART0},
114         {"SDR0_UART1",          IDCR6,  SDR0_UART1},
115         {"SDR0_UART2",          IDCR6,  SDR0_UART2},
116         {"SDR0_UART3",          IDCR6,  SDR0_UART3},
117         {"DDR0_02",             IDCR1,  DDR0_02},
118         {"DDR0_00",             IDCR1,  DDR0_00},
119         {"DDR0_01",             IDCR1,  DDR0_01},
120         {"DDR0_03",             IDCR1,  DDR0_03},
121         {"DDR0_04",             IDCR1,  DDR0_04},
122         {"DDR0_05",             IDCR1,  DDR0_05},
123         {"DDR0_06",             IDCR1,  DDR0_06},
124         {"DDR0_07",             IDCR1,  DDR0_07},
125         {"DDR0_08",             IDCR1,  DDR0_08},
126         {"DDR0_09",             IDCR1,  DDR0_09},
127         {"DDR0_10",             IDCR1,  DDR0_10},
128         {"DDR0_11",             IDCR1,  DDR0_11},
129         {"DDR0_12",             IDCR1,  DDR0_12},
130         {"DDR0_14",             IDCR1,  DDR0_14},
131         {"DDR0_17",             IDCR1,  DDR0_17},
132         {"DDR0_18",             IDCR1,  DDR0_18},
133         {"DDR0_19",             IDCR1,  DDR0_19},
134         {"DDR0_20",             IDCR1,  DDR0_20},
135         {"DDR0_21",             IDCR1,  DDR0_21},
136         {"DDR0_22",             IDCR1,  DDR0_22},
137         {"DDR0_23",             IDCR1,  DDR0_23},
138         {"DDR0_24",             IDCR1,  DDR0_24},
139         {"DDR0_25",             IDCR1,  DDR0_25},
140         {"DDR0_26",             IDCR1,  DDR0_26},
141         {"DDR0_27",             IDCR1,  DDR0_27},
142         {"DDR0_28",             IDCR1,  DDR0_28},
143         {"DDR0_31",             IDCR1,  DDR0_31},
144         {"DDR0_32",             IDCR1,  DDR0_32},
145         {"DDR0_33",             IDCR1,  DDR0_33},
146         {"DDR0_34",             IDCR1,  DDR0_34},
147         {"DDR0_35",             IDCR1,  DDR0_35},
148         {"DDR0_36",             IDCR1,  DDR0_36},
149         {"DDR0_37",             IDCR1,  DDR0_37},
150         {"DDR0_38",             IDCR1,  DDR0_38},
151         {"DDR0_39",             IDCR1,  DDR0_39},
152         {"DDR0_40",             IDCR1,  DDR0_40},
153         {"DDR0_41",             IDCR1,  DDR0_41},
154         {"DDR0_42",             IDCR1,  DDR0_42},
155         {"DDR0_43",             IDCR1,  DDR0_43},
156         {"DDR0_44",             IDCR1,  DDR0_44},
157         {"CPR0_ICFG",           IDCR5,  CPR0_ICFG},
158         {"CPR0_MALD",           IDCR5,  CPR0_MALD},
159         {"CPR0_OPBD00",         IDCR5,  CPR0_OPBD0},
160         {"CPR0_PERD0",          IDCR5,  CPR0_PERD},
161         {"CPR0_PLLC0",          IDCR5,  CPR0_PLLC},
162         {"CPR0_PLLD0",          IDCR5,  CPR0_PLLD},
163         {"CPR0_PRIMAD0",        IDCR5,  CPR0_PRIMAD0},
164         {"CPR0_PRIMBD0",        IDCR5,  CPR0_PRIMBD0},
165         {"CPR0_SPCID",          IDCR5,  CPR0_SPCID},
166         {"SPI0_MODE",           MM,     SPI0_MODE},
167         {"IIC0_CLKDIV",         MM,     PCIL0_PMM1MA},
168         {"PCIL0_PMM0MA",        MM,     PCIL0_PMM0MA},
169         {"PCIL0_PMM1MA",        MM,     PCIL0_PMM1MA},
170         {"PCIL0_PTM1LA",        MM,     PCIL0_PMM1MA},
171         {"PCIL0_PTM1MS",        MM,     PCIL0_PTM1MS},
172         {"PCIL0_PTM2LA",        MM,     PCIL0_PMM1MA},
173         {"PCIL0_PTM2MS",        MM,     PCIL0_PTM2MS},
174         {"ZMII0_FER",           MM,     ZMII0_FER},
175         {"ZMII0_SSR",           MM,     ZMII0_SSR},
176         {"EMAC0_IPGVR",         MM,     EMAC0_IPGVR},
177         {"EMAC0_MR1",           MM,     EMAC0_MR1},
178         {"EMAC0_PTR",           MM,     EMAC0_PTR},
179         {"EMAC0_RWMR",          MM,     EMAC0_RWMR},
180         {"EMAC0_STACR",         MM,     EMAC0_STACR},
181         {"EMAC0_TMR0",          MM,     EMAC0_TMR0},
182         {"EMAC0_TMR1",          MM,     EMAC0_TMR1},
183         {"EMAC0_TRTR",          MM,     EMAC0_TRTR},
184         {"EMAC1_MR1",           MM,     EMAC1_MR1},
185         {"GPIO0_OR",            MM,     GPIO0_OR},
186         {"GPIO1_OR",            MM,     GPIO1_OR},
187         {"GPIO0_TCR",           MM,     GPIO0_TCR},
188         {"GPIO1_TCR",           MM,     GPIO1_TCR},
189         {"GPIO0_ODR",           MM,     GPIO0_ODR},
190         {"GPIO1_ODR",           MM,     GPIO1_ODR},
191         {"GPIO0_OSRL",          MM,     GPIO0_OSRL},
192         {"GPIO0_OSRH",          MM,     GPIO0_OSRH},
193         {"GPIO1_OSRL",          MM,     GPIO1_OSRL},
194         {"GPIO1_OSRH",          MM,     GPIO1_OSRH},
195         {"GPIO0_TSRL",          MM,     GPIO0_TSRL},
196         {"GPIO0_TSRH",          MM,     GPIO0_TSRH},
197         {"GPIO1_TSRL",          MM,     GPIO1_TSRL},
198         {"GPIO1_TSRH",          MM,     GPIO1_TSRH},
199         {"GPIO0_IR",            MM,     GPIO0_IR},
200         {"GPIO1_IR",            MM,     GPIO1_IR},
201         {"GPIO0_ISR1L",         MM,     GPIO0_ISR1L},
202         {"GPIO0_ISR1H",         MM,     GPIO0_ISR1H},
203         {"GPIO1_ISR1L",         MM,     GPIO1_ISR1L},
204         {"GPIO1_ISR1H",         MM,     GPIO1_ISR1H},
205         {"GPIO0_ISR2L",         MM,     GPIO0_ISR2L},
206         {"GPIO0_ISR2H",         MM,     GPIO0_ISR2H},
207         {"GPIO1_ISR2L",         MM,     GPIO1_ISR2L},
208         {"GPIO1_ISR2H",         MM,     GPIO1_ISR2H},
209         {"GPIO0_ISR3L",         MM,     GPIO0_ISR3L},
210         {"GPIO0_ISR3H",         MM,     GPIO0_ISR3H},
211         {"GPIO1_ISR3L",         MM,     GPIO1_ISR3L},
212         {"GPIO1_ISR3H",         MM,     GPIO1_ISR3H},
213         {"SDR0_USB2PHY0CR",     IDCR6,  SDR0_USB2PHY0CR},
214         {"SDR0_USB2H0CR",       IDCR6,  SDR0_USB2H0CR},
215         {"SDR0_USB2D0CR",       IDCR6,  SDR0_USB2D0CR},
216 #endif
217 };
218
219 /*
220  * CPU Register dump of PPC4xx HW configuration registers
221  * Output: first all DCR-registers, then in order of struct ppc4xx_reg
222  */
223 #define PRINT_DCR(dcr)  printf("0x%08x %-16s: 0x%08x\n", dcr,#dcr, mfdcr(dcr));
224
225 void ppc4xx_reginfo(void)
226 {
227         unsigned int i;
228         unsigned int n;
229         u32 value;
230         enum REGISTER_TYPE type;
231 #if defined (CONFIG_405EP)
232         printf("Dump PPC405EP HW configuration registers\n\n");
233 #elif CONFIG_405GP
234         printf ("Dump 405GP HW configuration registers\n\n");
235 #elif CONFIG_440EPX
236         printf("Dump PPC440EPx HW configuration registers\n\n");
237 #endif
238         printf("MSR: 0x%08x\n", mfmsr());
239
240         printf ("\nUniversal Interrupt Controller Regs\n");
241         PRINT_DCR(UIC0SR);
242         PRINT_DCR(UIC0ER);
243         PRINT_DCR(UIC0CR);
244         PRINT_DCR(UIC0PR);
245         PRINT_DCR(UIC0TR);
246         PRINT_DCR(UIC0MSR);
247         PRINT_DCR(UIC0VR);
248         PRINT_DCR(UIC0VCR);
249
250 #if (UIC_MAX > 1)
251         PRINT_DCR(UIC2SR);
252         PRINT_DCR(UIC2ER);
253         PRINT_DCR(UIC2CR);
254         PRINT_DCR(UIC2PR);
255         PRINT_DCR(UIC2TR);
256         PRINT_DCR(UIC2MSR);
257         PRINT_DCR(UIC2VR);
258         PRINT_DCR(UIC2VCR);
259 #endif
260
261 #if (UIC_MAX > 2)
262         PRINT_DCR(UIC2SR);
263         PRINT_DCR(UIC2ER);
264         PRINT_DCR(UIC2CR);
265         PRINT_DCR(UIC2PR);
266         PRINT_DCR(UIC2TR);
267         PRINT_DCR(UIC2MSR);
268         PRINT_DCR(UIC2VR);
269         PRINT_DCR(UIC2VCR);
270 #endif
271
272 #if (UIC_MAX > 3)
273         PRINT_DCR(UIC3SR);
274         PRINT_DCR(UIC3ER);
275         PRINT_DCR(UIC3CR);
276         PRINT_DCR(UIC3PR);
277         PRINT_DCR(UIC3TR);
278         PRINT_DCR(UIC3MSR);
279         PRINT_DCR(UIC3VR);
280         PRINT_DCR(UIC3VCR);
281 #endif
282
283 #if defined (CONFIG_405EP) || defined (CONFIG_405GP)
284         printf ("\n\nDMA Channels\n");
285         PRINT_DCR(DMASR);
286         PRINT_DCR(DMASGC);
287         PRINT_DCR(DMAADR);
288
289         PRINT_DCR(DMACR0);
290         PRINT_DCR(DMACT0);
291         PRINT_DCR(DMADA0);
292         PRINT_DCR(DMASA0);
293         PRINT_DCR(DMASB0);
294
295         PRINT_DCR(DMACR1);
296         PRINT_DCR(DMACT1);
297         PRINT_DCR(DMADA1);
298         PRINT_DCR(DMASA1);
299         PRINT_DCR(DMASB1);
300
301         PRINT_DCR(DMACR2);
302         PRINT_DCR(DMACT2);
303         PRINT_DCR(DMADA2);
304         PRINT_DCR(DMASA2);
305         PRINT_DCR(DMASB2);
306
307         PRINT_DCR(DMACR3);
308         PRINT_DCR(DMACT3);
309         PRINT_DCR(DMADA3);
310         PRINT_DCR(DMASA3);
311         PRINT_DCR(DMASB3);
312 #endif
313
314         printf ("\n\nVarious HW-Configuration registers\n");
315 #if defined (CONFIG_440EPX)
316         PRINT_DCR(MAL0_CFG);
317         PRINT_DCR(CPM0_ER);
318         PRINT_DCR(CPM1_ER);
319         PRINT_DCR(PLB4A0_ACR);
320         PRINT_DCR(PLB4A1_ACR);
321         PRINT_DCR(PLB3A0_ACR);
322         PRINT_DCR(OPB2PLB40_BCTRL);
323         PRINT_DCR(P4P3BO0_CFG);
324 #endif
325         n = ARRAY_SIZE(ppc4xx_reg);
326         for (i = 0; i < n; i++) {
327                 value = 0;
328                 type = ppc4xx_reg[i].type;
329                 switch (type) {
330                 case IDCR1:     /* Indirect via SDRAM0_CFGADDR/DDR0_CFGDATA */
331                         mtdcr(SDRAM0_CFGADDR, ppc4xx_reg[i].address);
332                         value = mfdcr(SDRAM0_CFGDATA);
333                         break;
334                 case IDCR2:     /* Indirect via EBC0_CFGADDR/EBC0_CFGDATA */
335                         mtdcr(EBC0_CFGADDR, ppc4xx_reg[i].address);
336                         value = mfdcr(EBC0_CFGDATA);
337                         break;
338                 case IDCR5:     /* Indirect via CPR0_CFGADDR/CPR0_CFGDATA */
339                         mtdcr(CPR0_CFGADDR, ppc4xx_reg[i].address);
340                         value = mfdcr(CPR0_CFGDATA);
341                         break;
342                 case IDCR6:     /* Indirect via SDR0_CFGADDR/SDR0_CFGDATA */
343                         mtdcr(SDR0_CFGADDR, ppc4xx_reg[i].address);
344                         value = mfdcr(SDR0_CFGDATA);
345                         break;
346                 case MM:        /* Directly Accessed MMIO Register */
347                         value = in_be32((const volatile unsigned __iomem *)
348                                 ppc4xx_reg[i].address);
349                         break;
350                 default:
351                         printf("\nERROR: struct entry %d: unknown register"
352                                 "type\n", i);
353                         break;
354                 }
355                 printf("0x%08x %-16s: 0x%08x\n",ppc4xx_reg[i].address,
356                         ppc4xx_reg[i].name, value);
357         }
358 }