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