2 * trace.h - DesignWare USB3 DRD Controller Trace Support
4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
6 * Author: Felipe Balbi <balbi@ti.com>
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 of
10 * the License as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
19 #define TRACE_SYSTEM dwc3
21 #if !defined(__DWC3_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
22 #define __DWC3_TRACE_H
24 #include <linux/types.h>
25 #include <linux/tracepoint.h>
26 #include <asm/byteorder.h>
30 DECLARE_EVENT_CLASS(dwc3_log_msg
,
31 TP_PROTO(struct va_format
*vaf
),
33 TP_STRUCT__entry(__dynamic_array(char, msg
, DWC3_MSG_MAX
)),
35 vsnprintf(__get_str(msg
), DWC3_MSG_MAX
, vaf
->fmt
, *vaf
->va
);
37 TP_printk("%s", __get_str(msg
))
40 DEFINE_EVENT(dwc3_log_msg
, dwc3_readl
,
41 TP_PROTO(struct va_format
*vaf
),
45 DEFINE_EVENT(dwc3_log_msg
, dwc3_writel
,
46 TP_PROTO(struct va_format
*vaf
),
50 DEFINE_EVENT(dwc3_log_msg
, dwc3_gadget
,
51 TP_PROTO(struct va_format
*vaf
),
55 DEFINE_EVENT(dwc3_log_msg
, dwc3_core
,
56 TP_PROTO(struct va_format
*vaf
),
60 DEFINE_EVENT(dwc3_log_msg
, dwc3_ep0
,
61 TP_PROTO(struct va_format
*vaf
),
65 DECLARE_EVENT_CLASS(dwc3_log_event
,
72 __entry
->event
= event
;
74 TP_printk("event (%08x): %s", __entry
->event
,
75 dwc3_decode_event(__entry
->event
))
78 DEFINE_EVENT(dwc3_log_event
, dwc3_event
,
83 DECLARE_EVENT_CLASS(dwc3_log_ctrl
,
84 TP_PROTO(struct usb_ctrlrequest
*ctrl
),
87 __field(__u8
, bRequestType
)
88 __field(__u8
, bRequest
)
89 __field(__u16
, wValue
)
90 __field(__u16
, wIndex
)
91 __field(__u16
, wLength
)
94 __entry
->bRequestType
= ctrl
->bRequestType
;
95 __entry
->bRequest
= ctrl
->bRequest
;
96 __entry
->wValue
= le16_to_cpu(ctrl
->wValue
);
97 __entry
->wIndex
= le16_to_cpu(ctrl
->wIndex
);
98 __entry
->wLength
= le16_to_cpu(ctrl
->wLength
);
100 TP_printk("bRequestType %02x bRequest %02x wValue %04x wIndex %04x wLength %d",
101 __entry
->bRequestType
, __entry
->bRequest
,
102 __entry
->wValue
, __entry
->wIndex
,
107 DEFINE_EVENT(dwc3_log_ctrl
, dwc3_ctrl_req
,
108 TP_PROTO(struct usb_ctrlrequest
*ctrl
),
112 DECLARE_EVENT_CLASS(dwc3_log_request
,
113 TP_PROTO(struct dwc3_request
*req
),
116 __dynamic_array(char, name
, DWC3_MSG_MAX
)
117 __field(struct dwc3_request
*, req
)
118 __field(unsigned, actual
)
119 __field(unsigned, length
)
122 __field(int, short_not_ok
)
123 __field(int, no_interrupt
)
126 snprintf(__get_str(name
), DWC3_MSG_MAX
, "%s", req
->dep
->name
);
128 __entry
->actual
= req
->request
.actual
;
129 __entry
->length
= req
->request
.length
;
130 __entry
->status
= req
->request
.status
;
131 __entry
->zero
= req
->request
.zero
;
132 __entry
->short_not_ok
= req
->request
.short_not_ok
;
133 __entry
->no_interrupt
= req
->request
.no_interrupt
;
135 TP_printk("%s: req %p length %u/%u %s%s%s ==> %d",
136 __get_str(name
), __entry
->req
, __entry
->actual
, __entry
->length
,
137 __entry
->zero
? "Z" : "z",
138 __entry
->short_not_ok
? "S" : "s",
139 __entry
->no_interrupt
? "i" : "I",
144 DEFINE_EVENT(dwc3_log_request
, dwc3_alloc_request
,
145 TP_PROTO(struct dwc3_request
*req
),
149 DEFINE_EVENT(dwc3_log_request
, dwc3_free_request
,
150 TP_PROTO(struct dwc3_request
*req
),
154 DEFINE_EVENT(dwc3_log_request
, dwc3_ep_queue
,
155 TP_PROTO(struct dwc3_request
*req
),
159 DEFINE_EVENT(dwc3_log_request
, dwc3_ep_dequeue
,
160 TP_PROTO(struct dwc3_request
*req
),
164 DEFINE_EVENT(dwc3_log_request
, dwc3_gadget_giveback
,
165 TP_PROTO(struct dwc3_request
*req
),
169 DECLARE_EVENT_CLASS(dwc3_log_generic_cmd
,
170 TP_PROTO(unsigned int cmd
, u32 param
, int status
),
171 TP_ARGS(cmd
, param
, status
),
173 __field(unsigned int, cmd
)
179 __entry
->param
= param
;
180 __entry
->status
= status
;
182 TP_printk("cmd '%s' [%d] param %08x --> status: %s",
183 dwc3_gadget_generic_cmd_string(__entry
->cmd
),
184 __entry
->cmd
, __entry
->param
,
185 dwc3_gadget_generic_cmd_status_string(__entry
->status
)
189 DEFINE_EVENT(dwc3_log_generic_cmd
, dwc3_gadget_generic_cmd
,
190 TP_PROTO(unsigned int cmd
, u32 param
, int status
),
191 TP_ARGS(cmd
, param
, status
)
194 DECLARE_EVENT_CLASS(dwc3_log_gadget_ep_cmd
,
195 TP_PROTO(struct dwc3_ep
*dep
, unsigned int cmd
,
196 struct dwc3_gadget_ep_cmd_params
*params
, int cmd_status
),
197 TP_ARGS(dep
, cmd
, params
, cmd_status
),
199 __dynamic_array(char, name
, DWC3_MSG_MAX
)
200 __field(unsigned int, cmd
)
204 __field(int, cmd_status
)
207 snprintf(__get_str(name
), DWC3_MSG_MAX
, "%s", dep
->name
);
209 __entry
->param0
= params
->param0
;
210 __entry
->param1
= params
->param1
;
211 __entry
->param2
= params
->param2
;
212 __entry
->cmd_status
= cmd_status
;
214 TP_printk("%s: cmd '%s' [%d] params %08x %08x %08x --> status: %s",
215 __get_str(name
), dwc3_gadget_ep_cmd_string(__entry
->cmd
),
216 __entry
->cmd
, __entry
->param0
,
217 __entry
->param1
, __entry
->param2
,
218 dwc3_ep_cmd_status_string(__entry
->cmd_status
)
222 DEFINE_EVENT(dwc3_log_gadget_ep_cmd
, dwc3_gadget_ep_cmd
,
223 TP_PROTO(struct dwc3_ep
*dep
, unsigned int cmd
,
224 struct dwc3_gadget_ep_cmd_params
*params
, int cmd_status
),
225 TP_ARGS(dep
, cmd
, params
, cmd_status
)
228 DECLARE_EVENT_CLASS(dwc3_log_trb
,
229 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
232 __dynamic_array(char, name
, DWC3_MSG_MAX
)
233 __field(struct dwc3_trb
*, trb
)
234 __field(u32
, allocated
)
242 snprintf(__get_str(name
), DWC3_MSG_MAX
, "%s", dep
->name
);
244 __entry
->allocated
= dep
->allocated_requests
;
245 __entry
->queued
= dep
->queued_requests
;
246 __entry
->bpl
= trb
->bpl
;
247 __entry
->bph
= trb
->bph
;
248 __entry
->size
= trb
->size
;
249 __entry
->ctrl
= trb
->ctrl
;
251 TP_printk("%s: %d/%d trb %p buf %08x%08x size %d ctrl %08x (%c%c%c%c:%c%c:%s)",
252 __get_str(name
), __entry
->queued
, __entry
->allocated
,
253 __entry
->trb
, __entry
->bph
, __entry
->bpl
,
254 __entry
->size
, __entry
->ctrl
,
255 __entry
->ctrl
& DWC3_TRB_CTRL_HWO
? 'H' : 'h',
256 __entry
->ctrl
& DWC3_TRB_CTRL_LST
? 'L' : 'l',
257 __entry
->ctrl
& DWC3_TRB_CTRL_CHN
? 'C' : 'c',
258 __entry
->ctrl
& DWC3_TRB_CTRL_CSP
? 'S' : 's',
259 __entry
->ctrl
& DWC3_TRB_CTRL_ISP_IMI
? 'S' : 's',
260 __entry
->ctrl
& DWC3_TRB_CTRL_IOC
? 'C' : 'c',
262 switch (__entry
->ctrl
& 0x3f0) {
263 case DWC3_TRBCTL_NORMAL
:
266 case DWC3_TRBCTL_CONTROL_SETUP
:
269 case DWC3_TRBCTL_CONTROL_STATUS2
:
272 case DWC3_TRBCTL_CONTROL_STATUS3
:
275 case DWC3_TRBCTL_CONTROL_DATA
:
278 case DWC3_TRBCTL_ISOCHRONOUS_FIRST
:
281 case DWC3_TRBCTL_ISOCHRONOUS
:
284 case DWC3_TRBCTL_LINK_TRB
:
294 DEFINE_EVENT(dwc3_log_trb
, dwc3_prepare_trb
,
295 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
299 DEFINE_EVENT(dwc3_log_trb
, dwc3_complete_trb
,
300 TP_PROTO(struct dwc3_ep
*dep
, struct dwc3_trb
*trb
),
304 #endif /* __DWC3_TRACE_H */
306 /* this part has to be here */
308 #undef TRACE_INCLUDE_PATH
309 #define TRACE_INCLUDE_PATH .
311 #undef TRACE_INCLUDE_FILE
312 #define TRACE_INCLUDE_FILE trace
314 #include <trace/define_trace.h>