1 // SPDX-License-Identifier: GPL-2.0 2 /** 3 * trace.h - DesignWare USB3 DRD Controller Trace Support 4 * 5 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com 6 * 7 * Author: Felipe Balbi <balbi@ti.com> 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 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 ), 35 TP_printk("addr %p value %08x", __entry->base + __entry->offset, 36 __entry->value) 37 ); 38 39 DEFINE_EVENT(dwc3_log_io, dwc3_readl, 40 TP_PROTO(void __iomem *base, u32 offset, u32 value), 41 TP_ARGS(base, offset, value) 42 ); 43 44 DEFINE_EVENT(dwc3_log_io, dwc3_writel, 45 TP_PROTO(void __iomem *base, u32 offset, u32 value), 46 TP_ARGS(base, offset, value) 47 ); 48 49 DECLARE_EVENT_CLASS(dwc3_log_event, 50 TP_PROTO(u32 event, struct dwc3 *dwc), 51 TP_ARGS(event, dwc), 52 TP_STRUCT__entry( 53 __field(u32, event) 54 __field(u32, ep0state) 55 __dynamic_array(char, str, DWC3_MSG_MAX) 56 ), 57 TP_fast_assign( 58 __entry->event = event; 59 __entry->ep0state = dwc->ep0state; 60 ), 61 TP_printk("event (%08x): %s", __entry->event, 62 dwc3_decode_event(__get_str(str), DWC3_MSG_MAX, 63 __entry->event, __entry->ep0state)) 64 ); 65 66 DEFINE_EVENT(dwc3_log_event, dwc3_event, 67 TP_PROTO(u32 event, struct dwc3 *dwc), 68 TP_ARGS(event, dwc) 69 ); 70 71 DECLARE_EVENT_CLASS(dwc3_log_ctrl, 72 TP_PROTO(struct usb_ctrlrequest *ctrl), 73 TP_ARGS(ctrl), 74 TP_STRUCT__entry( 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) 81 ), 82 TP_fast_assign( 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); 88 ), 89 TP_printk("%s", dwc3_decode_ctrl(__get_str(str), DWC3_MSG_MAX, 90 __entry->bRequestType, 91 __entry->bRequest, __entry->wValue, 92 __entry->wIndex, __entry->wLength) 93 ) 94 ); 95 96 DEFINE_EVENT(dwc3_log_ctrl, dwc3_ctrl_req, 97 TP_PROTO(struct usb_ctrlrequest *ctrl), 98 TP_ARGS(ctrl) 99 ); 100 101 DECLARE_EVENT_CLASS(dwc3_log_request, 102 TP_PROTO(struct dwc3_request *req), 103 TP_ARGS(req), 104 TP_STRUCT__entry( 105 __string(name, req->dep->name) 106 __field(struct dwc3_request *, req) 107 __field(unsigned, actual) 108 __field(unsigned, length) 109 __field(int, status) 110 __field(int, zero) 111 __field(int, short_not_ok) 112 __field(int, no_interrupt) 113 ), 114 TP_fast_assign( 115 __assign_str(name, req->dep->name); 116 __entry->req = req; 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; 123 ), 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", 129 __entry->status 130 ) 131 ); 132 133 DEFINE_EVENT(dwc3_log_request, dwc3_alloc_request, 134 TP_PROTO(struct dwc3_request *req), 135 TP_ARGS(req) 136 ); 137 138 DEFINE_EVENT(dwc3_log_request, dwc3_free_request, 139 TP_PROTO(struct dwc3_request *req), 140 TP_ARGS(req) 141 ); 142 143 DEFINE_EVENT(dwc3_log_request, dwc3_ep_queue, 144 TP_PROTO(struct dwc3_request *req), 145 TP_ARGS(req) 146 ); 147 148 DEFINE_EVENT(dwc3_log_request, dwc3_ep_dequeue, 149 TP_PROTO(struct dwc3_request *req), 150 TP_ARGS(req) 151 ); 152 153 DEFINE_EVENT(dwc3_log_request, dwc3_gadget_giveback, 154 TP_PROTO(struct dwc3_request *req), 155 TP_ARGS(req) 156 ); 157 158 DECLARE_EVENT_CLASS(dwc3_log_generic_cmd, 159 TP_PROTO(unsigned int cmd, u32 param, int status), 160 TP_ARGS(cmd, param, status), 161 TP_STRUCT__entry( 162 __field(unsigned int, cmd) 163 __field(u32, param) 164 __field(int, status) 165 ), 166 TP_fast_assign( 167 __entry->cmd = cmd; 168 __entry->param = param; 169 __entry->status = status; 170 ), 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) 175 ) 176 ); 177 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) 181 ); 182 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), 187 TP_STRUCT__entry( 188 __string(name, dep->name) 189 __field(unsigned int, cmd) 190 __field(u32, param0) 191 __field(u32, param1) 192 __field(u32, param2) 193 __field(int, cmd_status) 194 ), 195 TP_fast_assign( 196 __assign_str(name, dep->name); 197 __entry->cmd = cmd; 198 __entry->param0 = params->param0; 199 __entry->param1 = params->param1; 200 __entry->param2 = params->param2; 201 __entry->cmd_status = cmd_status; 202 ), 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) 208 ) 209 ); 210 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) 215 ); 216 217 DECLARE_EVENT_CLASS(dwc3_log_trb, 218 TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), 219 TP_ARGS(dep, trb), 220 TP_STRUCT__entry( 221 __string(name, dep->name) 222 __field(struct dwc3_trb *, trb) 223 __field(u32, allocated) 224 __field(u32, queued) 225 __field(u32, bpl) 226 __field(u32, bph) 227 __field(u32, size) 228 __field(u32, ctrl) 229 __field(u32, type) 230 ), 231 TP_fast_assign( 232 __assign_str(name, dep->name); 233 __entry->trb = trb; 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); 239 ), 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, 242 ({char *s; 243 int pcm = ((__entry->size >> 24) & 3) + 1; 244 switch (__entry->type) { 245 case USB_ENDPOINT_XFER_INT: 246 case USB_ENDPOINT_XFER_ISOC: 247 switch (pcm) { 248 case 1: 249 s = "1x "; 250 break; 251 case 2: 252 s = "2x "; 253 break; 254 case 3: 255 default: 256 s = "3x "; 257 break; 258 } 259 break; 260 default: 261 s = ""; 262 } s; }), 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)) 271 ) 272 ); 273 274 DEFINE_EVENT(dwc3_log_trb, dwc3_prepare_trb, 275 TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), 276 TP_ARGS(dep, trb) 277 ); 278 279 DEFINE_EVENT(dwc3_log_trb, dwc3_complete_trb, 280 TP_PROTO(struct dwc3_ep *dep, struct dwc3_trb *trb), 281 TP_ARGS(dep, trb) 282 ); 283 284 DECLARE_EVENT_CLASS(dwc3_log_ep, 285 TP_PROTO(struct dwc3_ep *dep), 286 TP_ARGS(dep), 287 TP_STRUCT__entry( 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) 297 ), 298 TP_fast_assign( 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; 308 ), 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 ? '<' : '>' 320 ) 321 ); 322 323 DEFINE_EVENT(dwc3_log_ep, dwc3_gadget_ep_enable, 324 TP_PROTO(struct dwc3_ep *dep), 325 TP_ARGS(dep) 326 ); 327 328 DEFINE_EVENT(dwc3_log_ep, dwc3_gadget_ep_disable, 329 TP_PROTO(struct dwc3_ep *dep), 330 TP_ARGS(dep) 331 ); 332 333 #endif /* __DWC3_TRACE_H */ 334 335 /* this part has to be here */ 336 337 #undef TRACE_INCLUDE_PATH 338 #define TRACE_INCLUDE_PATH . 339 340 #undef TRACE_INCLUDE_FILE 341 #define TRACE_INCLUDE_FILE trace 342 343 #include <trace/define_trace.h> 344