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