mfsl.c 6.7 KB

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