Commit | Line | Data |
---|---|---|
b33f69f5 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
27088e00 | 2 | /* |
2c4cbe6e FB |
3 | * trace.h - DesignWare USB3 DRD Controller Trace Support |
4 | * | |
10623b87 | 5 | * Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com |
2c4cbe6e FB |
6 | * |
7 | * Author: Felipe Balbi <balbi@ti.com> | |
2c4cbe6e FB |
8 | */ |
9 | ||
10 | #undef TRACE_SYSTEM | |
11 | #define TRACE_SYSTEM dwc3 | |
12 | ||
13 | #if !defined(__DWC3_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) | |
14 | #define __DWC3_TRACE_H | |
15 | ||
16 | #include <linux/types.h> | |
17 | #include <linux/tracepoint.h> | |
18 | #include <asm/byteorder.h> | |
19 | #include "core.h" | |
20 | #include "debug.h" | |
21 | ||
4dd5a69e FB |
22 | DECLARE_EVENT_CLASS(dwc3_log_io, |
23 | TP_PROTO(void *base, u32 offset, u32 value), | |
24 | TP_ARGS(base, offset, value), | |
25 | TP_STRUCT__entry( | |
26 | __field(void *, base) | |
27 | __field(u32, offset) | |
28 | __field(u32, value) | |
29 | ), | |
30 | TP_fast_assign( | |
31 | __entry->base = base; | |
32 | __entry->offset = offset; | |
33 | __entry->value = value; | |
34 | ), | |
3fc63d07 TN |
35 | TP_printk("addr %p offset %04x value %08x", |
36 | __entry->base + __entry->offset, | |
37 | __entry->offset, | |
38 | __entry->value) | |
6bac4ff0 FB |
39 | ); |
40 | ||
4dd5a69e | 41 | DEFINE_EVENT(dwc3_log_io, dwc3_readl, |
204ec1af | 42 | TP_PROTO(void __iomem *base, u32 offset, u32 value), |
4dd5a69e FB |
43 | TP_ARGS(base, offset, value) |
44 | ); | |
45 | ||
46 | DEFINE_EVENT(dwc3_log_io, dwc3_writel, | |
204ec1af | 47 | TP_PROTO(void __iomem *base, u32 offset, u32 value), |
4dd5a69e | 48 | TP_ARGS(base, offset, value) |
2c4cbe6e FB |
49 | ); |
50 | ||
51 | DECLARE_EVENT_CLASS(dwc3_log_event, | |
43c96be1 FB |
52 | TP_PROTO(u32 event, struct dwc3 *dwc), |
53 | TP_ARGS(event, dwc), | |
2c4cbe6e FB |
54 | TP_STRUCT__entry( |
55 | __field(u32, event) | |
43c96be1 | 56 | __field(u32, ep0state) |
3587f36a | 57 | __dynamic_array(char, str, DWC3_MSG_MAX) |
2c4cbe6e FB |
58 | ), |
59 | TP_fast_assign( | |
60 | __entry->event = event; | |
43c96be1 | 61 | __entry->ep0state = dwc->ep0state; |
2c4cbe6e | 62 | ), |
f75cacc4 | 63 | TP_printk("event (%08x): %s", __entry->event, |
7790b355 FB |
64 | dwc3_decode_event(__get_str(str), DWC3_MSG_MAX, |
65 | __entry->event, __entry->ep0state)) | |
2c4cbe6e FB |
66 | ); |
67 | ||
68 | DEFINE_EVENT(dwc3_log_event, dwc3_event, | |
43c96be1 FB |
69 | TP_PROTO(u32 event, struct dwc3 *dwc), |
70 | TP_ARGS(event, dwc) | |
2c4cbe6e FB |
71 | ); |
72 | ||
73 | DECLARE_EVENT_CLASS(dwc3_log_ctrl, | |
74 | TP_PROTO(struct usb_ctrlrequest *ctrl), | |
75 | TP_ARGS(ctrl), | |
76 | TP_STRUCT__entry( | |
4ac4fc93 FB |
77 | __field(__u8, bRequestType) |
78 | __field(__u8, bRequest) | |
96bedb63 JY |
79 | __field(__u16, wValue) |
80 | __field(__u16, wIndex) | |
81 | __field(__u16, wLength) | |
af32423a | 82 | __dynamic_array(char, str, DWC3_MSG_MAX) |
2c4cbe6e FB |
83 | ), |
84 | TP_fast_assign( | |
4ac4fc93 FB |
85 | __entry->bRequestType = ctrl->bRequestType; |
86 | __entry->bRequest = ctrl->bRequest; | |
96bedb63 JY |
87 | __entry->wValue = le16_to_cpu(ctrl->wValue); |
88 | __entry->wIndex = le16_to_cpu(ctrl->wIndex); | |
89 | __entry->wLength = le16_to_cpu(ctrl->wLength); | |
2c4cbe6e | 90 | ), |
91f255a2 | 91 | TP_printk("%s", usb_decode_ctrl(__get_str(str), DWC3_MSG_MAX, |
7790b355 | 92 | __entry->bRequestType, |
af32423a FB |
93 | __entry->bRequest, __entry->wValue, |
94 | __entry->wIndex, __entry->wLength) | |
2c4cbe6e FB |
95 | ) |
96 | ); | |
97 | ||
98 | DEFINE_EVENT(dwc3_log_ctrl, dwc3_ctrl_req, | |
99 | TP_PROTO(struct usb_ctrlrequest *ctrl), | |
100 | TP_ARGS(ctrl) | |
101 | ); | |
102 | ||
103 | DECLARE_EVENT_CLASS(dwc3_log_request, | |
104 | TP_PROTO(struct dwc3_request *req), | |
105 | TP_ARGS(req), | |
106 | TP_STRUCT__entry( | |
e42f09b8 | 107 | __string(name, req->dep->name) |
2c4cbe6e | 108 | __field(struct dwc3_request *, req) |
159fdf29 FB |
109 | __field(unsigned int, actual) |
110 | __field(unsigned int, length) | |
4ac4fc93 | 111 | __field(int, status) |
46a01427 FB |
112 | __field(int, zero) |
113 | __field(int, short_not_ok) | |
114 | __field(int, no_interrupt) | |
2c4cbe6e FB |
115 | ), |
116 | TP_fast_assign( | |
e42f09b8 | 117 | __assign_str(name, req->dep->name); |
2c4cbe6e | 118 | __entry->req = req; |
4ac4fc93 FB |
119 | __entry->actual = req->request.actual; |
120 | __entry->length = req->request.length; | |
121 | __entry->status = req->request.status; | |
46a01427 FB |
122 | __entry->zero = req->request.zero; |
123 | __entry->short_not_ok = req->request.short_not_ok; | |
124 | __entry->no_interrupt = req->request.no_interrupt; | |
2c4cbe6e | 125 | ), |
46a01427 | 126 | TP_printk("%s: req %p length %u/%u %s%s%s ==> %d", |
4ac4fc93 | 127 | __get_str(name), __entry->req, __entry->actual, __entry->length, |
46a01427 FB |
128 | __entry->zero ? "Z" : "z", |
129 | __entry->short_not_ok ? "S" : "s", | |
130 | __entry->no_interrupt ? "i" : "I", | |
4ac4fc93 | 131 | __entry->status |
2c4cbe6e FB |
132 | ) |
133 | ); | |
134 | ||
135 | DEFINE_EVENT(dwc3_log_request, dwc3_alloc_request, | |
136 | TP_PROTO(struct dwc3_request *req), | |
137 | TP_ARGS(req) | |
138 | ); | |
139 | ||
140 | DEFINE_EVENT(dwc3_log_request, dwc3_free_request, | |
141 | TP_PROTO(struct dwc3_request *req), | |
142 | TP_ARGS(req) | |
143 | ); | |
144 | ||
145 | DEFINE_EVENT(dwc3_log_request, dwc3_ep_queue, | |
146 | TP_PROTO(struct dwc3_request *req), | |
147 | TP_ARGS(req) | |
148 | ); | |
149 | ||
150 | DEFINE_EVENT(dwc3_log_request, dwc3_ep_dequeue, | |
151 | TP_PROTO(struct dwc3_request *req), | |
152 | TP_ARGS(req) | |
153 | ); | |
154 | ||
155 | DEFINE_EVENT(dwc3_log_request, dwc3_gadget_giveback, | |
156 | TP_PROTO(struct dwc3_request *req), | |
157 | TP_ARGS(req) | |
158 | ); | |
159 | ||
160 | DECLARE_EVENT_CLASS(dwc3_log_generic_cmd, | |
71f7e702 FB |
161 | TP_PROTO(unsigned int cmd, u32 param, int status), |
162 | TP_ARGS(cmd, param, status), | |
2c4cbe6e FB |
163 | TP_STRUCT__entry( |
164 | __field(unsigned int, cmd) | |
165 | __field(u32, param) | |
71f7e702 | 166 | __field(int, status) |
2c4cbe6e FB |
167 | ), |
168 | TP_fast_assign( | |
169 | __entry->cmd = cmd; | |
170 | __entry->param = param; | |
71f7e702 | 171 | __entry->status = status; |
2c4cbe6e | 172 | ), |
aad7c259 | 173 | TP_printk("cmd '%s' [%x] param %08x --> status: %s", |
2c4cbe6e | 174 | dwc3_gadget_generic_cmd_string(__entry->cmd), |
71f7e702 FB |
175 | __entry->cmd, __entry->param, |
176 | dwc3_gadget_generic_cmd_status_string(__entry->status) | |
2c4cbe6e FB |
177 | ) |
178 | ); | |
179 | ||
180 | DEFINE_EVENT(dwc3_log_generic_cmd, dwc3_gadget_generic_cmd, | |
71f7e702 FB |
181 | TP_PROTO(unsigned int cmd, u32 param, int status), |
182 | TP_ARGS(cmd, param, status) | |
2c4cbe6e FB |
183 | ); |
184 | ||
185 | DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd, | |
186 | TP_PROTO(struct dwc3_ep *dep, unsigned int cmd, | |
0933df15 FB |
187 | struct dwc3_gadget_ep_cmd_params *params, int cmd_status), |
188 | TP_ARGS(dep, cmd, params, cmd_status), | |
2c4cbe6e | 189 | TP_STRUCT__entry( |
e42f09b8 | 190 | __string(name, dep->name) |
2c4cbe6e | 191 | __field(unsigned int, cmd) |
a4722fd3 FB |
192 | __field(u32, param0) |
193 | __field(u32, param1) | |
194 | __field(u32, param2) | |
0933df15 | 195 | __field(int, cmd_status) |
2c4cbe6e FB |
196 | ), |
197 | TP_fast_assign( | |
e42f09b8 | 198 | __assign_str(name, dep->name); |
2c4cbe6e | 199 | __entry->cmd = cmd; |
a4722fd3 FB |
200 | __entry->param0 = params->param0; |
201 | __entry->param1 = params->param1; | |
202 | __entry->param2 = params->param2; | |
0933df15 | 203 | __entry->cmd_status = cmd_status; |
2c4cbe6e | 204 | ), |
15172652 | 205 | TP_printk("%s: cmd '%s' [%x] params %08x %08x %08x --> status: %s", |
4ac4fc93 | 206 | __get_str(name), dwc3_gadget_ep_cmd_string(__entry->cmd), |
a4722fd3 | 207 | __entry->cmd, __entry->param0, |
0933df15 FB |
208 | __entry->param1, __entry->param2, |
209 | dwc3_ep_cmd_status_string(__entry->cmd_status) | |
2c4cbe6e FB |
210 | ) |
211 | ); | |
212 | ||
213 | DEFINE_EVENT(dwc3_log_gadget_ep_cmd, dwc3_gadget_ep_cmd, | |
214 | TP_PROTO(struct dwc3_ep *dep, unsigned int cmd, | |
0933df15 FB |
215 | struct dwc3_gadget_ep_cmd_params *params, int cmd_status), |
216 | TP_ARGS(dep, cmd, params, cmd_status) | |
2c4cbe6e FB |
217 | ); |
218 | ||
219 | DECLARE_EVENT_CLASS(dwc3_log_trb, | |
220 | TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), | |
221 | TP_ARGS(dep, trb), | |
222 | TP_STRUCT__entry( | |
e42f09b8 | 223 | __string(name, dep->name) |
2c4cbe6e | 224 | __field(struct dwc3_trb *, trb) |
4ac4fc93 FB |
225 | __field(u32, bpl) |
226 | __field(u32, bph) | |
227 | __field(u32, size) | |
228 | __field(u32, ctrl) | |
fa8d965d | 229 | __field(u32, type) |
30ad6273 FB |
230 | __field(u32, enqueue) |
231 | __field(u32, dequeue) | |
2c4cbe6e FB |
232 | ), |
233 | TP_fast_assign( | |
e42f09b8 | 234 | __assign_str(name, dep->name); |
2c4cbe6e | 235 | __entry->trb = trb; |
4ac4fc93 FB |
236 | __entry->bpl = trb->bpl; |
237 | __entry->bph = trb->bph; | |
238 | __entry->size = trb->size; | |
239 | __entry->ctrl = trb->ctrl; | |
fa8d965d | 240 | __entry->type = usb_endpoint_type(dep->endpoint.desc); |
30ad6273 FB |
241 | __entry->enqueue = dep->trb_enqueue; |
242 | __entry->dequeue = dep->trb_dequeue; | |
2c4cbe6e | 243 | ), |
30ad6273 FB |
244 | TP_printk("%s: trb %p (E%d:D%d) buf %08x%08x size %s%d ctrl %08x (%c%c%c%c:%c%c:%s)", |
245 | __get_str(name), __entry->trb, __entry->enqueue, | |
246 | __entry->dequeue, __entry->bph, __entry->bpl, | |
fa8d965d FB |
247 | ({char *s; |
248 | int pcm = ((__entry->size >> 24) & 3) + 1; | |
159fdf29 | 249 | |
fa8d965d FB |
250 | switch (__entry->type) { |
251 | case USB_ENDPOINT_XFER_INT: | |
252 | case USB_ENDPOINT_XFER_ISOC: | |
253 | switch (pcm) { | |
254 | case 1: | |
255 | s = "1x "; | |
256 | break; | |
257 | case 2: | |
258 | s = "2x "; | |
259 | break; | |
260 | case 3: | |
54d48183 | 261 | default: |
fa8d965d FB |
262 | s = "3x "; |
263 | break; | |
264 | } | |
54d48183 | 265 | break; |
fa8d965d FB |
266 | default: |
267 | s = ""; | |
268 | } s; }), | |
269 | DWC3_TRB_SIZE_LENGTH(__entry->size), __entry->ctrl, | |
22f2c619 JD |
270 | __entry->ctrl & DWC3_TRB_CTRL_HWO ? 'H' : 'h', |
271 | __entry->ctrl & DWC3_TRB_CTRL_LST ? 'L' : 'l', | |
272 | __entry->ctrl & DWC3_TRB_CTRL_CHN ? 'C' : 'c', | |
273 | __entry->ctrl & DWC3_TRB_CTRL_CSP ? 'S' : 's', | |
274 | __entry->ctrl & DWC3_TRB_CTRL_ISP_IMI ? 'S' : 's', | |
275 | __entry->ctrl & DWC3_TRB_CTRL_IOC ? 'C' : 'c', | |
b5c7ed5c | 276 | dwc3_trb_type_string(DWC3_TRBCTL_TYPE(__entry->ctrl)) |
2c4cbe6e FB |
277 | ) |
278 | ); | |
279 | ||
280 | DEFINE_EVENT(dwc3_log_trb, dwc3_prepare_trb, | |
281 | TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), | |
282 | TP_ARGS(dep, trb) | |
283 | ); | |
284 | ||
285 | DEFINE_EVENT(dwc3_log_trb, dwc3_complete_trb, | |
286 | TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), | |
287 | TP_ARGS(dep, trb) | |
288 | ); | |
289 | ||
2870e501 FB |
290 | DECLARE_EVENT_CLASS(dwc3_log_ep, |
291 | TP_PROTO(struct dwc3_ep *dep), | |
292 | TP_ARGS(dep), | |
293 | TP_STRUCT__entry( | |
e42f09b8 | 294 | __string(name, dep->name) |
159fdf29 FB |
295 | __field(unsigned int, maxpacket) |
296 | __field(unsigned int, maxpacket_limit) | |
297 | __field(unsigned int, max_streams) | |
298 | __field(unsigned int, maxburst) | |
299 | __field(unsigned int, flags) | |
300 | __field(unsigned int, direction) | |
2870e501 FB |
301 | __field(u8, trb_enqueue) |
302 | __field(u8, trb_dequeue) | |
303 | ), | |
304 | TP_fast_assign( | |
e42f09b8 | 305 | __assign_str(name, dep->name); |
2870e501 FB |
306 | __entry->maxpacket = dep->endpoint.maxpacket; |
307 | __entry->maxpacket_limit = dep->endpoint.maxpacket_limit; | |
308 | __entry->max_streams = dep->endpoint.max_streams; | |
309 | __entry->maxburst = dep->endpoint.maxburst; | |
310 | __entry->flags = dep->flags; | |
311 | __entry->direction = dep->direction; | |
312 | __entry->trb_enqueue = dep->trb_enqueue; | |
313 | __entry->trb_dequeue = dep->trb_dequeue; | |
314 | ), | |
3aec9915 | 315 | TP_printk("%s: mps %d/%d streams %d burst %d ring %d/%d flags %c:%c%c%c%c:%c", |
2870e501 FB |
316 | __get_str(name), __entry->maxpacket, |
317 | __entry->maxpacket_limit, __entry->max_streams, | |
318 | __entry->maxburst, __entry->trb_enqueue, | |
319 | __entry->trb_dequeue, | |
320 | __entry->flags & DWC3_EP_ENABLED ? 'E' : 'e', | |
321 | __entry->flags & DWC3_EP_STALL ? 'S' : 's', | |
322 | __entry->flags & DWC3_EP_WEDGE ? 'W' : 'w', | |
5f2e7975 | 323 | __entry->flags & DWC3_EP_TRANSFER_STARTED ? 'B' : 'b', |
2870e501 | 324 | __entry->flags & DWC3_EP_PENDING_REQUEST ? 'P' : 'p', |
2870e501 FB |
325 | __entry->direction ? '<' : '>' |
326 | ) | |
327 | ); | |
328 | ||
329 | DEFINE_EVENT(dwc3_log_ep, dwc3_gadget_ep_enable, | |
330 | TP_PROTO(struct dwc3_ep *dep), | |
331 | TP_ARGS(dep) | |
332 | ); | |
333 | ||
334 | DEFINE_EVENT(dwc3_log_ep, dwc3_gadget_ep_disable, | |
335 | TP_PROTO(struct dwc3_ep *dep), | |
336 | TP_ARGS(dep) | |
337 | ); | |
338 | ||
2c4cbe6e FB |
339 | #endif /* __DWC3_TRACE_H */ |
340 | ||
341 | /* this part has to be here */ | |
342 | ||
343 | #undef TRACE_INCLUDE_PATH | |
344 | #define TRACE_INCLUDE_PATH . | |
345 | ||
346 | #undef TRACE_INCLUDE_FILE | |
347 | #define TRACE_INCLUDE_FILE trace | |
348 | ||
349 | #include <trace/define_trace.h> |