Merge tag 'docs-5.6-fixes' of git://git.lwn.net/linux
[linux-2.6-microblaze.git] / drivers / usb / dwc3 / debug.h
1 // SPDX-License-Identifier: GPL-2.0
2 /**
3  * debug.h - DesignWare USB3 DRD Controller Debug Header
4  *
5  * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
6  *
7  * Authors: Felipe Balbi <balbi@ti.com>,
8  *          Sebastian Andrzej Siewior <bigeasy@linutronix.de>
9  */
10
11 #ifndef __DWC3_DEBUG_H
12 #define __DWC3_DEBUG_H
13
14 #include "core.h"
15
16 /**
17  * dwc3_gadget_ep_cmd_string - returns endpoint command string
18  * @cmd: command code
19  */
20 static inline const char *
21 dwc3_gadget_ep_cmd_string(u8 cmd)
22 {
23         switch (cmd) {
24         case DWC3_DEPCMD_DEPSTARTCFG:
25                 return "Start New Configuration";
26         case DWC3_DEPCMD_ENDTRANSFER:
27                 return "End Transfer";
28         case DWC3_DEPCMD_UPDATETRANSFER:
29                 return "Update Transfer";
30         case DWC3_DEPCMD_STARTTRANSFER:
31                 return "Start Transfer";
32         case DWC3_DEPCMD_CLEARSTALL:
33                 return "Clear Stall";
34         case DWC3_DEPCMD_SETSTALL:
35                 return "Set Stall";
36         case DWC3_DEPCMD_GETEPSTATE:
37                 return "Get Endpoint State";
38         case DWC3_DEPCMD_SETTRANSFRESOURCE:
39                 return "Set Endpoint Transfer Resource";
40         case DWC3_DEPCMD_SETEPCONFIG:
41                 return "Set Endpoint Configuration";
42         default:
43                 return "UNKNOWN command";
44         }
45 }
46
47 /**
48  * dwc3_gadget_generic_cmd_string - returns generic command string
49  * @cmd: command code
50  */
51 static inline const char *
52 dwc3_gadget_generic_cmd_string(u8 cmd)
53 {
54         switch (cmd) {
55         case DWC3_DGCMD_SET_LMP:
56                 return "Set LMP";
57         case DWC3_DGCMD_SET_PERIODIC_PAR:
58                 return "Set Periodic Parameters";
59         case DWC3_DGCMD_XMIT_FUNCTION:
60                 return "Transmit Function Wake Device Notification";
61         case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
62                 return "Set Scratchpad Buffer Array Address Lo";
63         case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
64                 return "Set Scratchpad Buffer Array Address Hi";
65         case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
66                 return "Selected FIFO Flush";
67         case DWC3_DGCMD_ALL_FIFO_FLUSH:
68                 return "All FIFO Flush";
69         case DWC3_DGCMD_SET_ENDPOINT_NRDY:
70                 return "Set Endpoint NRDY";
71         case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
72                 return "Run SoC Bus Loopback Test";
73         default:
74                 return "UNKNOWN";
75         }
76 }
77
78 /**
79  * dwc3_gadget_link_string - returns link name
80  * @link_state: link state code
81  */
82 static inline const char *
83 dwc3_gadget_link_string(enum dwc3_link_state link_state)
84 {
85         switch (link_state) {
86         case DWC3_LINK_STATE_U0:
87                 return "U0";
88         case DWC3_LINK_STATE_U1:
89                 return "U1";
90         case DWC3_LINK_STATE_U2:
91                 return "U2";
92         case DWC3_LINK_STATE_U3:
93                 return "U3";
94         case DWC3_LINK_STATE_SS_DIS:
95                 return "SS.Disabled";
96         case DWC3_LINK_STATE_RX_DET:
97                 return "RX.Detect";
98         case DWC3_LINK_STATE_SS_INACT:
99                 return "SS.Inactive";
100         case DWC3_LINK_STATE_POLL:
101                 return "Polling";
102         case DWC3_LINK_STATE_RECOV:
103                 return "Recovery";
104         case DWC3_LINK_STATE_HRESET:
105                 return "Hot Reset";
106         case DWC3_LINK_STATE_CMPLY:
107                 return "Compliance";
108         case DWC3_LINK_STATE_LPBK:
109                 return "Loopback";
110         case DWC3_LINK_STATE_RESET:
111                 return "Reset";
112         case DWC3_LINK_STATE_RESUME:
113                 return "Resume";
114         default:
115                 return "UNKNOWN link state";
116         }
117 }
118
119 /**
120  * dwc3_gadget_hs_link_string - returns highspeed and below link name
121  * @link_state: link state code
122  */
123 static inline const char *
124 dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
125 {
126         switch (link_state) {
127         case DWC3_LINK_STATE_U0:
128                 return "On";
129         case DWC3_LINK_STATE_U2:
130                 return "Sleep";
131         case DWC3_LINK_STATE_U3:
132                 return "Suspend";
133         case DWC3_LINK_STATE_SS_DIS:
134                 return "Disconnected";
135         case DWC3_LINK_STATE_RX_DET:
136                 return "Early Suspend";
137         case DWC3_LINK_STATE_RECOV:
138                 return "Recovery";
139         case DWC3_LINK_STATE_RESET:
140                 return "Reset";
141         case DWC3_LINK_STATE_RESUME:
142                 return "Resume";
143         default:
144                 return "UNKNOWN link state";
145         }
146 }
147
148 /**
149  * dwc3_trb_type_string - returns TRB type as a string
150  * @type: the type of the TRB
151  */
152 static inline const char *dwc3_trb_type_string(unsigned int type)
153 {
154         switch (type) {
155         case DWC3_TRBCTL_NORMAL:
156                 return "normal";
157         case DWC3_TRBCTL_CONTROL_SETUP:
158                 return "setup";
159         case DWC3_TRBCTL_CONTROL_STATUS2:
160                 return "status2";
161         case DWC3_TRBCTL_CONTROL_STATUS3:
162                 return "status3";
163         case DWC3_TRBCTL_CONTROL_DATA:
164                 return "data";
165         case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
166                 return "isoc-first";
167         case DWC3_TRBCTL_ISOCHRONOUS:
168                 return "isoc";
169         case DWC3_TRBCTL_LINK_TRB:
170                 return "link";
171         default:
172                 return "UNKNOWN";
173         }
174 }
175
176 static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
177 {
178         switch (state) {
179         case EP0_UNCONNECTED:
180                 return "Unconnected";
181         case EP0_SETUP_PHASE:
182                 return "Setup Phase";
183         case EP0_DATA_PHASE:
184                 return "Data Phase";
185         case EP0_STATUS_PHASE:
186                 return "Status Phase";
187         default:
188                 return "UNKNOWN";
189         }
190 }
191
192 /**
193  * dwc3_gadget_event_string - returns event name
194  * @event: the event code
195  */
196 static inline const char *dwc3_gadget_event_string(char *str, size_t size,
197                 const struct dwc3_event_devt *event)
198 {
199         enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
200
201         switch (event->type) {
202         case DWC3_DEVICE_EVENT_DISCONNECT:
203                 snprintf(str, size, "Disconnect: [%s]",
204                                 dwc3_gadget_link_string(state));
205                 break;
206         case DWC3_DEVICE_EVENT_RESET:
207                 snprintf(str, size, "Reset [%s]",
208                                 dwc3_gadget_link_string(state));
209                 break;
210         case DWC3_DEVICE_EVENT_CONNECT_DONE:
211                 snprintf(str, size, "Connection Done [%s]",
212                                 dwc3_gadget_link_string(state));
213                 break;
214         case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
215                 snprintf(str, size, "Link Change [%s]",
216                                 dwc3_gadget_link_string(state));
217                 break;
218         case DWC3_DEVICE_EVENT_WAKEUP:
219                 snprintf(str, size, "WakeUp [%s]",
220                                 dwc3_gadget_link_string(state));
221                 break;
222         case DWC3_DEVICE_EVENT_EOPF:
223                 snprintf(str, size, "End-Of-Frame [%s]",
224                                 dwc3_gadget_link_string(state));
225                 break;
226         case DWC3_DEVICE_EVENT_SOF:
227                 snprintf(str, size, "Start-Of-Frame [%s]",
228                                 dwc3_gadget_link_string(state));
229                 break;
230         case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
231                 snprintf(str, size, "Erratic Error [%s]",
232                                 dwc3_gadget_link_string(state));
233                 break;
234         case DWC3_DEVICE_EVENT_CMD_CMPL:
235                 snprintf(str, size, "Command Complete [%s]",
236                                 dwc3_gadget_link_string(state));
237                 break;
238         case DWC3_DEVICE_EVENT_OVERFLOW:
239                 snprintf(str, size, "Overflow [%s]",
240                                 dwc3_gadget_link_string(state));
241                 break;
242         default:
243                 snprintf(str, size, "UNKNOWN");
244         }
245
246         return str;
247 }
248
249 /**
250  * dwc3_ep_event_string - returns event name
251  * @event: then event code
252  */
253 static inline const char *dwc3_ep_event_string(char *str, size_t size,
254                 const struct dwc3_event_depevt *event, u32 ep0state)
255 {
256         u8 epnum = event->endpoint_number;
257         size_t len;
258         int status;
259
260         len = scnprintf(str, size, "ep%d%s: ", epnum >> 1,
261                         (epnum & 1) ? "in" : "out");
262
263         status = event->status;
264
265         switch (event->endpoint_event) {
266         case DWC3_DEPEVT_XFERCOMPLETE:
267                 len += scnprintf(str + len, size - len,
268                                 "Transfer Complete (%c%c%c)",
269                                 status & DEPEVT_STATUS_SHORT ? 'S' : 's',
270                                 status & DEPEVT_STATUS_IOC ? 'I' : 'i',
271                                 status & DEPEVT_STATUS_LST ? 'L' : 'l');
272
273                 if (epnum <= 1)
274                         scnprintf(str + len, size - len, " [%s]",
275                                         dwc3_ep0_state_string(ep0state));
276                 break;
277         case DWC3_DEPEVT_XFERINPROGRESS:
278                 scnprintf(str + len, size - len,
279                                 "Transfer In Progress [%d] (%c%c%c)",
280                                 event->parameters,
281                                 status & DEPEVT_STATUS_SHORT ? 'S' : 's',
282                                 status & DEPEVT_STATUS_IOC ? 'I' : 'i',
283                                 status & DEPEVT_STATUS_LST ? 'M' : 'm');
284                 break;
285         case DWC3_DEPEVT_XFERNOTREADY:
286                 len += scnprintf(str + len, size - len,
287                                 "Transfer Not Ready [%d]%s",
288                                 event->parameters,
289                                 status & DEPEVT_STATUS_TRANSFER_ACTIVE ?
290                                 " (Active)" : " (Not Active)");
291
292                 /* Control Endpoints */
293                 if (epnum <= 1) {
294                         int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
295
296                         switch (phase) {
297                         case DEPEVT_STATUS_CONTROL_DATA:
298                                 scnprintf(str + len, size - len,
299                                                 " [Data Phase]");
300                                 break;
301                         case DEPEVT_STATUS_CONTROL_STATUS:
302                                 scnprintf(str + len, size - len,
303                                                 " [Status Phase]");
304                         }
305                 }
306                 break;
307         case DWC3_DEPEVT_RXTXFIFOEVT:
308                 scnprintf(str + len, size - len, "FIFO");
309                 break;
310         case DWC3_DEPEVT_STREAMEVT:
311                 status = event->status;
312
313                 switch (status) {
314                 case DEPEVT_STREAMEVT_FOUND:
315                         scnprintf(str + len, size - len, " Stream %d Found",
316                                         event->parameters);
317                         break;
318                 case DEPEVT_STREAMEVT_NOTFOUND:
319                 default:
320                         scnprintf(str + len, size - len, " Stream Not Found");
321                         break;
322                 }
323
324                 break;
325         case DWC3_DEPEVT_EPCMDCMPLT:
326                 scnprintf(str + len, size - len, "Endpoint Command Complete");
327                 break;
328         default:
329                 scnprintf(str + len, size - len, "UNKNOWN");
330         }
331
332         return str;
333 }
334
335 /**
336  * dwc3_gadget_event_type_string - return event name
337  * @event: the event code
338  */
339 static inline const char *dwc3_gadget_event_type_string(u8 event)
340 {
341         switch (event) {
342         case DWC3_DEVICE_EVENT_DISCONNECT:
343                 return "Disconnect";
344         case DWC3_DEVICE_EVENT_RESET:
345                 return "Reset";
346         case DWC3_DEVICE_EVENT_CONNECT_DONE:
347                 return "Connect Done";
348         case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
349                 return "Link Status Change";
350         case DWC3_DEVICE_EVENT_WAKEUP:
351                 return "Wake-Up";
352         case DWC3_DEVICE_EVENT_HIBER_REQ:
353                 return "Hibernation";
354         case DWC3_DEVICE_EVENT_EOPF:
355                 return "End of Periodic Frame";
356         case DWC3_DEVICE_EVENT_SOF:
357                 return "Start of Frame";
358         case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
359                 return "Erratic Error";
360         case DWC3_DEVICE_EVENT_CMD_CMPL:
361                 return "Command Complete";
362         case DWC3_DEVICE_EVENT_OVERFLOW:
363                 return "Overflow";
364         default:
365                 return "UNKNOWN";
366         }
367 }
368
369 static inline const char *dwc3_decode_event(char *str, size_t size, u32 event,
370                 u32 ep0state)
371 {
372         const union dwc3_event evt = (union dwc3_event) event;
373
374         if (evt.type.is_devspec)
375                 return dwc3_gadget_event_string(str, size, &evt.devt);
376         else
377                 return dwc3_ep_event_string(str, size, &evt.depevt, ep0state);
378 }
379
380 static inline const char *dwc3_ep_cmd_status_string(int status)
381 {
382         switch (status) {
383         case -ETIMEDOUT:
384                 return "Timed Out";
385         case 0:
386                 return "Successful";
387         case DEPEVT_TRANSFER_NO_RESOURCE:
388                 return "No Resource";
389         case DEPEVT_TRANSFER_BUS_EXPIRY:
390                 return "Bus Expiry";
391         default:
392                 return "UNKNOWN";
393         }
394 }
395
396 static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
397 {
398         switch (status) {
399         case -ETIMEDOUT:
400                 return "Timed Out";
401         case 0:
402                 return "Successful";
403         case 1:
404                 return "Error";
405         default:
406                 return "UNKNOWN";
407         }
408 }
409
410
411 #ifdef CONFIG_DEBUG_FS
412 extern void dwc3_debugfs_init(struct dwc3 *);
413 extern void dwc3_debugfs_exit(struct dwc3 *);
414 #else
415 static inline void dwc3_debugfs_init(struct dwc3 *d)
416 {  }
417 static inline void dwc3_debugfs_exit(struct dwc3 *d)
418 {  }
419 #endif
420 #endif /* __DWC3_DEBUG_H */