162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * USBHS-DEV device controller driver.
462306a36Sopenharmony_ci * Trace support header file.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2023 Cadence.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Author: Pawel Laszczak <pawell@cadence.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#undef TRACE_SYSTEM
1262306a36Sopenharmony_ci#define TRACE_SYSTEM cdns2-dev
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
1662306a36Sopenharmony_ci * legitimate C variable. It is not exported to user space.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ci#undef TRACE_SYSTEM_VAR
1962306a36Sopenharmony_ci#define TRACE_SYSTEM_VAR cdns2_dev
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#if !defined(__LINUX_CDNS2_TRACE) || defined(TRACE_HEADER_MULTI_READ)
2262306a36Sopenharmony_ci#define __LINUX_CDNS2_TRACE
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/types.h>
2562306a36Sopenharmony_ci#include <linux/tracepoint.h>
2662306a36Sopenharmony_ci#include <asm/byteorder.h>
2762306a36Sopenharmony_ci#include <linux/usb/ch9.h>
2862306a36Sopenharmony_ci#include "cdns2-gadget.h"
2962306a36Sopenharmony_ci#include "cdns2-debug.h"
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define CDNS2_MSG_MAX	500
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_enable_disable,
3462306a36Sopenharmony_ci	TP_PROTO(int set),
3562306a36Sopenharmony_ci	TP_ARGS(set),
3662306a36Sopenharmony_ci	TP_STRUCT__entry(
3762306a36Sopenharmony_ci		__field(int, set)
3862306a36Sopenharmony_ci	),
3962306a36Sopenharmony_ci	TP_fast_assign(
4062306a36Sopenharmony_ci		__entry->set = set;
4162306a36Sopenharmony_ci	),
4262306a36Sopenharmony_ci	TP_printk("%s", __entry->set ? "enabled" : "disabled")
4362306a36Sopenharmony_ci);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_enable_disable, cdns2_pullup,
4662306a36Sopenharmony_ci	TP_PROTO(int set),
4762306a36Sopenharmony_ci	TP_ARGS(set)
4862306a36Sopenharmony_ci);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_enable_disable, cdns2_lpm,
5162306a36Sopenharmony_ci	TP_PROTO(int set),
5262306a36Sopenharmony_ci	TP_ARGS(set)
5362306a36Sopenharmony_ci);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_enable_disable, cdns2_may_wakeup,
5662306a36Sopenharmony_ci	TP_PROTO(int set),
5762306a36Sopenharmony_ci	TP_ARGS(set)
5862306a36Sopenharmony_ci);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_simple,
6162306a36Sopenharmony_ci	TP_PROTO(char *msg),
6262306a36Sopenharmony_ci	TP_ARGS(msg),
6362306a36Sopenharmony_ci	TP_STRUCT__entry(
6462306a36Sopenharmony_ci		__string(text, msg)
6562306a36Sopenharmony_ci	),
6662306a36Sopenharmony_ci	TP_fast_assign(
6762306a36Sopenharmony_ci		__assign_str(text, msg);
6862306a36Sopenharmony_ci	),
6962306a36Sopenharmony_ci	TP_printk("%s", __get_str(text))
7062306a36Sopenharmony_ci);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_simple, cdns2_no_room_on_ring,
7362306a36Sopenharmony_ci	TP_PROTO(char *msg),
7462306a36Sopenharmony_ci	TP_ARGS(msg)
7562306a36Sopenharmony_ci);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_simple, cdns2_ep0_status_stage,
7862306a36Sopenharmony_ci	TP_PROTO(char *msg),
7962306a36Sopenharmony_ci	TP_ARGS(msg)
8062306a36Sopenharmony_ci);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_simple, cdns2_ep0_set_config,
8362306a36Sopenharmony_ci	TP_PROTO(char *msg),
8462306a36Sopenharmony_ci	TP_ARGS(msg)
8562306a36Sopenharmony_ci);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_simple, cdns2_ep0_setup,
8862306a36Sopenharmony_ci	TP_PROTO(char *msg),
8962306a36Sopenharmony_ci	TP_ARGS(msg)
9062306a36Sopenharmony_ci);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_simple, cdns2_device_state,
9362306a36Sopenharmony_ci	TP_PROTO(char *msg),
9462306a36Sopenharmony_ci	TP_ARGS(msg)
9562306a36Sopenharmony_ci);
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciTRACE_EVENT(cdns2_ep_halt,
9862306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *ep_priv, u8 halt, u8 flush),
9962306a36Sopenharmony_ci	TP_ARGS(ep_priv, halt, flush),
10062306a36Sopenharmony_ci	TP_STRUCT__entry(
10162306a36Sopenharmony_ci		__string(name, ep_priv->name)
10262306a36Sopenharmony_ci		__field(u8, halt)
10362306a36Sopenharmony_ci		__field(u8, flush)
10462306a36Sopenharmony_ci	),
10562306a36Sopenharmony_ci	TP_fast_assign(
10662306a36Sopenharmony_ci		__assign_str(name, ep_priv->name);
10762306a36Sopenharmony_ci		__entry->halt = halt;
10862306a36Sopenharmony_ci		__entry->flush = flush;
10962306a36Sopenharmony_ci	),
11062306a36Sopenharmony_ci	TP_printk("Halt %s for %s: %s", __entry->flush ? " and flush" : "",
11162306a36Sopenharmony_ci		  __get_str(name), __entry->halt ? "set" : "cleared")
11262306a36Sopenharmony_ci);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciTRACE_EVENT(cdns2_wa1,
11562306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *ep_priv, char *msg),
11662306a36Sopenharmony_ci	TP_ARGS(ep_priv, msg),
11762306a36Sopenharmony_ci	TP_STRUCT__entry(
11862306a36Sopenharmony_ci		__string(ep_name, ep_priv->name)
11962306a36Sopenharmony_ci		__string(msg, msg)
12062306a36Sopenharmony_ci	),
12162306a36Sopenharmony_ci	TP_fast_assign(
12262306a36Sopenharmony_ci		__assign_str(ep_name, ep_priv->name);
12362306a36Sopenharmony_ci		__assign_str(msg, msg);
12462306a36Sopenharmony_ci	),
12562306a36Sopenharmony_ci	TP_printk("WA1: %s %s", __get_str(ep_name), __get_str(msg))
12662306a36Sopenharmony_ci);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_doorbell,
12962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, u32 ep_trbaddr),
13062306a36Sopenharmony_ci	TP_ARGS(pep, ep_trbaddr),
13162306a36Sopenharmony_ci	TP_STRUCT__entry(
13262306a36Sopenharmony_ci		__string(name, pep->num ? pep->name :
13362306a36Sopenharmony_ci				(pep->dir ? "ep0in" : "ep0out"))
13462306a36Sopenharmony_ci		__field(u32, ep_trbaddr)
13562306a36Sopenharmony_ci	),
13662306a36Sopenharmony_ci	TP_fast_assign(
13762306a36Sopenharmony_ci		__assign_str(name, pep->name);
13862306a36Sopenharmony_ci		__entry->ep_trbaddr = ep_trbaddr;
13962306a36Sopenharmony_ci	),
14062306a36Sopenharmony_ci	TP_printk("%s, ep_trbaddr %08x", __get_str(name),
14162306a36Sopenharmony_ci		  __entry->ep_trbaddr)
14262306a36Sopenharmony_ci);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_doorbell, cdns2_doorbell_ep0,
14562306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, u32 ep_trbaddr),
14662306a36Sopenharmony_ci	TP_ARGS(pep, ep_trbaddr)
14762306a36Sopenharmony_ci);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_doorbell, cdns2_doorbell_epx,
15062306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, u32 ep_trbaddr),
15162306a36Sopenharmony_ci	TP_ARGS(pep, ep_trbaddr)
15262306a36Sopenharmony_ci);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_usb_irq,
15562306a36Sopenharmony_ci	TP_PROTO(u32 usb_irq, u32 ext_irq),
15662306a36Sopenharmony_ci	TP_ARGS(usb_irq, ext_irq),
15762306a36Sopenharmony_ci	TP_STRUCT__entry(
15862306a36Sopenharmony_ci		__field(u32, usb_irq)
15962306a36Sopenharmony_ci		__field(u32, ext_irq)
16062306a36Sopenharmony_ci	),
16162306a36Sopenharmony_ci	TP_fast_assign(
16262306a36Sopenharmony_ci		__entry->usb_irq = usb_irq;
16362306a36Sopenharmony_ci		__entry->ext_irq = ext_irq;
16462306a36Sopenharmony_ci	),
16562306a36Sopenharmony_ci	TP_printk("%s", cdns2_decode_usb_irq(__get_buf(CDNS2_MSG_MAX),
16662306a36Sopenharmony_ci					     CDNS2_MSG_MAX,
16762306a36Sopenharmony_ci					     __entry->usb_irq,
16862306a36Sopenharmony_ci					     __entry->ext_irq))
16962306a36Sopenharmony_ci);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_usb_irq, cdns2_usb_irq,
17262306a36Sopenharmony_ci	TP_PROTO(u32 usb_irq, u32 ext_irq),
17362306a36Sopenharmony_ci	TP_ARGS(usb_irq, ext_irq)
17462306a36Sopenharmony_ci);
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciTRACE_EVENT(cdns2_dma_ep_ists,
17762306a36Sopenharmony_ci	TP_PROTO(u32 dma_ep_ists),
17862306a36Sopenharmony_ci	TP_ARGS(dma_ep_ists),
17962306a36Sopenharmony_ci	TP_STRUCT__entry(
18062306a36Sopenharmony_ci		__field(u32, dma_ep_ists)
18162306a36Sopenharmony_ci	),
18262306a36Sopenharmony_ci	TP_fast_assign(
18362306a36Sopenharmony_ci		__entry->dma_ep_ists = dma_ep_ists;
18462306a36Sopenharmony_ci	),
18562306a36Sopenharmony_ci	TP_printk("OUT: 0x%04x, IN: 0x%04x", (u16)__entry->dma_ep_ists,
18662306a36Sopenharmony_ci		  __entry->dma_ep_ists >> 16)
18762306a36Sopenharmony_ci);
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_epx_irq,
19062306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev, struct cdns2_endpoint *pep),
19162306a36Sopenharmony_ci	TP_ARGS(pdev, pep),
19262306a36Sopenharmony_ci	TP_STRUCT__entry(
19362306a36Sopenharmony_ci		__string(ep_name, pep->name)
19462306a36Sopenharmony_ci		__field(u32, ep_sts)
19562306a36Sopenharmony_ci		__field(u32, ep_ists)
19662306a36Sopenharmony_ci		__field(u32, ep_traddr)
19762306a36Sopenharmony_ci	),
19862306a36Sopenharmony_ci	TP_fast_assign(
19962306a36Sopenharmony_ci		__assign_str(ep_name, pep->name);
20062306a36Sopenharmony_ci		__entry->ep_sts = readl(&pdev->adma_regs->ep_sts);
20162306a36Sopenharmony_ci		__entry->ep_ists = readl(&pdev->adma_regs->ep_ists);
20262306a36Sopenharmony_ci		__entry->ep_traddr = readl(&pdev->adma_regs->ep_traddr);
20362306a36Sopenharmony_ci	),
20462306a36Sopenharmony_ci	TP_printk("%s, ep_traddr: %08x",
20562306a36Sopenharmony_ci		  cdns2_decode_epx_irq(__get_buf(CDNS2_MSG_MAX), CDNS2_MSG_MAX,
20662306a36Sopenharmony_ci				       __get_str(ep_name),
20762306a36Sopenharmony_ci				       __entry->ep_ists, __entry->ep_sts),
20862306a36Sopenharmony_ci		  __entry->ep_traddr)
20962306a36Sopenharmony_ci);
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_epx_irq, cdns2_epx_irq,
21262306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev, struct cdns2_endpoint *pep),
21362306a36Sopenharmony_ci	TP_ARGS(pdev, pep)
21462306a36Sopenharmony_ci);
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_ep0_irq,
21762306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev),
21862306a36Sopenharmony_ci	TP_ARGS(pdev),
21962306a36Sopenharmony_ci	TP_STRUCT__entry(
22062306a36Sopenharmony_ci		__field(int, ep_dir)
22162306a36Sopenharmony_ci		__field(u32, ep_ists)
22262306a36Sopenharmony_ci		__field(u32, ep_sts)
22362306a36Sopenharmony_ci	),
22462306a36Sopenharmony_ci	TP_fast_assign(
22562306a36Sopenharmony_ci		__entry->ep_dir = pdev->selected_ep;
22662306a36Sopenharmony_ci		__entry->ep_ists = readl(&pdev->adma_regs->ep_ists);
22762306a36Sopenharmony_ci		__entry->ep_sts = readl(&pdev->adma_regs->ep_sts);
22862306a36Sopenharmony_ci	),
22962306a36Sopenharmony_ci	TP_printk("%s", cdns2_decode_ep0_irq(__get_buf(CDNS2_MSG_MAX),
23062306a36Sopenharmony_ci					     CDNS2_MSG_MAX,
23162306a36Sopenharmony_ci					     __entry->ep_ists, __entry->ep_sts,
23262306a36Sopenharmony_ci					     __entry->ep_dir))
23362306a36Sopenharmony_ci);
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ep0_irq, cdns2_ep0_irq,
23662306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev),
23762306a36Sopenharmony_ci	TP_ARGS(pdev)
23862306a36Sopenharmony_ci);
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_ctrl,
24162306a36Sopenharmony_ci	TP_PROTO(struct usb_ctrlrequest *ctrl),
24262306a36Sopenharmony_ci	TP_ARGS(ctrl),
24362306a36Sopenharmony_ci	TP_STRUCT__entry(
24462306a36Sopenharmony_ci		__field(u8, bRequestType)
24562306a36Sopenharmony_ci		__field(u8, bRequest)
24662306a36Sopenharmony_ci		__field(u16, wValue)
24762306a36Sopenharmony_ci		__field(u16, wIndex)
24862306a36Sopenharmony_ci		__field(u16, wLength)
24962306a36Sopenharmony_ci	),
25062306a36Sopenharmony_ci	TP_fast_assign(
25162306a36Sopenharmony_ci		__entry->bRequestType = ctrl->bRequestType;
25262306a36Sopenharmony_ci		__entry->bRequest = ctrl->bRequest;
25362306a36Sopenharmony_ci		__entry->wValue = le16_to_cpu(ctrl->wValue);
25462306a36Sopenharmony_ci		__entry->wIndex = le16_to_cpu(ctrl->wIndex);
25562306a36Sopenharmony_ci		__entry->wLength = le16_to_cpu(ctrl->wLength);
25662306a36Sopenharmony_ci	),
25762306a36Sopenharmony_ci	TP_printk("%s", usb_decode_ctrl(__get_buf(CDNS2_MSG_MAX), CDNS2_MSG_MAX,
25862306a36Sopenharmony_ci					__entry->bRequestType,
25962306a36Sopenharmony_ci					__entry->bRequest, __entry->wValue,
26062306a36Sopenharmony_ci					__entry->wIndex, __entry->wLength)
26162306a36Sopenharmony_ci	)
26262306a36Sopenharmony_ci);
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ctrl, cdns2_ctrl_req,
26562306a36Sopenharmony_ci	TP_PROTO(struct usb_ctrlrequest *ctrl),
26662306a36Sopenharmony_ci	TP_ARGS(ctrl)
26762306a36Sopenharmony_ci);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_request,
27062306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
27162306a36Sopenharmony_ci	TP_ARGS(preq),
27262306a36Sopenharmony_ci	TP_STRUCT__entry(
27362306a36Sopenharmony_ci		__string(name, preq->pep->name)
27462306a36Sopenharmony_ci		__field(struct usb_request *, request)
27562306a36Sopenharmony_ci		__field(struct cdns2_request *, preq)
27662306a36Sopenharmony_ci		__field(void *, buf)
27762306a36Sopenharmony_ci		__field(unsigned int, actual)
27862306a36Sopenharmony_ci		__field(unsigned int, length)
27962306a36Sopenharmony_ci		__field(int, status)
28062306a36Sopenharmony_ci		__field(dma_addr_t, dma)
28162306a36Sopenharmony_ci		__field(int, zero)
28262306a36Sopenharmony_ci		__field(int, short_not_ok)
28362306a36Sopenharmony_ci		__field(int, no_interrupt)
28462306a36Sopenharmony_ci		__field(struct scatterlist*, sg)
28562306a36Sopenharmony_ci		__field(unsigned int, num_sgs)
28662306a36Sopenharmony_ci		__field(unsigned int, num_mapped_sgs)
28762306a36Sopenharmony_ci		__field(int, start_trb)
28862306a36Sopenharmony_ci		__field(int, end_trb)
28962306a36Sopenharmony_ci	),
29062306a36Sopenharmony_ci	TP_fast_assign(
29162306a36Sopenharmony_ci		__assign_str(name, preq->pep->name);
29262306a36Sopenharmony_ci		__entry->request = &preq->request;
29362306a36Sopenharmony_ci		__entry->preq = preq;
29462306a36Sopenharmony_ci		__entry->buf = preq->request.buf;
29562306a36Sopenharmony_ci		__entry->actual = preq->request.actual;
29662306a36Sopenharmony_ci		__entry->length = preq->request.length;
29762306a36Sopenharmony_ci		__entry->status = preq->request.status;
29862306a36Sopenharmony_ci		__entry->dma = preq->request.dma;
29962306a36Sopenharmony_ci		__entry->zero = preq->request.zero;
30062306a36Sopenharmony_ci		__entry->short_not_ok = preq->request.short_not_ok;
30162306a36Sopenharmony_ci		__entry->no_interrupt = preq->request.no_interrupt;
30262306a36Sopenharmony_ci		__entry->sg = preq->request.sg;
30362306a36Sopenharmony_ci		__entry->num_sgs = preq->request.num_sgs;
30462306a36Sopenharmony_ci		__entry->num_mapped_sgs = preq->request.num_mapped_sgs;
30562306a36Sopenharmony_ci		__entry->start_trb = preq->start_trb;
30662306a36Sopenharmony_ci		__entry->end_trb = preq->end_trb;
30762306a36Sopenharmony_ci	),
30862306a36Sopenharmony_ci	TP_printk("%s: req: %p, preq: %p, req buf: %p, length: %u/%u, status: %d,"
30962306a36Sopenharmony_ci		  "buf dma: (%pad), %s%s%s, sg: %p, num_sgs: %d, num_m_sgs: %d,"
31062306a36Sopenharmony_ci		  "trb: [start: %d, end: %d]",
31162306a36Sopenharmony_ci		  __get_str(name), __entry->request, __entry->preq,
31262306a36Sopenharmony_ci		  __entry->buf, __entry->actual, __entry->length,
31362306a36Sopenharmony_ci		  __entry->status, &__entry->dma,
31462306a36Sopenharmony_ci		  __entry->zero ? "Z" : "z",
31562306a36Sopenharmony_ci		  __entry->short_not_ok ? "S" : "s",
31662306a36Sopenharmony_ci		  __entry->no_interrupt ? "I" : "i",
31762306a36Sopenharmony_ci		  __entry->sg, __entry->num_sgs, __entry->num_mapped_sgs,
31862306a36Sopenharmony_ci		  __entry->start_trb,
31962306a36Sopenharmony_ci		  __entry->end_trb
32062306a36Sopenharmony_ci	)
32162306a36Sopenharmony_ci);
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_request_enqueue,
32462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
32562306a36Sopenharmony_ci	TP_ARGS(preq)
32662306a36Sopenharmony_ci);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_request_enqueue_error,
32962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
33062306a36Sopenharmony_ci	TP_ARGS(preq)
33162306a36Sopenharmony_ci);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_alloc_request,
33462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
33562306a36Sopenharmony_ci	TP_ARGS(preq)
33662306a36Sopenharmony_ci);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_free_request,
33962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
34062306a36Sopenharmony_ci	TP_ARGS(preq)
34162306a36Sopenharmony_ci);
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_ep_queue,
34462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
34562306a36Sopenharmony_ci	TP_ARGS(preq)
34662306a36Sopenharmony_ci);
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_request_dequeue,
34962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
35062306a36Sopenharmony_ci	TP_ARGS(preq)
35162306a36Sopenharmony_ci);
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request, cdns2_request_giveback,
35462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *preq),
35562306a36Sopenharmony_ci	TP_ARGS(preq)
35662306a36Sopenharmony_ci);
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ciTRACE_EVENT(cdns2_ep0_enqueue,
35962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *dev_priv, struct usb_request *request),
36062306a36Sopenharmony_ci	TP_ARGS(dev_priv, request),
36162306a36Sopenharmony_ci	TP_STRUCT__entry(
36262306a36Sopenharmony_ci		__field(int, dir)
36362306a36Sopenharmony_ci		__field(int, length)
36462306a36Sopenharmony_ci	),
36562306a36Sopenharmony_ci	TP_fast_assign(
36662306a36Sopenharmony_ci		__entry->dir = dev_priv->eps[0].dir;
36762306a36Sopenharmony_ci		__entry->length = request->length;
36862306a36Sopenharmony_ci	),
36962306a36Sopenharmony_ci	TP_printk("Queue to ep0%s length: %u", __entry->dir ? "in" : "out",
37062306a36Sopenharmony_ci		  __entry->length)
37162306a36Sopenharmony_ci);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_map_request,
37462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *priv_req),
37562306a36Sopenharmony_ci	TP_ARGS(priv_req),
37662306a36Sopenharmony_ci	TP_STRUCT__entry(
37762306a36Sopenharmony_ci		__string(name, priv_req->pep->name)
37862306a36Sopenharmony_ci		__field(struct usb_request *, req)
37962306a36Sopenharmony_ci		__field(void *, buf)
38062306a36Sopenharmony_ci		__field(dma_addr_t, dma)
38162306a36Sopenharmony_ci	),
38262306a36Sopenharmony_ci	TP_fast_assign(
38362306a36Sopenharmony_ci		__assign_str(name, priv_req->pep->name);
38462306a36Sopenharmony_ci		__entry->req = &priv_req->request;
38562306a36Sopenharmony_ci		__entry->buf = priv_req->request.buf;
38662306a36Sopenharmony_ci		__entry->dma = priv_req->request.dma;
38762306a36Sopenharmony_ci	),
38862306a36Sopenharmony_ci	TP_printk("%s: req: %p, req buf %p, dma %p",
38962306a36Sopenharmony_ci		  __get_str(name), __entry->req, __entry->buf, &__entry->dma
39062306a36Sopenharmony_ci	)
39162306a36Sopenharmony_ci);
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_map_request, cdns2_map_request,
39462306a36Sopenharmony_ci	     TP_PROTO(struct cdns2_request *req),
39562306a36Sopenharmony_ci	     TP_ARGS(req)
39662306a36Sopenharmony_ci);
39762306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_map_request, cdns2_mapped_request,
39862306a36Sopenharmony_ci	     TP_PROTO(struct cdns2_request *req),
39962306a36Sopenharmony_ci	     TP_ARGS(req)
40062306a36Sopenharmony_ci);
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_trb,
40362306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, struct cdns2_trb *trb),
40462306a36Sopenharmony_ci	TP_ARGS(pep, trb),
40562306a36Sopenharmony_ci	TP_STRUCT__entry(
40662306a36Sopenharmony_ci		__string(name, pep->name)
40762306a36Sopenharmony_ci		__field(struct cdns2_trb *, trb)
40862306a36Sopenharmony_ci		__field(u32, buffer)
40962306a36Sopenharmony_ci		__field(u32, length)
41062306a36Sopenharmony_ci		__field(u32, control)
41162306a36Sopenharmony_ci		__field(u32, type)
41262306a36Sopenharmony_ci	),
41362306a36Sopenharmony_ci	TP_fast_assign(
41462306a36Sopenharmony_ci		__assign_str(name, pep->name);
41562306a36Sopenharmony_ci		__entry->trb = trb;
41662306a36Sopenharmony_ci		__entry->buffer = le32_to_cpu(trb->buffer);
41762306a36Sopenharmony_ci		__entry->length = le32_to_cpu(trb->length);
41862306a36Sopenharmony_ci		__entry->control = le32_to_cpu(trb->control);
41962306a36Sopenharmony_ci		__entry->type = usb_endpoint_type(pep->endpoint.desc);
42062306a36Sopenharmony_ci	),
42162306a36Sopenharmony_ci	TP_printk("%s: trb V: %p, dma buf: P: 0x%08x, %s",
42262306a36Sopenharmony_ci		 __get_str(name), __entry->trb, __entry->buffer,
42362306a36Sopenharmony_ci		 cdns2_decode_trb(__get_buf(CDNS2_MSG_MAX), CDNS2_MSG_MAX,
42462306a36Sopenharmony_ci				  __entry->control, __entry->length,
42562306a36Sopenharmony_ci				  __entry->buffer))
42662306a36Sopenharmony_ci);
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_trb, cdns2_queue_trb,
42962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, struct cdns2_trb *trb),
43062306a36Sopenharmony_ci	TP_ARGS(pep, trb)
43162306a36Sopenharmony_ci);
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_trb, cdns2_complete_trb,
43462306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep, struct cdns2_trb *trb),
43562306a36Sopenharmony_ci	TP_ARGS(pep, trb)
43662306a36Sopenharmony_ci);
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_ring,
43962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
44062306a36Sopenharmony_ci	TP_ARGS(pep),
44162306a36Sopenharmony_ci	TP_STRUCT__entry(
44262306a36Sopenharmony_ci		__dynamic_array(u8, tr_seg, TR_SEG_SIZE)
44362306a36Sopenharmony_ci		__dynamic_array(u8, pep, sizeof(struct cdns2_endpoint))
44462306a36Sopenharmony_ci		__dynamic_array(char, buffer,
44562306a36Sopenharmony_ci				(TRBS_PER_SEGMENT * 65) + CDNS2_MSG_MAX)
44662306a36Sopenharmony_ci	),
44762306a36Sopenharmony_ci	TP_fast_assign(
44862306a36Sopenharmony_ci		memcpy(__get_dynamic_array(pep), pep,
44962306a36Sopenharmony_ci		       sizeof(struct cdns2_endpoint));
45062306a36Sopenharmony_ci		memcpy(__get_dynamic_array(tr_seg), pep->ring.trbs,
45162306a36Sopenharmony_ci		       TR_SEG_SIZE);
45262306a36Sopenharmony_ci	),
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	TP_printk("%s",
45562306a36Sopenharmony_ci		  cdns2_raw_ring((struct cdns2_endpoint *)__get_str(pep),
45662306a36Sopenharmony_ci				    (struct cdns2_trb *)__get_str(tr_seg),
45762306a36Sopenharmony_ci				    __get_str(buffer),
45862306a36Sopenharmony_ci				    (TRBS_PER_SEGMENT * 65) + CDNS2_MSG_MAX))
45962306a36Sopenharmony_ci);
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ring, cdns2_ring,
46262306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
46362306a36Sopenharmony_ci	TP_ARGS(pep)
46462306a36Sopenharmony_ci);
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_ep,
46762306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
46862306a36Sopenharmony_ci	TP_ARGS(pep),
46962306a36Sopenharmony_ci	TP_STRUCT__entry(
47062306a36Sopenharmony_ci		__string(name, pep->name)
47162306a36Sopenharmony_ci		__field(unsigned int, maxpacket)
47262306a36Sopenharmony_ci		__field(unsigned int, maxpacket_limit)
47362306a36Sopenharmony_ci		__field(unsigned int, flags)
47462306a36Sopenharmony_ci		__field(unsigned int, dir)
47562306a36Sopenharmony_ci		__field(u8, enqueue)
47662306a36Sopenharmony_ci		__field(u8, dequeue)
47762306a36Sopenharmony_ci	),
47862306a36Sopenharmony_ci	TP_fast_assign(
47962306a36Sopenharmony_ci		__assign_str(name, pep->name);
48062306a36Sopenharmony_ci		__entry->maxpacket = pep->endpoint.maxpacket;
48162306a36Sopenharmony_ci		__entry->maxpacket_limit = pep->endpoint.maxpacket_limit;
48262306a36Sopenharmony_ci		__entry->flags = pep->ep_state;
48362306a36Sopenharmony_ci		__entry->dir = pep->dir;
48462306a36Sopenharmony_ci		__entry->enqueue = pep->ring.enqueue;
48562306a36Sopenharmony_ci		__entry->dequeue = pep->ring.dequeue;
48662306a36Sopenharmony_ci	),
48762306a36Sopenharmony_ci	TP_printk("%s: mps: %d/%d, enq idx: %d, deq idx: %d, "
48862306a36Sopenharmony_ci		  "flags: %s%s%s%s, dir: %s",
48962306a36Sopenharmony_ci		__get_str(name), __entry->maxpacket,
49062306a36Sopenharmony_ci		__entry->maxpacket_limit, __entry->enqueue,
49162306a36Sopenharmony_ci		__entry->dequeue,
49262306a36Sopenharmony_ci		__entry->flags & EP_ENABLED ? "EN | " : "",
49362306a36Sopenharmony_ci		__entry->flags & EP_STALLED ? "STALLED | " : "",
49462306a36Sopenharmony_ci		__entry->flags & EP_WEDGE ? "WEDGE | " : "",
49562306a36Sopenharmony_ci		__entry->flags & EP_RING_FULL ? "RING FULL |" : "",
49662306a36Sopenharmony_ci		__entry->dir ? "IN" : "OUT"
49762306a36Sopenharmony_ci	)
49862306a36Sopenharmony_ci);
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ep, cdns2_gadget_ep_enable,
50162306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
50262306a36Sopenharmony_ci	TP_ARGS(pep)
50362306a36Sopenharmony_ci);
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ep, cdns2_gadget_ep_disable,
50662306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
50762306a36Sopenharmony_ci	TP_ARGS(pep)
50862306a36Sopenharmony_ci);
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ep, cdns2_iso_out_ep_disable,
51162306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
51262306a36Sopenharmony_ci	TP_ARGS(pep)
51362306a36Sopenharmony_ci);
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_ep, cdns2_ep_busy_try_halt_again,
51662306a36Sopenharmony_ci	TP_PROTO(struct cdns2_endpoint *pep),
51762306a36Sopenharmony_ci	TP_ARGS(pep)
51862306a36Sopenharmony_ci);
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_request_handled,
52162306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *priv_req, int current_index,
52262306a36Sopenharmony_ci		 int handled),
52362306a36Sopenharmony_ci	TP_ARGS(priv_req, current_index, handled),
52462306a36Sopenharmony_ci	TP_STRUCT__entry(
52562306a36Sopenharmony_ci		__field(struct cdns2_request *, priv_req)
52662306a36Sopenharmony_ci		__field(unsigned int, dma_position)
52762306a36Sopenharmony_ci		__field(unsigned int, handled)
52862306a36Sopenharmony_ci		__field(unsigned int, dequeue_idx)
52962306a36Sopenharmony_ci		__field(unsigned int, enqueue_idx)
53062306a36Sopenharmony_ci		__field(unsigned int, start_trb)
53162306a36Sopenharmony_ci		__field(unsigned int, end_trb)
53262306a36Sopenharmony_ci	),
53362306a36Sopenharmony_ci	TP_fast_assign(
53462306a36Sopenharmony_ci		__entry->priv_req = priv_req;
53562306a36Sopenharmony_ci		__entry->dma_position = current_index;
53662306a36Sopenharmony_ci		__entry->handled = handled;
53762306a36Sopenharmony_ci		__entry->dequeue_idx = priv_req->pep->ring.dequeue;
53862306a36Sopenharmony_ci		__entry->enqueue_idx = priv_req->pep->ring.enqueue;
53962306a36Sopenharmony_ci		__entry->start_trb = priv_req->start_trb;
54062306a36Sopenharmony_ci		__entry->end_trb = priv_req->end_trb;
54162306a36Sopenharmony_ci	),
54262306a36Sopenharmony_ci	TP_printk("Req: %p %s, DMA pos: %d, ep deq: %d, ep enq: %d,"
54362306a36Sopenharmony_ci		  " start trb: %d, end trb: %d",
54462306a36Sopenharmony_ci		__entry->priv_req,
54562306a36Sopenharmony_ci		__entry->handled ? "handled" : "not handled",
54662306a36Sopenharmony_ci		__entry->dma_position, __entry->dequeue_idx,
54762306a36Sopenharmony_ci		__entry->enqueue_idx, __entry->start_trb,
54862306a36Sopenharmony_ci		__entry->end_trb
54962306a36Sopenharmony_ci	)
55062306a36Sopenharmony_ci);
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_request_handled, cdns2_request_handled,
55362306a36Sopenharmony_ci	TP_PROTO(struct cdns2_request *priv_req, int current_index,
55462306a36Sopenharmony_ci		 int handled),
55562306a36Sopenharmony_ci	TP_ARGS(priv_req, current_index, handled)
55662306a36Sopenharmony_ci);
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(cdns2_log_epx_reg_config,
55962306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev, struct cdns2_endpoint *pep),
56062306a36Sopenharmony_ci	TP_ARGS(pdev, pep),
56162306a36Sopenharmony_ci	TP_STRUCT__entry(
56262306a36Sopenharmony_ci		__string(ep_name, pep->name)
56362306a36Sopenharmony_ci		__field(u8, burst_size)
56462306a36Sopenharmony_ci		__field(__le16, maxpack_reg)
56562306a36Sopenharmony_ci		__field(__u8, con_reg)
56662306a36Sopenharmony_ci		__field(u32, ep_sel_reg)
56762306a36Sopenharmony_ci		__field(u32, ep_sts_en_reg)
56862306a36Sopenharmony_ci		__field(u32, ep_cfg_reg)
56962306a36Sopenharmony_ci	),
57062306a36Sopenharmony_ci	TP_fast_assign(
57162306a36Sopenharmony_ci		__assign_str(ep_name, pep->name);
57262306a36Sopenharmony_ci		__entry->burst_size = pep->trb_burst_size;
57362306a36Sopenharmony_ci		__entry->maxpack_reg = pep->dir ? readw(&pdev->epx_regs->txmaxpack[pep->num - 1]) :
57462306a36Sopenharmony_ci						  readw(&pdev->epx_regs->rxmaxpack[pep->num - 1]);
57562306a36Sopenharmony_ci		__entry->con_reg = pep->dir ? readb(&pdev->epx_regs->ep[pep->num - 1].txcon) :
57662306a36Sopenharmony_ci					      readb(&pdev->epx_regs->ep[pep->num - 1].rxcon);
57762306a36Sopenharmony_ci		__entry->ep_sel_reg = readl(&pdev->adma_regs->ep_sel);
57862306a36Sopenharmony_ci		__entry->ep_sts_en_reg = readl(&pdev->adma_regs->ep_sts_en);
57962306a36Sopenharmony_ci		__entry->ep_cfg_reg = readl(&pdev->adma_regs->ep_cfg);
58062306a36Sopenharmony_ci	),
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	TP_printk("%s, maxpack: %d, con: %02x, dma_ep_sel: %08x, dma_ep_sts_en: %08x"
58362306a36Sopenharmony_ci		  " dma_ep_cfg %08x",
58462306a36Sopenharmony_ci		  __get_str(ep_name), __entry->maxpack_reg, __entry->con_reg,
58562306a36Sopenharmony_ci		  __entry->ep_sel_reg, __entry->ep_sts_en_reg,
58662306a36Sopenharmony_ci		  __entry->ep_cfg_reg
58762306a36Sopenharmony_ci	)
58862306a36Sopenharmony_ci);
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ciDEFINE_EVENT(cdns2_log_epx_reg_config, cdns2_epx_hw_cfg,
59162306a36Sopenharmony_ci	TP_PROTO(struct cdns2_device *pdev, struct cdns2_endpoint *pep),
59262306a36Sopenharmony_ci	TP_ARGS(pdev, pep)
59362306a36Sopenharmony_ci);
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci#endif /* __LINUX_CDNS2_TRACE */
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci/* This part must be outside header guard. */
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
60062306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
60362306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE cdns2-trace
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci#include <trace/define_trace.h>
606