reginfo.c 9.7 KB

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