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