mfsl.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2007 Michal Simek
  4. *
  5. * Michal SIMEK <monstr@monstr.eu>
  6. */
  7. /*
  8. * Microblaze FSL support
  9. */
  10. #include <common.h>
  11. #include <config.h>
  12. #include <command.h>
  13. #include <asm/asm.h>
  14. int do_frd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  15. {
  16. unsigned int fslnum;
  17. unsigned int num;
  18. unsigned int blocking;
  19. if (argc < 2)
  20. return CMD_RET_USAGE;
  21. fslnum = (unsigned int)hextoul(argv[1], NULL);
  22. blocking = (unsigned int)hextoul(argv[2], NULL);
  23. if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
  24. puts ("Bad number of FSL\n");
  25. return CMD_RET_USAGE;
  26. }
  27. switch (fslnum) {
  28. #if (XILINX_FSL_NUMBER > 0)
  29. case 0:
  30. switch (blocking) {
  31. case 0: NGET (num, 0);
  32. break;
  33. case 1: NCGET (num, 0);
  34. break;
  35. case 2: GET (num, 0);
  36. break;
  37. case 3: CGET (num, 0);
  38. break;
  39. default:
  40. return 2;
  41. }
  42. break;
  43. #endif
  44. #if (XILINX_FSL_NUMBER > 1)
  45. case 1:
  46. switch (blocking) {
  47. case 0: NGET (num, 1);
  48. break;
  49. case 1: NCGET (num, 1);
  50. break;
  51. case 2: GET (num, 1);
  52. break;
  53. case 3: CGET (num, 1);
  54. break;
  55. default:
  56. return 2;
  57. }
  58. break;
  59. #endif
  60. #if (XILINX_FSL_NUMBER > 2)
  61. case 2:
  62. switch (blocking) {
  63. case 0: NGET (num, 2);
  64. break;
  65. case 1: NCGET (num, 2);
  66. break;
  67. case 2: GET (num, 2);
  68. break;
  69. case 3: CGET (num, 2);
  70. break;
  71. default:
  72. return 2;
  73. }
  74. break;
  75. #endif
  76. #if (XILINX_FSL_NUMBER > 3)
  77. case 3:
  78. switch (blocking) {
  79. case 0: NGET (num, 3);
  80. break;
  81. case 1: NCGET (num, 3);
  82. break;
  83. case 2: GET (num, 3);
  84. break;
  85. case 3: CGET (num, 3);
  86. break;
  87. default:
  88. return 2;
  89. }
  90. break;
  91. #endif
  92. #if (XILINX_FSL_NUMBER > 4)
  93. case 4:
  94. switch (blocking) {
  95. case 0: NGET (num, 4);
  96. break;
  97. case 1: NCGET (num, 4);
  98. break;
  99. case 2: GET (num, 4);
  100. break;
  101. case 3: CGET (num, 4);
  102. break;
  103. default:
  104. return 2;
  105. }
  106. break;
  107. #endif
  108. #if (XILINX_FSL_NUMBER > 5)
  109. case 5:
  110. switch (blocking) {
  111. case 0: NGET (num, 5);
  112. break;
  113. case 1: NCGET (num, 5);
  114. break;
  115. case 2: GET (num, 5);
  116. break;
  117. case 3: CGET (num, 5);
  118. break;
  119. default:
  120. return 2;
  121. }
  122. break;
  123. #endif
  124. #if (XILINX_FSL_NUMBER > 6)
  125. case 6:
  126. switch (blocking) {
  127. case 0: NGET (num, 6);
  128. break;
  129. case 1: NCGET (num, 6);
  130. break;
  131. case 2: GET (num, 6);
  132. break;
  133. case 3: CGET (num, 6);
  134. break;
  135. default:
  136. return 2;
  137. }
  138. break;
  139. #endif
  140. #if (XILINX_FSL_NUMBER > 7)
  141. case 7:
  142. switch (blocking) {
  143. case 0: NGET (num, 7);
  144. break;
  145. case 1: NCGET (num, 7);
  146. break;
  147. case 2: GET (num, 7);
  148. break;
  149. case 3: CGET (num, 7);
  150. break;
  151. default:
  152. return 2;
  153. }
  154. break;
  155. #endif
  156. default:
  157. return 1;
  158. }
  159. printf ("%01x: 0x%08x - %s %s read\n", fslnum, num,
  160. blocking < 2 ? "non blocking" : "blocking",
  161. ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
  162. return 0;
  163. }
  164. int do_fwr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  165. {
  166. unsigned int fslnum;
  167. unsigned int num;
  168. unsigned int blocking;
  169. if (argc < 3)
  170. return CMD_RET_USAGE;
  171. fslnum = (unsigned int)hextoul(argv[1], NULL);
  172. num = (unsigned int)hextoul(argv[2], NULL);
  173. blocking = (unsigned int)hextoul(argv[3], NULL);
  174. if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER)
  175. return CMD_RET_USAGE;
  176. switch (fslnum) {
  177. #if (XILINX_FSL_NUMBER > 0)
  178. case 0:
  179. switch (blocking) {
  180. case 0: NPUT (num, 0);
  181. break;
  182. case 1: NCPUT (num, 0);
  183. break;
  184. case 2: PUT (num, 0);
  185. break;
  186. case 3: CPUT (num, 0);
  187. break;
  188. default:
  189. return 2;
  190. }
  191. break;
  192. #endif
  193. #if (XILINX_FSL_NUMBER > 1)
  194. case 1:
  195. switch (blocking) {
  196. case 0: NPUT (num, 1);
  197. break;
  198. case 1: NCPUT (num, 1);
  199. break;
  200. case 2: PUT (num, 1);
  201. break;
  202. case 3: CPUT (num, 1);
  203. break;
  204. default:
  205. return 2;
  206. }
  207. break;
  208. #endif
  209. #if (XILINX_FSL_NUMBER > 2)
  210. case 2:
  211. switch (blocking) {
  212. case 0: NPUT (num, 2);
  213. break;
  214. case 1: NCPUT (num, 2);
  215. break;
  216. case 2: PUT (num, 2);
  217. break;
  218. case 3: CPUT (num, 2);
  219. break;
  220. default:
  221. return 2;
  222. }
  223. break;
  224. #endif
  225. #if (XILINX_FSL_NUMBER > 3)
  226. case 3:
  227. switch (blocking) {
  228. case 0: NPUT (num, 3);
  229. break;
  230. case 1: NCPUT (num, 3);
  231. break;
  232. case 2: PUT (num, 3);
  233. break;
  234. case 3: CPUT (num, 3);
  235. break;
  236. default:
  237. return 2;
  238. }
  239. break;
  240. #endif
  241. #if (XILINX_FSL_NUMBER > 4)
  242. case 4:
  243. switch (blocking) {
  244. case 0: NPUT (num, 4);
  245. break;
  246. case 1: NCPUT (num, 4);
  247. break;
  248. case 2: PUT (num, 4);
  249. break;
  250. case 3: CPUT (num, 4);
  251. break;
  252. default:
  253. return 2;
  254. }
  255. break;
  256. #endif
  257. #if (XILINX_FSL_NUMBER > 5)
  258. case 5:
  259. switch (blocking) {
  260. case 0: NPUT (num, 5);
  261. break;
  262. case 1: NCPUT (num, 5);
  263. break;
  264. case 2: PUT (num, 5);
  265. break;
  266. case 3: CPUT (num, 5);
  267. break;
  268. default:
  269. return 2;
  270. }
  271. break;
  272. #endif
  273. #if (XILINX_FSL_NUMBER > 6)
  274. case 6:
  275. switch (blocking) {
  276. case 0: NPUT (num, 6);
  277. break;
  278. case 1: NCPUT (num, 6);
  279. break;
  280. case 2: PUT (num, 6);
  281. break;
  282. case 3: CPUT (num, 6);
  283. break;
  284. default:
  285. return 2;
  286. }
  287. break;
  288. #endif
  289. #if (XILINX_FSL_NUMBER > 7)
  290. case 7:
  291. switch (blocking) {
  292. case 0: NPUT (num, 7);
  293. break;
  294. case 1: NCPUT (num, 7);
  295. break;
  296. case 2: PUT (num, 7);
  297. break;
  298. case 3: CPUT (num, 7);
  299. break;
  300. default:
  301. return 2;
  302. }
  303. break;
  304. #endif
  305. default:
  306. return 1;
  307. }
  308. printf ("%01x: 0x%08x - %s %s write\n", fslnum, num,
  309. blocking < 2 ? "non blocking" : "blocking",
  310. ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
  311. return 0;
  312. }
  313. int do_rspr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  314. {
  315. unsigned int reg = 0;
  316. unsigned int val = 0;
  317. if (argc < 2)
  318. return CMD_RET_USAGE;
  319. reg = (unsigned int)hextoul(argv[1], NULL);
  320. val = (unsigned int)hextoul(argv[2], NULL);
  321. switch (reg) {
  322. case 0x1:
  323. if (argc > 2) {
  324. MTS (val, rmsr);
  325. NOP;
  326. MFS (val, rmsr);
  327. } else {
  328. MFS (val, rmsr);
  329. }
  330. puts ("MSR");
  331. break;
  332. case 0x3:
  333. MFS (val, rear);
  334. puts ("EAR");
  335. break;
  336. case 0x5:
  337. MFS (val, resr);
  338. puts ("ESR");
  339. break;
  340. default:
  341. puts ("Unsupported register\n");
  342. return 1;
  343. }
  344. printf (": 0x%08x\n", val);
  345. return 0;
  346. }
  347. /***************************************************/
  348. U_BOOT_CMD (frd, 3, 1, do_frd,
  349. "read data from FSL",
  350. "- [fslnum [0|1|2|3]]\n"
  351. " 0 - non blocking data read\n"
  352. " 1 - non blocking control read\n"
  353. " 2 - blocking data read\n"
  354. " 3 - blocking control read");
  355. U_BOOT_CMD (fwr, 4, 1, do_fwr,
  356. "write data to FSL",
  357. "- [fslnum [0|1|2|3]]\n"
  358. " 0 - non blocking data write\n"
  359. " 1 - non blocking control write\n"
  360. " 2 - blocking data write\n"
  361. " 3 - blocking control write");
  362. U_BOOT_CMD (rspr, 3, 1, do_rspr,
  363. "read/write special purpose register",
  364. "- reg_num [write value] read/write special purpose register\n"
  365. " 1 - MSR - Machine status register\n"
  366. " 3 - EAR - Exception address register\n"
  367. " 5 - ESR - Exception status register");