1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /** 3*4882a593Smuzhiyun * mtu3_trace.h - trace support 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2019 MediaTek Inc. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Chunfeng Yun <chunfeng.yun@mediatek.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #undef TRACE_SYSTEM 11*4882a593Smuzhiyun #define TRACE_SYSTEM mtu3 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #if !defined(__MTU3_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ) 14*4882a593Smuzhiyun #define __MTU3_TRACE_H__ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/types.h> 17*4882a593Smuzhiyun #include <linux/tracepoint.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #include "mtu3.h" 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define MTU3_MSG_MAX 256 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun TRACE_EVENT(mtu3_log, 24*4882a593Smuzhiyun TP_PROTO(struct device *dev, struct va_format *vaf), 25*4882a593Smuzhiyun TP_ARGS(dev, vaf), 26*4882a593Smuzhiyun TP_STRUCT__entry( 27*4882a593Smuzhiyun __string(name, dev_name(dev)) 28*4882a593Smuzhiyun __dynamic_array(char, msg, MTU3_MSG_MAX) 29*4882a593Smuzhiyun ), 30*4882a593Smuzhiyun TP_fast_assign( 31*4882a593Smuzhiyun __assign_str(name, dev_name(dev)); 32*4882a593Smuzhiyun vsnprintf(__get_str(msg), MTU3_MSG_MAX, vaf->fmt, *vaf->va); 33*4882a593Smuzhiyun ), 34*4882a593Smuzhiyun TP_printk("%s: %s", __get_str(name), __get_str(msg)) 35*4882a593Smuzhiyun ); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TRACE_EVENT(mtu3_u3_ltssm_isr, 38*4882a593Smuzhiyun TP_PROTO(u32 intr), 39*4882a593Smuzhiyun TP_ARGS(intr), 40*4882a593Smuzhiyun TP_STRUCT__entry( 41*4882a593Smuzhiyun __field(u32, intr) 42*4882a593Smuzhiyun ), 43*4882a593Smuzhiyun TP_fast_assign( 44*4882a593Smuzhiyun __entry->intr = intr; 45*4882a593Smuzhiyun ), 46*4882a593Smuzhiyun TP_printk("(%08x) %s %s %s %s %s %s", __entry->intr, 47*4882a593Smuzhiyun __entry->intr & HOT_RST_INTR ? "HOT_RST" : "", 48*4882a593Smuzhiyun __entry->intr & WARM_RST_INTR ? "WARM_RST" : "", 49*4882a593Smuzhiyun __entry->intr & ENTER_U3_INTR ? "ENT_U3" : "", 50*4882a593Smuzhiyun __entry->intr & EXIT_U3_INTR ? "EXIT_U3" : "", 51*4882a593Smuzhiyun __entry->intr & VBUS_RISE_INTR ? "VBUS_RISE" : "", 52*4882a593Smuzhiyun __entry->intr & VBUS_FALL_INTR ? "VBUS_FALL" : "" 53*4882a593Smuzhiyun ) 54*4882a593Smuzhiyun ); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun TRACE_EVENT(mtu3_u2_common_isr, 57*4882a593Smuzhiyun TP_PROTO(u32 intr), 58*4882a593Smuzhiyun TP_ARGS(intr), 59*4882a593Smuzhiyun TP_STRUCT__entry( 60*4882a593Smuzhiyun __field(u32, intr) 61*4882a593Smuzhiyun ), 62*4882a593Smuzhiyun TP_fast_assign( 63*4882a593Smuzhiyun __entry->intr = intr; 64*4882a593Smuzhiyun ), 65*4882a593Smuzhiyun TP_printk("(%08x) %s %s %s", __entry->intr, 66*4882a593Smuzhiyun __entry->intr & SUSPEND_INTR ? "SUSPEND" : "", 67*4882a593Smuzhiyun __entry->intr & RESUME_INTR ? "RESUME" : "", 68*4882a593Smuzhiyun __entry->intr & RESET_INTR ? "RESET" : "" 69*4882a593Smuzhiyun ) 70*4882a593Smuzhiyun ); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun TRACE_EVENT(mtu3_qmu_isr, 73*4882a593Smuzhiyun TP_PROTO(u32 done_intr, u32 exp_intr), 74*4882a593Smuzhiyun TP_ARGS(done_intr, exp_intr), 75*4882a593Smuzhiyun TP_STRUCT__entry( 76*4882a593Smuzhiyun __field(u32, done_intr) 77*4882a593Smuzhiyun __field(u32, exp_intr) 78*4882a593Smuzhiyun ), 79*4882a593Smuzhiyun TP_fast_assign( 80*4882a593Smuzhiyun __entry->done_intr = done_intr; 81*4882a593Smuzhiyun __entry->exp_intr = exp_intr; 82*4882a593Smuzhiyun ), 83*4882a593Smuzhiyun TP_printk("done (tx %04x, rx %04x), exp (%08x)", 84*4882a593Smuzhiyun __entry->done_intr & 0xffff, 85*4882a593Smuzhiyun __entry->done_intr >> 16, 86*4882a593Smuzhiyun __entry->exp_intr 87*4882a593Smuzhiyun ) 88*4882a593Smuzhiyun ); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mtu3_log_setup, 91*4882a593Smuzhiyun TP_PROTO(struct usb_ctrlrequest *setup), 92*4882a593Smuzhiyun TP_ARGS(setup), 93*4882a593Smuzhiyun TP_STRUCT__entry( 94*4882a593Smuzhiyun __field(__u8, bRequestType) 95*4882a593Smuzhiyun __field(__u8, bRequest) 96*4882a593Smuzhiyun __field(__u16, wValue) 97*4882a593Smuzhiyun __field(__u16, wIndex) 98*4882a593Smuzhiyun __field(__u16, wLength) 99*4882a593Smuzhiyun ), 100*4882a593Smuzhiyun TP_fast_assign( 101*4882a593Smuzhiyun __entry->bRequestType = setup->bRequestType; 102*4882a593Smuzhiyun __entry->bRequest = setup->bRequest; 103*4882a593Smuzhiyun __entry->wValue = le16_to_cpu(setup->wValue); 104*4882a593Smuzhiyun __entry->wIndex = le16_to_cpu(setup->wIndex); 105*4882a593Smuzhiyun __entry->wLength = le16_to_cpu(setup->wLength); 106*4882a593Smuzhiyun ), 107*4882a593Smuzhiyun TP_printk("setup - %02x %02x %04x %04x %04x", 108*4882a593Smuzhiyun __entry->bRequestType, __entry->bRequest, 109*4882a593Smuzhiyun __entry->wValue, __entry->wIndex, __entry->wLength 110*4882a593Smuzhiyun ) 111*4882a593Smuzhiyun ); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_setup, mtu3_handle_setup, 114*4882a593Smuzhiyun TP_PROTO(struct usb_ctrlrequest *setup), 115*4882a593Smuzhiyun TP_ARGS(setup) 116*4882a593Smuzhiyun ); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mtu3_log_request, 119*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *mreq), 120*4882a593Smuzhiyun TP_ARGS(mreq), 121*4882a593Smuzhiyun TP_STRUCT__entry( 122*4882a593Smuzhiyun __string(name, mreq->mep->name) 123*4882a593Smuzhiyun __field(struct mtu3_request *, mreq) 124*4882a593Smuzhiyun __field(struct qmu_gpd *, gpd) 125*4882a593Smuzhiyun __field(unsigned int, actual) 126*4882a593Smuzhiyun __field(unsigned int, length) 127*4882a593Smuzhiyun __field(int, status) 128*4882a593Smuzhiyun __field(int, zero) 129*4882a593Smuzhiyun __field(int, no_interrupt) 130*4882a593Smuzhiyun ), 131*4882a593Smuzhiyun TP_fast_assign( 132*4882a593Smuzhiyun __assign_str(name, mreq->mep->name); 133*4882a593Smuzhiyun __entry->mreq = mreq; 134*4882a593Smuzhiyun __entry->gpd = mreq->gpd; 135*4882a593Smuzhiyun __entry->actual = mreq->request.actual; 136*4882a593Smuzhiyun __entry->length = mreq->request.length; 137*4882a593Smuzhiyun __entry->status = mreq->request.status; 138*4882a593Smuzhiyun __entry->zero = mreq->request.zero; 139*4882a593Smuzhiyun __entry->no_interrupt = mreq->request.no_interrupt; 140*4882a593Smuzhiyun ), 141*4882a593Smuzhiyun TP_printk("%s: req %p gpd %p len %u/%u %s%s --> %d", 142*4882a593Smuzhiyun __get_str(name), __entry->mreq, __entry->gpd, 143*4882a593Smuzhiyun __entry->actual, __entry->length, 144*4882a593Smuzhiyun __entry->zero ? "Z" : "z", 145*4882a593Smuzhiyun __entry->no_interrupt ? "i" : "I", 146*4882a593Smuzhiyun __entry->status 147*4882a593Smuzhiyun ) 148*4882a593Smuzhiyun ); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_request, mtu3_alloc_request, 151*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *req), 152*4882a593Smuzhiyun TP_ARGS(req) 153*4882a593Smuzhiyun ); 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_request, mtu3_free_request, 156*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *req), 157*4882a593Smuzhiyun TP_ARGS(req) 158*4882a593Smuzhiyun ); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_request, mtu3_gadget_queue, 161*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *req), 162*4882a593Smuzhiyun TP_ARGS(req) 163*4882a593Smuzhiyun ); 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_request, mtu3_gadget_dequeue, 166*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *req), 167*4882a593Smuzhiyun TP_ARGS(req) 168*4882a593Smuzhiyun ); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_request, mtu3_req_complete, 171*4882a593Smuzhiyun TP_PROTO(struct mtu3_request *req), 172*4882a593Smuzhiyun TP_ARGS(req) 173*4882a593Smuzhiyun ); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mtu3_log_gpd, 176*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd), 177*4882a593Smuzhiyun TP_ARGS(mep, gpd), 178*4882a593Smuzhiyun TP_STRUCT__entry( 179*4882a593Smuzhiyun __string(name, mep->name) 180*4882a593Smuzhiyun __field(struct qmu_gpd *, gpd) 181*4882a593Smuzhiyun __field(u32, dw0) 182*4882a593Smuzhiyun __field(u32, dw1) 183*4882a593Smuzhiyun __field(u32, dw2) 184*4882a593Smuzhiyun __field(u32, dw3) 185*4882a593Smuzhiyun ), 186*4882a593Smuzhiyun TP_fast_assign( 187*4882a593Smuzhiyun __assign_str(name, mep->name); 188*4882a593Smuzhiyun __entry->gpd = gpd; 189*4882a593Smuzhiyun __entry->dw0 = le32_to_cpu(gpd->dw0_info); 190*4882a593Smuzhiyun __entry->dw1 = le32_to_cpu(gpd->next_gpd); 191*4882a593Smuzhiyun __entry->dw2 = le32_to_cpu(gpd->buffer); 192*4882a593Smuzhiyun __entry->dw3 = le32_to_cpu(gpd->dw3_info); 193*4882a593Smuzhiyun ), 194*4882a593Smuzhiyun TP_printk("%s: gpd %p - %08x %08x %08x %08x", 195*4882a593Smuzhiyun __get_str(name), __entry->gpd, 196*4882a593Smuzhiyun __entry->dw0, __entry->dw1, 197*4882a593Smuzhiyun __entry->dw2, __entry->dw3 198*4882a593Smuzhiyun ) 199*4882a593Smuzhiyun ); 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_gpd, mtu3_prepare_gpd, 202*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd), 203*4882a593Smuzhiyun TP_ARGS(mep, gpd) 204*4882a593Smuzhiyun ); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_gpd, mtu3_complete_gpd, 207*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd), 208*4882a593Smuzhiyun TP_ARGS(mep, gpd) 209*4882a593Smuzhiyun ); 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_gpd, mtu3_zlp_exp_gpd, 212*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd), 213*4882a593Smuzhiyun TP_ARGS(mep, gpd) 214*4882a593Smuzhiyun ); 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mtu3_log_ep, 217*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep), 218*4882a593Smuzhiyun TP_ARGS(mep), 219*4882a593Smuzhiyun TP_STRUCT__entry( 220*4882a593Smuzhiyun __string(name, mep->name) 221*4882a593Smuzhiyun __field(unsigned int, type) 222*4882a593Smuzhiyun __field(unsigned int, slot) 223*4882a593Smuzhiyun __field(unsigned int, maxp) 224*4882a593Smuzhiyun __field(unsigned int, mult) 225*4882a593Smuzhiyun __field(unsigned int, maxburst) 226*4882a593Smuzhiyun __field(unsigned int, flags) 227*4882a593Smuzhiyun __field(unsigned int, direction) 228*4882a593Smuzhiyun __field(struct mtu3_gpd_ring *, gpd_ring) 229*4882a593Smuzhiyun ), 230*4882a593Smuzhiyun TP_fast_assign( 231*4882a593Smuzhiyun __assign_str(name, mep->name); 232*4882a593Smuzhiyun __entry->type = mep->type; 233*4882a593Smuzhiyun __entry->slot = mep->slot; 234*4882a593Smuzhiyun __entry->maxp = mep->ep.maxpacket; 235*4882a593Smuzhiyun __entry->mult = mep->ep.mult; 236*4882a593Smuzhiyun __entry->maxburst = mep->ep.maxburst; 237*4882a593Smuzhiyun __entry->flags = mep->flags; 238*4882a593Smuzhiyun __entry->direction = mep->is_in; 239*4882a593Smuzhiyun __entry->gpd_ring = &mep->gpd_ring; 240*4882a593Smuzhiyun ), 241*4882a593Smuzhiyun TP_printk("%s: type %d maxp %d slot %d mult %d burst %d ring %p/%pad flags %c:%c%c%c:%c", 242*4882a593Smuzhiyun __get_str(name), __entry->type, 243*4882a593Smuzhiyun __entry->maxp, __entry->slot, 244*4882a593Smuzhiyun __entry->mult, __entry->maxburst, 245*4882a593Smuzhiyun __entry->gpd_ring, &__entry->gpd_ring->dma, 246*4882a593Smuzhiyun __entry->flags & MTU3_EP_ENABLED ? 'E' : 'e', 247*4882a593Smuzhiyun __entry->flags & MTU3_EP_STALL ? 'S' : 's', 248*4882a593Smuzhiyun __entry->flags & MTU3_EP_WEDGE ? 'W' : 'w', 249*4882a593Smuzhiyun __entry->flags & MTU3_EP_BUSY ? 'B' : 'b', 250*4882a593Smuzhiyun __entry->direction ? '<' : '>' 251*4882a593Smuzhiyun ) 252*4882a593Smuzhiyun ); 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_enable, 255*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep), 256*4882a593Smuzhiyun TP_ARGS(mep) 257*4882a593Smuzhiyun ); 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_disable, 260*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep), 261*4882a593Smuzhiyun TP_ARGS(mep) 262*4882a593Smuzhiyun ); 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun DEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_set_halt, 265*4882a593Smuzhiyun TP_PROTO(struct mtu3_ep *mep), 266*4882a593Smuzhiyun TP_ARGS(mep) 267*4882a593Smuzhiyun ); 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun #endif /* __MTU3_TRACE_H__ */ 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* this part has to be here */ 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 274*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 277*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE mtu3_trace 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #include <trace/define_trace.h> 280