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
do_frd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_fwr(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_rspr(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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