1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass * (C) Copyright 2007 Michal Simek
42e192b24SSimon Glass *
52e192b24SSimon Glass * Michal SIMEK <monstr@monstr.eu>
62e192b24SSimon Glass */
72e192b24SSimon Glass
82e192b24SSimon Glass /*
92e192b24SSimon Glass * Microblaze FSL support
102e192b24SSimon Glass */
112e192b24SSimon Glass
122e192b24SSimon Glass #include <common.h>
132e192b24SSimon Glass #include <config.h>
142e192b24SSimon Glass #include <command.h>
152e192b24SSimon Glass #include <asm/asm.h>
162e192b24SSimon Glass
do_frd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])172e192b24SSimon Glass int do_frd (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
182e192b24SSimon Glass {
192e192b24SSimon Glass unsigned int fslnum;
202e192b24SSimon Glass unsigned int num;
212e192b24SSimon Glass unsigned int blocking;
222e192b24SSimon Glass
232e192b24SSimon Glass if (argc < 2)
242e192b24SSimon Glass return CMD_RET_USAGE;
252e192b24SSimon Glass
262e192b24SSimon Glass fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
272e192b24SSimon Glass blocking = (unsigned int)simple_strtoul (argv[2], NULL, 16);
282e192b24SSimon Glass if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER) {
292e192b24SSimon Glass puts ("Bad number of FSL\n");
302e192b24SSimon Glass return CMD_RET_USAGE;
312e192b24SSimon Glass }
322e192b24SSimon Glass
332e192b24SSimon Glass switch (fslnum) {
342e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 0)
352e192b24SSimon Glass case 0:
362e192b24SSimon Glass switch (blocking) {
372e192b24SSimon Glass case 0: NGET (num, 0);
382e192b24SSimon Glass break;
392e192b24SSimon Glass case 1: NCGET (num, 0);
402e192b24SSimon Glass break;
412e192b24SSimon Glass case 2: GET (num, 0);
422e192b24SSimon Glass break;
432e192b24SSimon Glass case 3: CGET (num, 0);
442e192b24SSimon Glass break;
452e192b24SSimon Glass default:
462e192b24SSimon Glass return 2;
472e192b24SSimon Glass }
482e192b24SSimon Glass break;
492e192b24SSimon Glass #endif
502e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 1)
512e192b24SSimon Glass case 1:
522e192b24SSimon Glass switch (blocking) {
532e192b24SSimon Glass case 0: NGET (num, 1);
542e192b24SSimon Glass break;
552e192b24SSimon Glass case 1: NCGET (num, 1);
562e192b24SSimon Glass break;
572e192b24SSimon Glass case 2: GET (num, 1);
582e192b24SSimon Glass break;
592e192b24SSimon Glass case 3: CGET (num, 1);
602e192b24SSimon Glass break;
612e192b24SSimon Glass default:
622e192b24SSimon Glass return 2;
632e192b24SSimon Glass }
642e192b24SSimon Glass break;
652e192b24SSimon Glass #endif
662e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 2)
672e192b24SSimon Glass case 2:
682e192b24SSimon Glass switch (blocking) {
692e192b24SSimon Glass case 0: NGET (num, 2);
702e192b24SSimon Glass break;
712e192b24SSimon Glass case 1: NCGET (num, 2);
722e192b24SSimon Glass break;
732e192b24SSimon Glass case 2: GET (num, 2);
742e192b24SSimon Glass break;
752e192b24SSimon Glass case 3: CGET (num, 2);
762e192b24SSimon Glass break;
772e192b24SSimon Glass default:
782e192b24SSimon Glass return 2;
792e192b24SSimon Glass }
802e192b24SSimon Glass break;
812e192b24SSimon Glass #endif
822e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 3)
832e192b24SSimon Glass case 3:
842e192b24SSimon Glass switch (blocking) {
852e192b24SSimon Glass case 0: NGET (num, 3);
862e192b24SSimon Glass break;
872e192b24SSimon Glass case 1: NCGET (num, 3);
882e192b24SSimon Glass break;
892e192b24SSimon Glass case 2: GET (num, 3);
902e192b24SSimon Glass break;
912e192b24SSimon Glass case 3: CGET (num, 3);
922e192b24SSimon Glass break;
932e192b24SSimon Glass default:
942e192b24SSimon Glass return 2;
952e192b24SSimon Glass }
962e192b24SSimon Glass break;
972e192b24SSimon Glass #endif
982e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 4)
992e192b24SSimon Glass case 4:
1002e192b24SSimon Glass switch (blocking) {
1012e192b24SSimon Glass case 0: NGET (num, 4);
1022e192b24SSimon Glass break;
1032e192b24SSimon Glass case 1: NCGET (num, 4);
1042e192b24SSimon Glass break;
1052e192b24SSimon Glass case 2: GET (num, 4);
1062e192b24SSimon Glass break;
1072e192b24SSimon Glass case 3: CGET (num, 4);
1082e192b24SSimon Glass break;
1092e192b24SSimon Glass default:
1102e192b24SSimon Glass return 2;
1112e192b24SSimon Glass }
1122e192b24SSimon Glass break;
1132e192b24SSimon Glass #endif
1142e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 5)
1152e192b24SSimon Glass case 5:
1162e192b24SSimon Glass switch (blocking) {
1172e192b24SSimon Glass case 0: NGET (num, 5);
1182e192b24SSimon Glass break;
1192e192b24SSimon Glass case 1: NCGET (num, 5);
1202e192b24SSimon Glass break;
1212e192b24SSimon Glass case 2: GET (num, 5);
1222e192b24SSimon Glass break;
1232e192b24SSimon Glass case 3: CGET (num, 5);
1242e192b24SSimon Glass break;
1252e192b24SSimon Glass default:
1262e192b24SSimon Glass return 2;
1272e192b24SSimon Glass }
1282e192b24SSimon Glass break;
1292e192b24SSimon Glass #endif
1302e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 6)
1312e192b24SSimon Glass case 6:
1322e192b24SSimon Glass switch (blocking) {
1332e192b24SSimon Glass case 0: NGET (num, 6);
1342e192b24SSimon Glass break;
1352e192b24SSimon Glass case 1: NCGET (num, 6);
1362e192b24SSimon Glass break;
1372e192b24SSimon Glass case 2: GET (num, 6);
1382e192b24SSimon Glass break;
1392e192b24SSimon Glass case 3: CGET (num, 6);
1402e192b24SSimon Glass break;
1412e192b24SSimon Glass default:
1422e192b24SSimon Glass return 2;
1432e192b24SSimon Glass }
1442e192b24SSimon Glass break;
1452e192b24SSimon Glass #endif
1462e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 7)
1472e192b24SSimon Glass case 7:
1482e192b24SSimon Glass switch (blocking) {
1492e192b24SSimon Glass case 0: NGET (num, 7);
1502e192b24SSimon Glass break;
1512e192b24SSimon Glass case 1: NCGET (num, 7);
1522e192b24SSimon Glass break;
1532e192b24SSimon Glass case 2: GET (num, 7);
1542e192b24SSimon Glass break;
1552e192b24SSimon Glass case 3: CGET (num, 7);
1562e192b24SSimon Glass break;
1572e192b24SSimon Glass default:
1582e192b24SSimon Glass return 2;
1592e192b24SSimon Glass }
1602e192b24SSimon Glass break;
1612e192b24SSimon Glass #endif
1622e192b24SSimon Glass default:
1632e192b24SSimon Glass return 1;
1642e192b24SSimon Glass }
1652e192b24SSimon Glass
1662e192b24SSimon Glass printf ("%01x: 0x%08x - %s %s read\n", fslnum, num,
1672e192b24SSimon Glass blocking < 2 ? "non blocking" : "blocking",
1682e192b24SSimon Glass ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
1692e192b24SSimon Glass return 0;
1702e192b24SSimon Glass }
1712e192b24SSimon Glass
do_fwr(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1722e192b24SSimon Glass int do_fwr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
1732e192b24SSimon Glass {
1742e192b24SSimon Glass unsigned int fslnum;
1752e192b24SSimon Glass unsigned int num;
1762e192b24SSimon Glass unsigned int blocking;
1772e192b24SSimon Glass
1782e192b24SSimon Glass if (argc < 3)
1792e192b24SSimon Glass return CMD_RET_USAGE;
1802e192b24SSimon Glass
1812e192b24SSimon Glass fslnum = (unsigned int)simple_strtoul (argv[1], NULL, 16);
1822e192b24SSimon Glass num = (unsigned int)simple_strtoul (argv[2], NULL, 16);
1832e192b24SSimon Glass blocking = (unsigned int)simple_strtoul (argv[3], NULL, 16);
1842e192b24SSimon Glass if (fslnum < 0 || fslnum >= XILINX_FSL_NUMBER)
1852e192b24SSimon Glass return CMD_RET_USAGE;
1862e192b24SSimon Glass
1872e192b24SSimon Glass switch (fslnum) {
1882e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 0)
1892e192b24SSimon Glass case 0:
1902e192b24SSimon Glass switch (blocking) {
1912e192b24SSimon Glass case 0: NPUT (num, 0);
1922e192b24SSimon Glass break;
1932e192b24SSimon Glass case 1: NCPUT (num, 0);
1942e192b24SSimon Glass break;
1952e192b24SSimon Glass case 2: PUT (num, 0);
1962e192b24SSimon Glass break;
1972e192b24SSimon Glass case 3: CPUT (num, 0);
1982e192b24SSimon Glass break;
1992e192b24SSimon Glass default:
2002e192b24SSimon Glass return 2;
2012e192b24SSimon Glass }
2022e192b24SSimon Glass break;
2032e192b24SSimon Glass #endif
2042e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 1)
2052e192b24SSimon Glass case 1:
2062e192b24SSimon Glass switch (blocking) {
2072e192b24SSimon Glass case 0: NPUT (num, 1);
2082e192b24SSimon Glass break;
2092e192b24SSimon Glass case 1: NCPUT (num, 1);
2102e192b24SSimon Glass break;
2112e192b24SSimon Glass case 2: PUT (num, 1);
2122e192b24SSimon Glass break;
2132e192b24SSimon Glass case 3: CPUT (num, 1);
2142e192b24SSimon Glass break;
2152e192b24SSimon Glass default:
2162e192b24SSimon Glass return 2;
2172e192b24SSimon Glass }
2182e192b24SSimon Glass break;
2192e192b24SSimon Glass #endif
2202e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 2)
2212e192b24SSimon Glass case 2:
2222e192b24SSimon Glass switch (blocking) {
2232e192b24SSimon Glass case 0: NPUT (num, 2);
2242e192b24SSimon Glass break;
2252e192b24SSimon Glass case 1: NCPUT (num, 2);
2262e192b24SSimon Glass break;
2272e192b24SSimon Glass case 2: PUT (num, 2);
2282e192b24SSimon Glass break;
2292e192b24SSimon Glass case 3: CPUT (num, 2);
2302e192b24SSimon Glass break;
2312e192b24SSimon Glass default:
2322e192b24SSimon Glass return 2;
2332e192b24SSimon Glass }
2342e192b24SSimon Glass break;
2352e192b24SSimon Glass #endif
2362e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 3)
2372e192b24SSimon Glass case 3:
2382e192b24SSimon Glass switch (blocking) {
2392e192b24SSimon Glass case 0: NPUT (num, 3);
2402e192b24SSimon Glass break;
2412e192b24SSimon Glass case 1: NCPUT (num, 3);
2422e192b24SSimon Glass break;
2432e192b24SSimon Glass case 2: PUT (num, 3);
2442e192b24SSimon Glass break;
2452e192b24SSimon Glass case 3: CPUT (num, 3);
2462e192b24SSimon Glass break;
2472e192b24SSimon Glass default:
2482e192b24SSimon Glass return 2;
2492e192b24SSimon Glass }
2502e192b24SSimon Glass break;
2512e192b24SSimon Glass #endif
2522e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 4)
2532e192b24SSimon Glass case 4:
2542e192b24SSimon Glass switch (blocking) {
2552e192b24SSimon Glass case 0: NPUT (num, 4);
2562e192b24SSimon Glass break;
2572e192b24SSimon Glass case 1: NCPUT (num, 4);
2582e192b24SSimon Glass break;
2592e192b24SSimon Glass case 2: PUT (num, 4);
2602e192b24SSimon Glass break;
2612e192b24SSimon Glass case 3: CPUT (num, 4);
2622e192b24SSimon Glass break;
2632e192b24SSimon Glass default:
2642e192b24SSimon Glass return 2;
2652e192b24SSimon Glass }
2662e192b24SSimon Glass break;
2672e192b24SSimon Glass #endif
2682e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 5)
2692e192b24SSimon Glass case 5:
2702e192b24SSimon Glass switch (blocking) {
2712e192b24SSimon Glass case 0: NPUT (num, 5);
2722e192b24SSimon Glass break;
2732e192b24SSimon Glass case 1: NCPUT (num, 5);
2742e192b24SSimon Glass break;
2752e192b24SSimon Glass case 2: PUT (num, 5);
2762e192b24SSimon Glass break;
2772e192b24SSimon Glass case 3: CPUT (num, 5);
2782e192b24SSimon Glass break;
2792e192b24SSimon Glass default:
2802e192b24SSimon Glass return 2;
2812e192b24SSimon Glass }
2822e192b24SSimon Glass break;
2832e192b24SSimon Glass #endif
2842e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 6)
2852e192b24SSimon Glass case 6:
2862e192b24SSimon Glass switch (blocking) {
2872e192b24SSimon Glass case 0: NPUT (num, 6);
2882e192b24SSimon Glass break;
2892e192b24SSimon Glass case 1: NCPUT (num, 6);
2902e192b24SSimon Glass break;
2912e192b24SSimon Glass case 2: PUT (num, 6);
2922e192b24SSimon Glass break;
2932e192b24SSimon Glass case 3: CPUT (num, 6);
2942e192b24SSimon Glass break;
2952e192b24SSimon Glass default:
2962e192b24SSimon Glass return 2;
2972e192b24SSimon Glass }
2982e192b24SSimon Glass break;
2992e192b24SSimon Glass #endif
3002e192b24SSimon Glass #if (XILINX_FSL_NUMBER > 7)
3012e192b24SSimon Glass case 7:
3022e192b24SSimon Glass switch (blocking) {
3032e192b24SSimon Glass case 0: NPUT (num, 7);
3042e192b24SSimon Glass break;
3052e192b24SSimon Glass case 1: NCPUT (num, 7);
3062e192b24SSimon Glass break;
3072e192b24SSimon Glass case 2: PUT (num, 7);
3082e192b24SSimon Glass break;
3092e192b24SSimon Glass case 3: CPUT (num, 7);
3102e192b24SSimon Glass break;
3112e192b24SSimon Glass default:
3122e192b24SSimon Glass return 2;
3132e192b24SSimon Glass }
3142e192b24SSimon Glass break;
3152e192b24SSimon Glass #endif
3162e192b24SSimon Glass default:
3172e192b24SSimon Glass return 1;
3182e192b24SSimon Glass }
3192e192b24SSimon Glass
3202e192b24SSimon Glass printf ("%01x: 0x%08x - %s %s write\n", fslnum, num,
3212e192b24SSimon Glass blocking < 2 ? "non blocking" : "blocking",
3222e192b24SSimon Glass ((blocking == 1) || (blocking == 3)) ? "control" : "data" );
3232e192b24SSimon Glass return 0;
3242e192b24SSimon Glass
3252e192b24SSimon Glass }
3262e192b24SSimon Glass
do_rspr(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])3272e192b24SSimon Glass int do_rspr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
3282e192b24SSimon Glass {
3292e192b24SSimon Glass unsigned int reg = 0;
3302e192b24SSimon Glass unsigned int val = 0;
3312e192b24SSimon Glass
3322e192b24SSimon Glass if (argc < 2)
3332e192b24SSimon Glass return CMD_RET_USAGE;
3342e192b24SSimon Glass
3352e192b24SSimon Glass reg = (unsigned int)simple_strtoul (argv[1], NULL, 16);
3362e192b24SSimon Glass val = (unsigned int)simple_strtoul (argv[2], NULL, 16);
3372e192b24SSimon Glass switch (reg) {
3382e192b24SSimon Glass case 0x1:
3392e192b24SSimon Glass if (argc > 2) {
3402e192b24SSimon Glass MTS (val, rmsr);
3412e192b24SSimon Glass NOP;
3422e192b24SSimon Glass MFS (val, rmsr);
3432e192b24SSimon Glass } else {
3442e192b24SSimon Glass MFS (val, rmsr);
3452e192b24SSimon Glass }
3462e192b24SSimon Glass puts ("MSR");
3472e192b24SSimon Glass break;
3482e192b24SSimon Glass case 0x3:
3492e192b24SSimon Glass MFS (val, rear);
3502e192b24SSimon Glass puts ("EAR");
3512e192b24SSimon Glass break;
3522e192b24SSimon Glass case 0x5:
3532e192b24SSimon Glass MFS (val, resr);
3542e192b24SSimon Glass puts ("ESR");
3552e192b24SSimon Glass break;
3562e192b24SSimon Glass default:
3572e192b24SSimon Glass puts ("Unsupported register\n");
3582e192b24SSimon Glass return 1;
3592e192b24SSimon Glass }
3602e192b24SSimon Glass printf (": 0x%08x\n", val);
3612e192b24SSimon Glass return 0;
3622e192b24SSimon Glass }
3632e192b24SSimon Glass
3642e192b24SSimon Glass /***************************************************/
3652e192b24SSimon Glass
3662e192b24SSimon Glass U_BOOT_CMD (frd, 3, 1, do_frd,
3672e192b24SSimon Glass "read data from FSL",
3682e192b24SSimon Glass "- [fslnum [0|1|2|3]]\n"
3692e192b24SSimon Glass " 0 - non blocking data read\n"
3702e192b24SSimon Glass " 1 - non blocking control read\n"
3712e192b24SSimon Glass " 2 - blocking data read\n"
3722e192b24SSimon Glass " 3 - blocking control read");
3732e192b24SSimon Glass
3742e192b24SSimon Glass U_BOOT_CMD (fwr, 4, 1, do_fwr,
3752e192b24SSimon Glass "write data to FSL",
3762e192b24SSimon Glass "- [fslnum [0|1|2|3]]\n"
3772e192b24SSimon Glass " 0 - non blocking data write\n"
3782e192b24SSimon Glass " 1 - non blocking control write\n"
3792e192b24SSimon Glass " 2 - blocking data write\n"
3802e192b24SSimon Glass " 3 - blocking control write");
3812e192b24SSimon Glass
3822e192b24SSimon Glass U_BOOT_CMD (rspr, 3, 1, do_rspr,
3832e192b24SSimon Glass "read/write special purpose register",
3842e192b24SSimon Glass "- reg_num [write value] read/write special purpose register\n"
3852e192b24SSimon Glass " 1 - MSR - Machine status register\n"
3862e192b24SSimon Glass " 3 - EAR - Exception address register\n"
3872e192b24SSimon Glass " 5 - ESR - Exception status register");
388