18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/**
38c2ecf20Sopenharmony_ci * mtu3_trace.h - trace support
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2019 MediaTek Inc.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM
118c2ecf20Sopenharmony_ci#define TRACE_SYSTEM mtu3
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#if !defined(__MTU3_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
148c2ecf20Sopenharmony_ci#define __MTU3_TRACE_H__
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <linux/types.h>
178c2ecf20Sopenharmony_ci#include <linux/tracepoint.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include "mtu3.h"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define MTU3_MSG_MAX	256
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciTRACE_EVENT(mtu3_log,
248c2ecf20Sopenharmony_ci	TP_PROTO(struct device *dev, struct va_format *vaf),
258c2ecf20Sopenharmony_ci	TP_ARGS(dev, vaf),
268c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
278c2ecf20Sopenharmony_ci		__string(name, dev_name(dev))
288c2ecf20Sopenharmony_ci		__dynamic_array(char, msg, MTU3_MSG_MAX)
298c2ecf20Sopenharmony_ci	),
308c2ecf20Sopenharmony_ci	TP_fast_assign(
318c2ecf20Sopenharmony_ci		__assign_str(name, dev_name(dev));
328c2ecf20Sopenharmony_ci		vsnprintf(__get_str(msg), MTU3_MSG_MAX, vaf->fmt, *vaf->va);
338c2ecf20Sopenharmony_ci	),
348c2ecf20Sopenharmony_ci	TP_printk("%s: %s", __get_str(name), __get_str(msg))
358c2ecf20Sopenharmony_ci);
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ciTRACE_EVENT(mtu3_u3_ltssm_isr,
388c2ecf20Sopenharmony_ci	TP_PROTO(u32 intr),
398c2ecf20Sopenharmony_ci	TP_ARGS(intr),
408c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
418c2ecf20Sopenharmony_ci		__field(u32, intr)
428c2ecf20Sopenharmony_ci	),
438c2ecf20Sopenharmony_ci	TP_fast_assign(
448c2ecf20Sopenharmony_ci		__entry->intr = intr;
458c2ecf20Sopenharmony_ci	),
468c2ecf20Sopenharmony_ci	TP_printk("(%08x) %s %s %s %s %s %s", __entry->intr,
478c2ecf20Sopenharmony_ci		__entry->intr & HOT_RST_INTR ? "HOT_RST" : "",
488c2ecf20Sopenharmony_ci		__entry->intr & WARM_RST_INTR ? "WARM_RST" : "",
498c2ecf20Sopenharmony_ci		__entry->intr & ENTER_U3_INTR ? "ENT_U3" : "",
508c2ecf20Sopenharmony_ci		__entry->intr & EXIT_U3_INTR ? "EXIT_U3" : "",
518c2ecf20Sopenharmony_ci		__entry->intr & VBUS_RISE_INTR ? "VBUS_RISE" : "",
528c2ecf20Sopenharmony_ci		__entry->intr & VBUS_FALL_INTR ? "VBUS_FALL" : ""
538c2ecf20Sopenharmony_ci	)
548c2ecf20Sopenharmony_ci);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ciTRACE_EVENT(mtu3_u2_common_isr,
578c2ecf20Sopenharmony_ci	TP_PROTO(u32 intr),
588c2ecf20Sopenharmony_ci	TP_ARGS(intr),
598c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
608c2ecf20Sopenharmony_ci		__field(u32, intr)
618c2ecf20Sopenharmony_ci	),
628c2ecf20Sopenharmony_ci	TP_fast_assign(
638c2ecf20Sopenharmony_ci		__entry->intr = intr;
648c2ecf20Sopenharmony_ci	),
658c2ecf20Sopenharmony_ci	TP_printk("(%08x) %s %s %s", __entry->intr,
668c2ecf20Sopenharmony_ci		__entry->intr & SUSPEND_INTR ? "SUSPEND" : "",
678c2ecf20Sopenharmony_ci		__entry->intr & RESUME_INTR ? "RESUME" : "",
688c2ecf20Sopenharmony_ci		__entry->intr & RESET_INTR ? "RESET" : ""
698c2ecf20Sopenharmony_ci	)
708c2ecf20Sopenharmony_ci);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ciTRACE_EVENT(mtu3_qmu_isr,
738c2ecf20Sopenharmony_ci	TP_PROTO(u32 done_intr, u32 exp_intr),
748c2ecf20Sopenharmony_ci	TP_ARGS(done_intr, exp_intr),
758c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
768c2ecf20Sopenharmony_ci		__field(u32, done_intr)
778c2ecf20Sopenharmony_ci		__field(u32, exp_intr)
788c2ecf20Sopenharmony_ci	),
798c2ecf20Sopenharmony_ci	TP_fast_assign(
808c2ecf20Sopenharmony_ci		__entry->done_intr = done_intr;
818c2ecf20Sopenharmony_ci		__entry->exp_intr = exp_intr;
828c2ecf20Sopenharmony_ci	),
838c2ecf20Sopenharmony_ci	TP_printk("done (tx %04x, rx %04x), exp (%08x)",
848c2ecf20Sopenharmony_ci		__entry->done_intr & 0xffff,
858c2ecf20Sopenharmony_ci		__entry->done_intr >> 16,
868c2ecf20Sopenharmony_ci		__entry->exp_intr
878c2ecf20Sopenharmony_ci	)
888c2ecf20Sopenharmony_ci);
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(mtu3_log_setup,
918c2ecf20Sopenharmony_ci	TP_PROTO(struct usb_ctrlrequest *setup),
928c2ecf20Sopenharmony_ci	TP_ARGS(setup),
938c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
948c2ecf20Sopenharmony_ci		__field(__u8, bRequestType)
958c2ecf20Sopenharmony_ci		__field(__u8, bRequest)
968c2ecf20Sopenharmony_ci		__field(__u16, wValue)
978c2ecf20Sopenharmony_ci		__field(__u16, wIndex)
988c2ecf20Sopenharmony_ci		__field(__u16, wLength)
998c2ecf20Sopenharmony_ci	),
1008c2ecf20Sopenharmony_ci	TP_fast_assign(
1018c2ecf20Sopenharmony_ci		__entry->bRequestType = setup->bRequestType;
1028c2ecf20Sopenharmony_ci		__entry->bRequest = setup->bRequest;
1038c2ecf20Sopenharmony_ci		__entry->wValue = le16_to_cpu(setup->wValue);
1048c2ecf20Sopenharmony_ci		__entry->wIndex = le16_to_cpu(setup->wIndex);
1058c2ecf20Sopenharmony_ci		__entry->wLength = le16_to_cpu(setup->wLength);
1068c2ecf20Sopenharmony_ci	),
1078c2ecf20Sopenharmony_ci	TP_printk("setup - %02x %02x %04x %04x %04x",
1088c2ecf20Sopenharmony_ci		__entry->bRequestType, __entry->bRequest,
1098c2ecf20Sopenharmony_ci		__entry->wValue, __entry->wIndex, __entry->wLength
1108c2ecf20Sopenharmony_ci	)
1118c2ecf20Sopenharmony_ci);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_setup, mtu3_handle_setup,
1148c2ecf20Sopenharmony_ci	TP_PROTO(struct usb_ctrlrequest *setup),
1158c2ecf20Sopenharmony_ci	TP_ARGS(setup)
1168c2ecf20Sopenharmony_ci);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(mtu3_log_request,
1198c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *mreq),
1208c2ecf20Sopenharmony_ci	TP_ARGS(mreq),
1218c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
1228c2ecf20Sopenharmony_ci		__string(name, mreq->mep->name)
1238c2ecf20Sopenharmony_ci		__field(struct mtu3_request *, mreq)
1248c2ecf20Sopenharmony_ci		__field(struct qmu_gpd *, gpd)
1258c2ecf20Sopenharmony_ci		__field(unsigned int, actual)
1268c2ecf20Sopenharmony_ci		__field(unsigned int, length)
1278c2ecf20Sopenharmony_ci		__field(int, status)
1288c2ecf20Sopenharmony_ci		__field(int, zero)
1298c2ecf20Sopenharmony_ci		__field(int, no_interrupt)
1308c2ecf20Sopenharmony_ci	),
1318c2ecf20Sopenharmony_ci	TP_fast_assign(
1328c2ecf20Sopenharmony_ci		__assign_str(name, mreq->mep->name);
1338c2ecf20Sopenharmony_ci		__entry->mreq = mreq;
1348c2ecf20Sopenharmony_ci		__entry->gpd = mreq->gpd;
1358c2ecf20Sopenharmony_ci		__entry->actual = mreq->request.actual;
1368c2ecf20Sopenharmony_ci		__entry->length = mreq->request.length;
1378c2ecf20Sopenharmony_ci		__entry->status = mreq->request.status;
1388c2ecf20Sopenharmony_ci		__entry->zero = mreq->request.zero;
1398c2ecf20Sopenharmony_ci		__entry->no_interrupt = mreq->request.no_interrupt;
1408c2ecf20Sopenharmony_ci	),
1418c2ecf20Sopenharmony_ci	TP_printk("%s: req %p gpd %p len %u/%u %s%s --> %d",
1428c2ecf20Sopenharmony_ci		__get_str(name), __entry->mreq, __entry->gpd,
1438c2ecf20Sopenharmony_ci		__entry->actual, __entry->length,
1448c2ecf20Sopenharmony_ci		__entry->zero ? "Z" : "z",
1458c2ecf20Sopenharmony_ci		__entry->no_interrupt ? "i" : "I",
1468c2ecf20Sopenharmony_ci		__entry->status
1478c2ecf20Sopenharmony_ci	)
1488c2ecf20Sopenharmony_ci);
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_request, mtu3_alloc_request,
1518c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *req),
1528c2ecf20Sopenharmony_ci	TP_ARGS(req)
1538c2ecf20Sopenharmony_ci);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_request, mtu3_free_request,
1568c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *req),
1578c2ecf20Sopenharmony_ci	TP_ARGS(req)
1588c2ecf20Sopenharmony_ci);
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_request, mtu3_gadget_queue,
1618c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *req),
1628c2ecf20Sopenharmony_ci	TP_ARGS(req)
1638c2ecf20Sopenharmony_ci);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_request, mtu3_gadget_dequeue,
1668c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *req),
1678c2ecf20Sopenharmony_ci	TP_ARGS(req)
1688c2ecf20Sopenharmony_ci);
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_request, mtu3_req_complete,
1718c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_request *req),
1728c2ecf20Sopenharmony_ci	TP_ARGS(req)
1738c2ecf20Sopenharmony_ci);
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(mtu3_log_gpd,
1768c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd),
1778c2ecf20Sopenharmony_ci	TP_ARGS(mep, gpd),
1788c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
1798c2ecf20Sopenharmony_ci		__string(name, mep->name)
1808c2ecf20Sopenharmony_ci		__field(struct qmu_gpd *, gpd)
1818c2ecf20Sopenharmony_ci		__field(u32, dw0)
1828c2ecf20Sopenharmony_ci		__field(u32, dw1)
1838c2ecf20Sopenharmony_ci		__field(u32, dw2)
1848c2ecf20Sopenharmony_ci		__field(u32, dw3)
1858c2ecf20Sopenharmony_ci	),
1868c2ecf20Sopenharmony_ci	TP_fast_assign(
1878c2ecf20Sopenharmony_ci		__assign_str(name, mep->name);
1888c2ecf20Sopenharmony_ci		__entry->gpd = gpd;
1898c2ecf20Sopenharmony_ci		__entry->dw0 = le32_to_cpu(gpd->dw0_info);
1908c2ecf20Sopenharmony_ci		__entry->dw1 = le32_to_cpu(gpd->next_gpd);
1918c2ecf20Sopenharmony_ci		__entry->dw2 = le32_to_cpu(gpd->buffer);
1928c2ecf20Sopenharmony_ci		__entry->dw3 = le32_to_cpu(gpd->dw3_info);
1938c2ecf20Sopenharmony_ci	),
1948c2ecf20Sopenharmony_ci	TP_printk("%s: gpd %p - %08x %08x %08x %08x",
1958c2ecf20Sopenharmony_ci		__get_str(name), __entry->gpd,
1968c2ecf20Sopenharmony_ci		__entry->dw0, __entry->dw1,
1978c2ecf20Sopenharmony_ci		__entry->dw2, __entry->dw3
1988c2ecf20Sopenharmony_ci	)
1998c2ecf20Sopenharmony_ci);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_gpd, mtu3_prepare_gpd,
2028c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd),
2038c2ecf20Sopenharmony_ci	TP_ARGS(mep, gpd)
2048c2ecf20Sopenharmony_ci);
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_gpd, mtu3_complete_gpd,
2078c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd),
2088c2ecf20Sopenharmony_ci	TP_ARGS(mep, gpd)
2098c2ecf20Sopenharmony_ci);
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_gpd, mtu3_zlp_exp_gpd,
2128c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep, struct qmu_gpd *gpd),
2138c2ecf20Sopenharmony_ci	TP_ARGS(mep, gpd)
2148c2ecf20Sopenharmony_ci);
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(mtu3_log_ep,
2178c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep),
2188c2ecf20Sopenharmony_ci	TP_ARGS(mep),
2198c2ecf20Sopenharmony_ci	TP_STRUCT__entry(
2208c2ecf20Sopenharmony_ci		__string(name, mep->name)
2218c2ecf20Sopenharmony_ci		__field(unsigned int, type)
2228c2ecf20Sopenharmony_ci		__field(unsigned int, slot)
2238c2ecf20Sopenharmony_ci		__field(unsigned int, maxp)
2248c2ecf20Sopenharmony_ci		__field(unsigned int, mult)
2258c2ecf20Sopenharmony_ci		__field(unsigned int, maxburst)
2268c2ecf20Sopenharmony_ci		__field(unsigned int, flags)
2278c2ecf20Sopenharmony_ci		__field(unsigned int, direction)
2288c2ecf20Sopenharmony_ci		__field(struct mtu3_gpd_ring *, gpd_ring)
2298c2ecf20Sopenharmony_ci	),
2308c2ecf20Sopenharmony_ci	TP_fast_assign(
2318c2ecf20Sopenharmony_ci		__assign_str(name, mep->name);
2328c2ecf20Sopenharmony_ci		__entry->type = mep->type;
2338c2ecf20Sopenharmony_ci		__entry->slot = mep->slot;
2348c2ecf20Sopenharmony_ci		__entry->maxp = mep->ep.maxpacket;
2358c2ecf20Sopenharmony_ci		__entry->mult = mep->ep.mult;
2368c2ecf20Sopenharmony_ci		__entry->maxburst = mep->ep.maxburst;
2378c2ecf20Sopenharmony_ci		__entry->flags = mep->flags;
2388c2ecf20Sopenharmony_ci		__entry->direction = mep->is_in;
2398c2ecf20Sopenharmony_ci		__entry->gpd_ring = &mep->gpd_ring;
2408c2ecf20Sopenharmony_ci	),
2418c2ecf20Sopenharmony_ci	TP_printk("%s: type %d maxp %d slot %d mult %d burst %d ring %p/%pad flags %c:%c%c%c:%c",
2428c2ecf20Sopenharmony_ci		__get_str(name), __entry->type,
2438c2ecf20Sopenharmony_ci		__entry->maxp, __entry->slot,
2448c2ecf20Sopenharmony_ci		__entry->mult, __entry->maxburst,
2458c2ecf20Sopenharmony_ci		__entry->gpd_ring, &__entry->gpd_ring->dma,
2468c2ecf20Sopenharmony_ci		__entry->flags & MTU3_EP_ENABLED ? 'E' : 'e',
2478c2ecf20Sopenharmony_ci		__entry->flags & MTU3_EP_STALL ? 'S' : 's',
2488c2ecf20Sopenharmony_ci		__entry->flags & MTU3_EP_WEDGE ? 'W' : 'w',
2498c2ecf20Sopenharmony_ci		__entry->flags & MTU3_EP_BUSY ? 'B' : 'b',
2508c2ecf20Sopenharmony_ci		__entry->direction ? '<' : '>'
2518c2ecf20Sopenharmony_ci	)
2528c2ecf20Sopenharmony_ci);
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_enable,
2558c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep),
2568c2ecf20Sopenharmony_ci	TP_ARGS(mep)
2578c2ecf20Sopenharmony_ci);
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_disable,
2608c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep),
2618c2ecf20Sopenharmony_ci	TP_ARGS(mep)
2628c2ecf20Sopenharmony_ci);
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ciDEFINE_EVENT(mtu3_log_ep, mtu3_gadget_ep_set_halt,
2658c2ecf20Sopenharmony_ci	TP_PROTO(struct mtu3_ep *mep),
2668c2ecf20Sopenharmony_ci	TP_ARGS(mep)
2678c2ecf20Sopenharmony_ci);
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci#endif /* __MTU3_TRACE_H__ */
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci/* this part has to be here */
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_PATH
2748c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_PATH .
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_FILE
2778c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_FILE mtu3_trace
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci#include <trace/define_trace.h>
280