immap.c 12 KB

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