1 // SPDX-License-Identifier: GPL-2.0
3 * trace.h - DesignWare USB3 DRD Controller Trace Support
5 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
7 * Author: Felipe Balbi <balbi@ti.com>
11 #define TRACE_SYSTEM dwc3
13 #if !defined(__DWC3_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
14 #define __DWC3_TRACE_H
16 #include <linux/types.h>
17 #include <linux/tracepoint.h>
18 #include <asm/byteorder.h>
22 DECLARE_EVENT_CLASS(dwc3_log_io
,
23 TP_PROTO(void *base
, u32 offset
, u32 value
),
24 TP_ARGS(base
, offset
, value
),
32 __entry
->offset
= offset
;
33 __entry
->value
= value
;
35 TP_printk("addr %p value %08x", __entry
->base
+ __entry
->offset
,
39 DEFINE_EVENT(dwc3_log_io
, dwc3_readl
,
40 TP_PROTO(void __iomem
*base
, u32 offset
, u32 value
),
41 TP_ARGS(base
, offset
, value
)
44 DEFINE_EVENT(dwc3_log_io
, dwc3_writel
,
45 TP_PROTO(void __iomem
*base
, u32 offset
, u32 value
),
46 TP_ARGS(base
, offset
, value
)
49 DECLARE_EVENT_CLASS(dwc3_log_event
,
50 TP_PROTO(u32 event
, struct dwc3
*dwc
),
54 __field(u32
, ep0state
)
55 __dynamic_array(char, str
, DWC3_MSG_MAX
)
58 __entry
->event
= event
;
59 __entry
->ep0state
= dwc
->ep0state
;
61 TP_printk("event (%08x): %s", __entry
->event
,
62 dwc3_decode_event(__get_str(str
), DWC3_MSG_MAX
,
63 __entry
->event
, __entry
->ep0state
))
66 DEFINE_EVENT(dwc3_log_event
, dwc3_event
,
67 TP_PROTO(u32 event
, struct dwc3
*dwc
),
71 DECLARE_EVENT_CLASS(dwc3_log_ctrl
,
72 TP_PROTO(struct usb_ctrlrequest
*ctrl
),
75 __field(__u8
, bRequestType
)
76 __field(__u8
, bRequest
)
77 __field(__u16
, wValue
)
78 __field(__u16
, wIndex
)
79 __field(__u16
, wLength
)
80 __dynamic_array(char, str
, DWC3_MSG_MAX
)
83 __entry
->bRequestType
= ctrl
->bRequestType
;
84 __entry
->bRequest
= ctrl
->bRequest
;
85 __entry
->wValue
= le16_to_cpu(ctrl
->wValue
);
86 __entry
->wIndex
= le16_to_cpu(ctrl
->wIndex
);
87 __entry
->wLength
= le16_to_cpu(ctrl
->wLength
);
89 TP_printk("%s", usb_decode_ctrl(__get_str(str
), DWC3_MSG_MAX
,
90 __entry
->bRequestType
,
91 __entry
->bRequest
, __entry
->wValue
,
92 __entry
->wIndex
, __entry
->wLength
)
96 DEFINE_EVENT(dwc3_log_ctrl
, dwc3_ctrl_req
,
97 TP_PROTO(struct usb_ctrlrequest
*ctrl
),
101 DECLARE_EVENT_CLASS(dwc3_log_request
,
102 TP_PROTO(struct dwc3_request
*req
),
105 __string(name
, req
->dep
->name
)
106 __field(struct dwc3_request
*, req
)
107 __field(unsigned, actual
)
108 __field(unsigned, length
)
111 __field(int, short_not_ok
)
112 __field(int, no_interrupt
)
115 __assign_str(name
, req
->dep
->name
);
117 __entry
->actual
= req
->request
.actual
;
118 __entry
->length
= req
->request
.length
;
119 __entry
->status
= req
->request
.status
;
120 __entry
->zero
= req
->request
.zero
;
121 __entry
->short_not_ok
= req
->request
.short_not_ok
;
122 __entry
->no_interrupt
= req
->request
.no_interrupt
;
124 TP_printk("%s: req %p length %u/%u %s%s%s ==> %d",
125 __get_str(name
), __entry
->req
, __entry
->actual
, __entry
->length
,
126 __entry
->zero
? "Z" : "z",
127 __entry
->short_not_ok
? "S" : "s",
128 __entry
->no_interrupt
? "i" : "I",
133 DEFINE_EVENT(dwc3_log_request
, dwc3_alloc_request
,
134 TP_PROTO(struct dwc3_request
*req
),
138 DEFINE_EVENT(dwc3_log_request
, dwc3_free_request
,
139 TP_PROTO(struct dwc3_request
*req
),
143 DEFINE_EVENT(dwc3_log_request
, dwc3_ep_queue
,
144 TP_PROTO(struct dwc3_request
*req
),
148 DEFINE_EVENT(dwc3_log_request
, dwc3_ep_dequeue
,
149 TP_PROTO(struct dwc3_request
*req
),
153 DEFINE_EVENT(dwc3_log_request
, dwc3_gadget_giveback
,
154 TP_PROTO(struct dwc3_request
*req
),
158 DECLARE_EVENT_CLASS(dwc3_log_generic_cmd
,
159 TP_PROTO(unsigned int cmd
, u32 param
, int status
),
160 TP_ARGS(cmd
, param
, status
),
162 __field(unsigned int, cmd
)
168 __entry
->param
= param
;
169 __entry
->status
= status
;
171 TP_printk("cmd '%s' [%x] param %08x --> status: %s",
172 dwc3_gadget_generic_cmd_string(__entry
->cmd
),
173 __entry
->cmd
, __entry
->param
,
174 dwc3_gadget_generic_cmd_status_string(__entry
->status
)
178 DEFINE_EVENT(dwc3_log_generic_cmd
, dwc3_gadget_generic_cmd
,
179 TP_PROTO(unsigned int cmd
, u32 param
, int status
),
180 TP_ARGS(cmd
, param
, status
)
183 DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd
,
184 TP_PROTO(struct dwc3_ep
*dep
, unsigned int cmd
,
185 struct dwc3_gadget_ep_cmd_params
*params
, int cmd_status
),
186 TP_ARGS(dep
, cmd
, params
, cmd_status
),
188 __string(name
, dep
->name
)
189 __field(unsigned int, cmd
)
193 __field(int, cmd_status
)
196 __assign_str(name
, dep
->name
);
198 __entry
->param0
= params
->param0
;
199 __entry
->param1
= params
->param1
;
200 __entry
->param2
= params
->param2
;
201 __entry
->cmd_status
= cmd_status
;
203 TP_printk("%s: cmd '%s' [%x] params %08x %08x %08x --> status: %s",
204 __get_str(name
), dwc3_gadget_ep_cmd_string(__entry
->cmd
),
205 __entry
->cmd
, __entry
->param0
,
206 __entry
->param1
, __entry
->param2
,
207 dwc3_ep_cmd_status_string(__entry
->cmd_status
)
211 DEFINE_EVENT(dwc3_log_gadget_ep_cmd
, dwc3_gadget_ep_cmd
,
212 TP_PROTO(struct dwc3_ep
*dep
, unsigned int cmd
,
213 struct dwc3_gadget_ep_cmd_params
*params
, int cmd_status
),
214 TP_ARGS(dep
, cmd
, params
, cmd_status
)
217 DECLARE_EVENT_CLASS(dwc3_log_trb
,
218 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
221 __string(name
, dep
->name
)
222 __field(struct dwc3_trb
*, trb
)
223 __field(u32
, allocated
)
232 __assign_str(name
, dep
->name
);
234 __entry
->bpl
= trb
->bpl
;
235 __entry
->bph
= trb
->bph
;
236 __entry
->size
= trb
->size
;
237 __entry
->ctrl
= trb
->ctrl
;
238 __entry
->type
= usb_endpoint_type(dep
->endpoint
.desc
);
240 TP_printk("%s: trb %p buf %08x%08x size %s%d ctrl %08x (%c%c%c%c:%c%c:%s)",
241 __get_str(name
), __entry
->trb
, __entry
->bph
, __entry
->bpl
,
243 int pcm
= ((__entry
->size
>> 24) & 3) + 1;
244 switch (__entry
->type
) {
245 case USB_ENDPOINT_XFER_INT
:
246 case USB_ENDPOINT_XFER_ISOC
:
263 DWC3_TRB_SIZE_LENGTH(__entry
->size
), __entry
->ctrl
,
264 __entry
->ctrl
& DWC3_TRB_CTRL_HWO
? 'H' : 'h',
265 __entry
->ctrl
& DWC3_TRB_CTRL_LST
? 'L' : 'l',
266 __entry
->ctrl
& DWC3_TRB_CTRL_CHN
? 'C' : 'c',
267 __entry
->ctrl
& DWC3_TRB_CTRL_CSP
? 'S' : 's',
268 __entry
->ctrl
& DWC3_TRB_CTRL_ISP_IMI
? 'S' : 's',
269 __entry
->ctrl
& DWC3_TRB_CTRL_IOC
? 'C' : 'c',
270 dwc3_trb_type_string(DWC3_TRBCTL_TYPE(__entry
->ctrl
))
274 DEFINE_EVENT(dwc3_log_trb
, dwc3_prepare_trb
,
275 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
279 DEFINE_EVENT(dwc3_log_trb
, dwc3_complete_trb
,
280 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
284 DECLARE_EVENT_CLASS(dwc3_log_ep
,
285 TP_PROTO(struct dwc3_ep
*dep
),
288 __string(name
, dep
->name
)
289 __field(unsigned, maxpacket
)
290 __field(unsigned, maxpacket_limit
)
291 __field(unsigned, max_streams
)
292 __field(unsigned, maxburst
)
293 __field(unsigned, flags
)
294 __field(unsigned, direction
)
295 __field(u8
, trb_enqueue
)
296 __field(u8
, trb_dequeue
)
299 __assign_str(name
, dep
->name
);
300 __entry
->maxpacket
= dep
->endpoint
.maxpacket
;
301 __entry
->maxpacket_limit
= dep
->endpoint
.maxpacket_limit
;
302 __entry
->max_streams
= dep
->endpoint
.max_streams
;
303 __entry
->maxburst
= dep
->endpoint
.maxburst
;
304 __entry
->flags
= dep
->flags
;
305 __entry
->direction
= dep
->direction
;
306 __entry
->trb_enqueue
= dep
->trb_enqueue
;
307 __entry
->trb_dequeue
= dep
->trb_dequeue
;
309 TP_printk("%s: mps %d/%d streams %d burst %d ring %d/%d flags %c:%c%c%c%c:%c",
310 __get_str(name
), __entry
->maxpacket
,
311 __entry
->maxpacket_limit
, __entry
->max_streams
,
312 __entry
->maxburst
, __entry
->trb_enqueue
,
313 __entry
->trb_dequeue
,
314 __entry
->flags
& DWC3_EP_ENABLED
? 'E' : 'e',
315 __entry
->flags
& DWC3_EP_STALL
? 'S' : 's',
316 __entry
->flags
& DWC3_EP_WEDGE
? 'W' : 'w',
317 __entry
->flags
& DWC3_EP_TRANSFER_STARTED
? 'B' : 'b',
318 __entry
->flags
& DWC3_EP_PENDING_REQUEST
? 'P' : 'p',
319 __entry
->direction
? '<' : '>'
323 DEFINE_EVENT(dwc3_log_ep
, dwc3_gadget_ep_enable
,
324 TP_PROTO(struct dwc3_ep
*dep
),
328 DEFINE_EVENT(dwc3_log_ep
, dwc3_gadget_ep_disable
,
329 TP_PROTO(struct dwc3_ep
*dep
),
333 #endif /* __DWC3_TRACE_H */
335 /* this part has to be here */
337 #undef TRACE_INCLUDE_PATH
338 #define TRACE_INCLUDE_PATH .
340 #undef TRACE_INCLUDE_FILE
341 #define TRACE_INCLUDE_FILE trace
343 #include <trace/define_trace.h>