xref: /openbmc/u-boot/cmd/mfsl.c (revision e8f80a5a)
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