162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * xHCI host controller driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2013 Xenia Ragiadakou
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Xenia Ragiadakou
862306a36Sopenharmony_ci * Email : burzalodowa@gmail.com
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#undef TRACE_SYSTEM
1262306a36Sopenharmony_ci#define TRACE_SYSTEM xhci-hcd
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 xhci_hcd
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#if !defined(__XHCI_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
2262306a36Sopenharmony_ci#define __XHCI_TRACE_H
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/tracepoint.h>
2562306a36Sopenharmony_ci#include "xhci.h"
2662306a36Sopenharmony_ci#include "xhci-dbgcap.h"
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_msg,
2962306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
3062306a36Sopenharmony_ci	TP_ARGS(vaf),
3162306a36Sopenharmony_ci	TP_STRUCT__entry(__vstring(msg, vaf->fmt, vaf->va)),
3262306a36Sopenharmony_ci	TP_fast_assign(
3362306a36Sopenharmony_ci		__assign_vstr(msg, vaf->fmt, vaf->va);
3462306a36Sopenharmony_ci	),
3562306a36Sopenharmony_ci	TP_printk("%s", __get_str(msg))
3662306a36Sopenharmony_ci);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_address,
3962306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
4062306a36Sopenharmony_ci	TP_ARGS(vaf)
4162306a36Sopenharmony_ci);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_context_change,
4462306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
4562306a36Sopenharmony_ci	TP_ARGS(vaf)
4662306a36Sopenharmony_ci);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_quirks,
4962306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
5062306a36Sopenharmony_ci	TP_ARGS(vaf)
5162306a36Sopenharmony_ci);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_reset_ep,
5462306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
5562306a36Sopenharmony_ci	TP_ARGS(vaf)
5662306a36Sopenharmony_ci);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_cancel_urb,
5962306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
6062306a36Sopenharmony_ci	TP_ARGS(vaf)
6162306a36Sopenharmony_ci);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_init,
6462306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
6562306a36Sopenharmony_ci	TP_ARGS(vaf)
6662306a36Sopenharmony_ci);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_msg, xhci_dbg_ring_expansion,
6962306a36Sopenharmony_ci	TP_PROTO(struct va_format *vaf),
7062306a36Sopenharmony_ci	TP_ARGS(vaf)
7162306a36Sopenharmony_ci);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_ctx,
7462306a36Sopenharmony_ci	TP_PROTO(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx,
7562306a36Sopenharmony_ci		 unsigned int ep_num),
7662306a36Sopenharmony_ci	TP_ARGS(xhci, ctx, ep_num),
7762306a36Sopenharmony_ci	TP_STRUCT__entry(
7862306a36Sopenharmony_ci		__field(int, ctx_64)
7962306a36Sopenharmony_ci		__field(unsigned, ctx_type)
8062306a36Sopenharmony_ci		__field(dma_addr_t, ctx_dma)
8162306a36Sopenharmony_ci		__field(u8 *, ctx_va)
8262306a36Sopenharmony_ci		__field(unsigned, ctx_ep_num)
8362306a36Sopenharmony_ci		__dynamic_array(u32, ctx_data,
8462306a36Sopenharmony_ci			((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 8) *
8562306a36Sopenharmony_ci			((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1))
8662306a36Sopenharmony_ci	),
8762306a36Sopenharmony_ci	TP_fast_assign(
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci		__entry->ctx_64 = HCC_64BYTE_CONTEXT(xhci->hcc_params);
9062306a36Sopenharmony_ci		__entry->ctx_type = ctx->type;
9162306a36Sopenharmony_ci		__entry->ctx_dma = ctx->dma;
9262306a36Sopenharmony_ci		__entry->ctx_va = ctx->bytes;
9362306a36Sopenharmony_ci		__entry->ctx_ep_num = ep_num;
9462306a36Sopenharmony_ci		memcpy(__get_dynamic_array(ctx_data), ctx->bytes,
9562306a36Sopenharmony_ci			((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 32) *
9662306a36Sopenharmony_ci			((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1));
9762306a36Sopenharmony_ci	),
9862306a36Sopenharmony_ci	TP_printk("ctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%p",
9962306a36Sopenharmony_ci			__entry->ctx_64, __entry->ctx_type,
10062306a36Sopenharmony_ci			(unsigned long long) __entry->ctx_dma, __entry->ctx_va
10162306a36Sopenharmony_ci	)
10262306a36Sopenharmony_ci);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ctx, xhci_address_ctx,
10562306a36Sopenharmony_ci	TP_PROTO(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx,
10662306a36Sopenharmony_ci		 unsigned int ep_num),
10762306a36Sopenharmony_ci	TP_ARGS(xhci, ctx, ep_num)
10862306a36Sopenharmony_ci);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_trb,
11162306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
11262306a36Sopenharmony_ci	TP_ARGS(ring, trb),
11362306a36Sopenharmony_ci	TP_STRUCT__entry(
11462306a36Sopenharmony_ci		__field(u32, type)
11562306a36Sopenharmony_ci		__field(u32, field0)
11662306a36Sopenharmony_ci		__field(u32, field1)
11762306a36Sopenharmony_ci		__field(u32, field2)
11862306a36Sopenharmony_ci		__field(u32, field3)
11962306a36Sopenharmony_ci	),
12062306a36Sopenharmony_ci	TP_fast_assign(
12162306a36Sopenharmony_ci		__entry->type = ring->type;
12262306a36Sopenharmony_ci		__entry->field0 = le32_to_cpu(trb->field[0]);
12362306a36Sopenharmony_ci		__entry->field1 = le32_to_cpu(trb->field[1]);
12462306a36Sopenharmony_ci		__entry->field2 = le32_to_cpu(trb->field[2]);
12562306a36Sopenharmony_ci		__entry->field3 = le32_to_cpu(trb->field[3]);
12662306a36Sopenharmony_ci	),
12762306a36Sopenharmony_ci	TP_printk("%s: %s", xhci_ring_type_string(__entry->type),
12862306a36Sopenharmony_ci		  xhci_decode_trb(__get_buf(XHCI_MSG_MAX), XHCI_MSG_MAX, __entry->field0,
12962306a36Sopenharmony_ci				  __entry->field1, __entry->field2, __entry->field3)
13062306a36Sopenharmony_ci	)
13162306a36Sopenharmony_ci);
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_handle_event,
13462306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
13562306a36Sopenharmony_ci	TP_ARGS(ring, trb)
13662306a36Sopenharmony_ci);
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_handle_command,
13962306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
14062306a36Sopenharmony_ci	TP_ARGS(ring, trb)
14162306a36Sopenharmony_ci);
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_handle_transfer,
14462306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
14562306a36Sopenharmony_ci	TP_ARGS(ring, trb)
14662306a36Sopenharmony_ci);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_queue_trb,
14962306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
15062306a36Sopenharmony_ci	TP_ARGS(ring, trb)
15162306a36Sopenharmony_ci);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_dbc_handle_event,
15462306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
15562306a36Sopenharmony_ci	TP_ARGS(ring, trb)
15662306a36Sopenharmony_ci);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_dbc_handle_transfer,
15962306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
16062306a36Sopenharmony_ci	TP_ARGS(ring, trb)
16162306a36Sopenharmony_ci);
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_trb, xhci_dbc_gadget_ep_queue,
16462306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb),
16562306a36Sopenharmony_ci	TP_ARGS(ring, trb)
16662306a36Sopenharmony_ci);
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_free_virt_dev,
16962306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
17062306a36Sopenharmony_ci	TP_ARGS(vdev),
17162306a36Sopenharmony_ci	TP_STRUCT__entry(
17262306a36Sopenharmony_ci		__field(void *, vdev)
17362306a36Sopenharmony_ci		__field(unsigned long long, out_ctx)
17462306a36Sopenharmony_ci		__field(unsigned long long, in_ctx)
17562306a36Sopenharmony_ci		__field(u8, fake_port)
17662306a36Sopenharmony_ci		__field(u8, real_port)
17762306a36Sopenharmony_ci		__field(u16, current_mel)
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	),
18062306a36Sopenharmony_ci	TP_fast_assign(
18162306a36Sopenharmony_ci		__entry->vdev = vdev;
18262306a36Sopenharmony_ci		__entry->in_ctx = (unsigned long long) vdev->in_ctx->dma;
18362306a36Sopenharmony_ci		__entry->out_ctx = (unsigned long long) vdev->out_ctx->dma;
18462306a36Sopenharmony_ci		__entry->fake_port = (u8) vdev->fake_port;
18562306a36Sopenharmony_ci		__entry->real_port = (u8) vdev->real_port;
18662306a36Sopenharmony_ci		__entry->current_mel = (u16) vdev->current_mel;
18762306a36Sopenharmony_ci		),
18862306a36Sopenharmony_ci	TP_printk("vdev %p ctx %llx | %llx fake_port %d real_port %d current_mel %d",
18962306a36Sopenharmony_ci		__entry->vdev, __entry->in_ctx, __entry->out_ctx,
19062306a36Sopenharmony_ci		__entry->fake_port, __entry->real_port, __entry->current_mel
19162306a36Sopenharmony_ci	)
19262306a36Sopenharmony_ci);
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_free_virt_dev, xhci_free_virt_device,
19562306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
19662306a36Sopenharmony_ci	TP_ARGS(vdev)
19762306a36Sopenharmony_ci);
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_virt_dev,
20062306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
20162306a36Sopenharmony_ci	TP_ARGS(vdev),
20262306a36Sopenharmony_ci	TP_STRUCT__entry(
20362306a36Sopenharmony_ci		__field(void *, vdev)
20462306a36Sopenharmony_ci		__field(unsigned long long, out_ctx)
20562306a36Sopenharmony_ci		__field(unsigned long long, in_ctx)
20662306a36Sopenharmony_ci		__field(int, devnum)
20762306a36Sopenharmony_ci		__field(int, state)
20862306a36Sopenharmony_ci		__field(int, speed)
20962306a36Sopenharmony_ci		__field(u8, portnum)
21062306a36Sopenharmony_ci		__field(u8, level)
21162306a36Sopenharmony_ci		__field(int, slot_id)
21262306a36Sopenharmony_ci	),
21362306a36Sopenharmony_ci	TP_fast_assign(
21462306a36Sopenharmony_ci		__entry->vdev = vdev;
21562306a36Sopenharmony_ci		__entry->in_ctx = (unsigned long long) vdev->in_ctx->dma;
21662306a36Sopenharmony_ci		__entry->out_ctx = (unsigned long long) vdev->out_ctx->dma;
21762306a36Sopenharmony_ci		__entry->devnum = vdev->udev->devnum;
21862306a36Sopenharmony_ci		__entry->state = vdev->udev->state;
21962306a36Sopenharmony_ci		__entry->speed = vdev->udev->speed;
22062306a36Sopenharmony_ci		__entry->portnum = vdev->udev->portnum;
22162306a36Sopenharmony_ci		__entry->level = vdev->udev->level;
22262306a36Sopenharmony_ci		__entry->slot_id = vdev->udev->slot_id;
22362306a36Sopenharmony_ci	),
22462306a36Sopenharmony_ci	TP_printk("vdev %p ctx %llx | %llx num %d state %d speed %d port %d level %d slot %d",
22562306a36Sopenharmony_ci		__entry->vdev, __entry->in_ctx, __entry->out_ctx,
22662306a36Sopenharmony_ci		__entry->devnum, __entry->state, __entry->speed,
22762306a36Sopenharmony_ci		__entry->portnum, __entry->level, __entry->slot_id
22862306a36Sopenharmony_ci	)
22962306a36Sopenharmony_ci);
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_virt_dev, xhci_alloc_virt_device,
23262306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
23362306a36Sopenharmony_ci	TP_ARGS(vdev)
23462306a36Sopenharmony_ci);
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device,
23762306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
23862306a36Sopenharmony_ci	TP_ARGS(vdev)
23962306a36Sopenharmony_ci);
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_virt_dev, xhci_setup_addressable_virt_device,
24262306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
24362306a36Sopenharmony_ci	TP_ARGS(vdev)
24462306a36Sopenharmony_ci);
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_virt_dev, xhci_stop_device,
24762306a36Sopenharmony_ci	TP_PROTO(struct xhci_virt_device *vdev),
24862306a36Sopenharmony_ci	TP_ARGS(vdev)
24962306a36Sopenharmony_ci);
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_urb,
25262306a36Sopenharmony_ci	TP_PROTO(struct urb *urb),
25362306a36Sopenharmony_ci	TP_ARGS(urb),
25462306a36Sopenharmony_ci	TP_STRUCT__entry(
25562306a36Sopenharmony_ci		__field(void *, urb)
25662306a36Sopenharmony_ci		__field(unsigned int, pipe)
25762306a36Sopenharmony_ci		__field(unsigned int, stream)
25862306a36Sopenharmony_ci		__field(int, status)
25962306a36Sopenharmony_ci		__field(unsigned int, flags)
26062306a36Sopenharmony_ci		__field(int, num_mapped_sgs)
26162306a36Sopenharmony_ci		__field(int, num_sgs)
26262306a36Sopenharmony_ci		__field(int, length)
26362306a36Sopenharmony_ci		__field(int, actual)
26462306a36Sopenharmony_ci		__field(int, epnum)
26562306a36Sopenharmony_ci		__field(int, dir_in)
26662306a36Sopenharmony_ci		__field(int, type)
26762306a36Sopenharmony_ci		__field(int, slot_id)
26862306a36Sopenharmony_ci	),
26962306a36Sopenharmony_ci	TP_fast_assign(
27062306a36Sopenharmony_ci		__entry->urb = urb;
27162306a36Sopenharmony_ci		__entry->pipe = urb->pipe;
27262306a36Sopenharmony_ci		__entry->stream = urb->stream_id;
27362306a36Sopenharmony_ci		__entry->status = urb->status;
27462306a36Sopenharmony_ci		__entry->flags = urb->transfer_flags;
27562306a36Sopenharmony_ci		__entry->num_mapped_sgs = urb->num_mapped_sgs;
27662306a36Sopenharmony_ci		__entry->num_sgs = urb->num_sgs;
27762306a36Sopenharmony_ci		__entry->length = urb->transfer_buffer_length;
27862306a36Sopenharmony_ci		__entry->actual = urb->actual_length;
27962306a36Sopenharmony_ci		__entry->epnum = usb_endpoint_num(&urb->ep->desc);
28062306a36Sopenharmony_ci		__entry->dir_in = usb_endpoint_dir_in(&urb->ep->desc);
28162306a36Sopenharmony_ci		__entry->type = usb_endpoint_type(&urb->ep->desc);
28262306a36Sopenharmony_ci		__entry->slot_id = urb->dev->slot_id;
28362306a36Sopenharmony_ci	),
28462306a36Sopenharmony_ci	TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x",
28562306a36Sopenharmony_ci			__entry->epnum, __entry->dir_in ? "in" : "out",
28662306a36Sopenharmony_ci			__print_symbolic(__entry->type,
28762306a36Sopenharmony_ci				   { USB_ENDPOINT_XFER_INT,	"intr" },
28862306a36Sopenharmony_ci				   { USB_ENDPOINT_XFER_CONTROL,	"control" },
28962306a36Sopenharmony_ci				   { USB_ENDPOINT_XFER_BULK,	"bulk" },
29062306a36Sopenharmony_ci				   { USB_ENDPOINT_XFER_ISOC,	"isoc" }),
29162306a36Sopenharmony_ci			__entry->urb, __entry->pipe, __entry->slot_id,
29262306a36Sopenharmony_ci			__entry->actual, __entry->length, __entry->num_mapped_sgs,
29362306a36Sopenharmony_ci			__entry->num_sgs, __entry->stream, __entry->flags
29462306a36Sopenharmony_ci		)
29562306a36Sopenharmony_ci);
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_urb, xhci_urb_enqueue,
29862306a36Sopenharmony_ci	TP_PROTO(struct urb *urb),
29962306a36Sopenharmony_ci	TP_ARGS(urb)
30062306a36Sopenharmony_ci);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_urb, xhci_urb_giveback,
30362306a36Sopenharmony_ci	TP_PROTO(struct urb *urb),
30462306a36Sopenharmony_ci	TP_ARGS(urb)
30562306a36Sopenharmony_ci);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_urb, xhci_urb_dequeue,
30862306a36Sopenharmony_ci	TP_PROTO(struct urb *urb),
30962306a36Sopenharmony_ci	TP_ARGS(urb)
31062306a36Sopenharmony_ci);
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_ep_ctx,
31362306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
31462306a36Sopenharmony_ci	TP_ARGS(ctx),
31562306a36Sopenharmony_ci	TP_STRUCT__entry(
31662306a36Sopenharmony_ci		__field(u32, info)
31762306a36Sopenharmony_ci		__field(u32, info2)
31862306a36Sopenharmony_ci		__field(u64, deq)
31962306a36Sopenharmony_ci		__field(u32, tx_info)
32062306a36Sopenharmony_ci	),
32162306a36Sopenharmony_ci	TP_fast_assign(
32262306a36Sopenharmony_ci		__entry->info = le32_to_cpu(ctx->ep_info);
32362306a36Sopenharmony_ci		__entry->info2 = le32_to_cpu(ctx->ep_info2);
32462306a36Sopenharmony_ci		__entry->deq = le64_to_cpu(ctx->deq);
32562306a36Sopenharmony_ci		__entry->tx_info = le32_to_cpu(ctx->tx_info);
32662306a36Sopenharmony_ci	),
32762306a36Sopenharmony_ci	TP_printk("%s", xhci_decode_ep_context(__get_buf(XHCI_MSG_MAX),
32862306a36Sopenharmony_ci		__entry->info, __entry->info2, __entry->deq, __entry->tx_info)
32962306a36Sopenharmony_ci	)
33062306a36Sopenharmony_ci);
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ep_ctx, xhci_handle_cmd_stop_ep,
33362306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
33462306a36Sopenharmony_ci	TP_ARGS(ctx)
33562306a36Sopenharmony_ci);
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ep_ctx, xhci_handle_cmd_set_deq_ep,
33862306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
33962306a36Sopenharmony_ci	TP_ARGS(ctx)
34062306a36Sopenharmony_ci);
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ep_ctx, xhci_handle_cmd_reset_ep,
34362306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
34462306a36Sopenharmony_ci	TP_ARGS(ctx)
34562306a36Sopenharmony_ci);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ep_ctx, xhci_handle_cmd_config_ep,
34862306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
34962306a36Sopenharmony_ci	TP_ARGS(ctx)
35062306a36Sopenharmony_ci);
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ep_ctx, xhci_add_endpoint,
35362306a36Sopenharmony_ci	TP_PROTO(struct xhci_ep_ctx *ctx),
35462306a36Sopenharmony_ci	TP_ARGS(ctx)
35562306a36Sopenharmony_ci);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_slot_ctx,
35862306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
35962306a36Sopenharmony_ci	TP_ARGS(ctx),
36062306a36Sopenharmony_ci	TP_STRUCT__entry(
36162306a36Sopenharmony_ci		__field(u32, info)
36262306a36Sopenharmony_ci		__field(u32, info2)
36362306a36Sopenharmony_ci		__field(u32, tt_info)
36462306a36Sopenharmony_ci		__field(u32, state)
36562306a36Sopenharmony_ci	),
36662306a36Sopenharmony_ci	TP_fast_assign(
36762306a36Sopenharmony_ci		__entry->info = le32_to_cpu(ctx->dev_info);
36862306a36Sopenharmony_ci		__entry->info2 = le32_to_cpu(ctx->dev_info2);
36962306a36Sopenharmony_ci		__entry->tt_info = le64_to_cpu(ctx->tt_info);
37062306a36Sopenharmony_ci		__entry->state = le32_to_cpu(ctx->dev_state);
37162306a36Sopenharmony_ci	),
37262306a36Sopenharmony_ci	TP_printk("%s", xhci_decode_slot_context(__get_buf(XHCI_MSG_MAX),
37362306a36Sopenharmony_ci			__entry->info, __entry->info2,
37462306a36Sopenharmony_ci			__entry->tt_info, __entry->state)
37562306a36Sopenharmony_ci	)
37662306a36Sopenharmony_ci);
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_alloc_dev,
37962306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
38062306a36Sopenharmony_ci	TP_ARGS(ctx)
38162306a36Sopenharmony_ci);
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_free_dev,
38462306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
38562306a36Sopenharmony_ci	TP_ARGS(ctx)
38662306a36Sopenharmony_ci);
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_handle_cmd_disable_slot,
38962306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
39062306a36Sopenharmony_ci	TP_ARGS(ctx)
39162306a36Sopenharmony_ci);
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_discover_or_reset_device,
39462306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
39562306a36Sopenharmony_ci	TP_ARGS(ctx)
39662306a36Sopenharmony_ci);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_setup_device_slot,
39962306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
40062306a36Sopenharmony_ci	TP_ARGS(ctx)
40162306a36Sopenharmony_ci);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_handle_cmd_addr_dev,
40462306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
40562306a36Sopenharmony_ci	TP_ARGS(ctx)
40662306a36Sopenharmony_ci);
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_handle_cmd_reset_dev,
40962306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
41062306a36Sopenharmony_ci	TP_ARGS(ctx)
41162306a36Sopenharmony_ci);
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_handle_cmd_set_deq,
41462306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
41562306a36Sopenharmony_ci	TP_ARGS(ctx)
41662306a36Sopenharmony_ci);
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_slot_ctx, xhci_configure_endpoint,
41962306a36Sopenharmony_ci	TP_PROTO(struct xhci_slot_ctx *ctx),
42062306a36Sopenharmony_ci	TP_ARGS(ctx)
42162306a36Sopenharmony_ci);
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_ctrl_ctx,
42462306a36Sopenharmony_ci	TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
42562306a36Sopenharmony_ci	TP_ARGS(ctrl_ctx),
42662306a36Sopenharmony_ci	TP_STRUCT__entry(
42762306a36Sopenharmony_ci		__field(u32, drop)
42862306a36Sopenharmony_ci		__field(u32, add)
42962306a36Sopenharmony_ci	),
43062306a36Sopenharmony_ci	TP_fast_assign(
43162306a36Sopenharmony_ci		__entry->drop = le32_to_cpu(ctrl_ctx->drop_flags);
43262306a36Sopenharmony_ci		__entry->add = le32_to_cpu(ctrl_ctx->add_flags);
43362306a36Sopenharmony_ci	),
43462306a36Sopenharmony_ci	TP_printk("%s", xhci_decode_ctrl_ctx(__get_buf(XHCI_MSG_MAX), __entry->drop, __entry->add)
43562306a36Sopenharmony_ci	)
43662306a36Sopenharmony_ci);
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ctrl_ctx, xhci_address_ctrl_ctx,
43962306a36Sopenharmony_ci	TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
44062306a36Sopenharmony_ci	TP_ARGS(ctrl_ctx)
44162306a36Sopenharmony_ci);
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ctrl_ctx, xhci_configure_endpoint_ctrl_ctx,
44462306a36Sopenharmony_ci	TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
44562306a36Sopenharmony_ci	TP_ARGS(ctrl_ctx)
44662306a36Sopenharmony_ci);
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_ring,
44962306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
45062306a36Sopenharmony_ci	TP_ARGS(ring),
45162306a36Sopenharmony_ci	TP_STRUCT__entry(
45262306a36Sopenharmony_ci		__field(u32, type)
45362306a36Sopenharmony_ci		__field(void *, ring)
45462306a36Sopenharmony_ci		__field(dma_addr_t, enq)
45562306a36Sopenharmony_ci		__field(dma_addr_t, deq)
45662306a36Sopenharmony_ci		__field(dma_addr_t, enq_seg)
45762306a36Sopenharmony_ci		__field(dma_addr_t, deq_seg)
45862306a36Sopenharmony_ci		__field(unsigned int, num_segs)
45962306a36Sopenharmony_ci		__field(unsigned int, stream_id)
46062306a36Sopenharmony_ci		__field(unsigned int, cycle_state)
46162306a36Sopenharmony_ci		__field(unsigned int, bounce_buf_len)
46262306a36Sopenharmony_ci	),
46362306a36Sopenharmony_ci	TP_fast_assign(
46462306a36Sopenharmony_ci		__entry->ring = ring;
46562306a36Sopenharmony_ci		__entry->type = ring->type;
46662306a36Sopenharmony_ci		__entry->num_segs = ring->num_segs;
46762306a36Sopenharmony_ci		__entry->stream_id = ring->stream_id;
46862306a36Sopenharmony_ci		__entry->enq_seg = ring->enq_seg->dma;
46962306a36Sopenharmony_ci		__entry->deq_seg = ring->deq_seg->dma;
47062306a36Sopenharmony_ci		__entry->cycle_state = ring->cycle_state;
47162306a36Sopenharmony_ci		__entry->bounce_buf_len = ring->bounce_buf_len;
47262306a36Sopenharmony_ci		__entry->enq = xhci_trb_virt_to_dma(ring->enq_seg, ring->enqueue);
47362306a36Sopenharmony_ci		__entry->deq = xhci_trb_virt_to_dma(ring->deq_seg, ring->dequeue);
47462306a36Sopenharmony_ci	),
47562306a36Sopenharmony_ci	TP_printk("%s %p: enq %pad(%pad) deq %pad(%pad) segs %d stream %d bounce %d cycle %d",
47662306a36Sopenharmony_ci			xhci_ring_type_string(__entry->type), __entry->ring,
47762306a36Sopenharmony_ci			&__entry->enq, &__entry->enq_seg,
47862306a36Sopenharmony_ci			&__entry->deq, &__entry->deq_seg,
47962306a36Sopenharmony_ci			__entry->num_segs,
48062306a36Sopenharmony_ci			__entry->stream_id,
48162306a36Sopenharmony_ci			__entry->bounce_buf_len,
48262306a36Sopenharmony_ci			__entry->cycle_state
48362306a36Sopenharmony_ci		)
48462306a36Sopenharmony_ci);
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ring, xhci_ring_alloc,
48762306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
48862306a36Sopenharmony_ci	TP_ARGS(ring)
48962306a36Sopenharmony_ci);
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ring, xhci_ring_free,
49262306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
49362306a36Sopenharmony_ci	TP_ARGS(ring)
49462306a36Sopenharmony_ci);
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ring, xhci_ring_expansion,
49762306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
49862306a36Sopenharmony_ci	TP_ARGS(ring)
49962306a36Sopenharmony_ci);
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ring, xhci_inc_enq,
50262306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
50362306a36Sopenharmony_ci	TP_ARGS(ring)
50462306a36Sopenharmony_ci);
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_ring, xhci_inc_deq,
50762306a36Sopenharmony_ci	TP_PROTO(struct xhci_ring *ring),
50862306a36Sopenharmony_ci	TP_ARGS(ring)
50962306a36Sopenharmony_ci);
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_portsc,
51262306a36Sopenharmony_ci		    TP_PROTO(u32 portnum, u32 portsc),
51362306a36Sopenharmony_ci		    TP_ARGS(portnum, portsc),
51462306a36Sopenharmony_ci		    TP_STRUCT__entry(
51562306a36Sopenharmony_ci				     __field(u32, portnum)
51662306a36Sopenharmony_ci				     __field(u32, portsc)
51762306a36Sopenharmony_ci				     ),
51862306a36Sopenharmony_ci		    TP_fast_assign(
51962306a36Sopenharmony_ci				   __entry->portnum = portnum;
52062306a36Sopenharmony_ci				   __entry->portsc = portsc;
52162306a36Sopenharmony_ci				   ),
52262306a36Sopenharmony_ci		    TP_printk("port-%d: %s",
52362306a36Sopenharmony_ci			      __entry->portnum,
52462306a36Sopenharmony_ci			      xhci_decode_portsc(__get_buf(XHCI_MSG_MAX), __entry->portsc)
52562306a36Sopenharmony_ci			      )
52662306a36Sopenharmony_ci);
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_portsc, xhci_handle_port_status,
52962306a36Sopenharmony_ci	     TP_PROTO(u32 portnum, u32 portsc),
53062306a36Sopenharmony_ci	     TP_ARGS(portnum, portsc)
53162306a36Sopenharmony_ci);
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_portsc, xhci_get_port_status,
53462306a36Sopenharmony_ci	     TP_PROTO(u32 portnum, u32 portsc),
53562306a36Sopenharmony_ci	     TP_ARGS(portnum, portsc)
53662306a36Sopenharmony_ci);
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_portsc, xhci_hub_status_data,
53962306a36Sopenharmony_ci	     TP_PROTO(u32 portnum, u32 portsc),
54062306a36Sopenharmony_ci	     TP_ARGS(portnum, portsc)
54162306a36Sopenharmony_ci);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_log_doorbell,
54462306a36Sopenharmony_ci	TP_PROTO(u32 slot, u32 doorbell),
54562306a36Sopenharmony_ci	TP_ARGS(slot, doorbell),
54662306a36Sopenharmony_ci	TP_STRUCT__entry(
54762306a36Sopenharmony_ci		__field(u32, slot)
54862306a36Sopenharmony_ci		__field(u32, doorbell)
54962306a36Sopenharmony_ci	),
55062306a36Sopenharmony_ci	TP_fast_assign(
55162306a36Sopenharmony_ci		__entry->slot = slot;
55262306a36Sopenharmony_ci		__entry->doorbell = doorbell;
55362306a36Sopenharmony_ci	),
55462306a36Sopenharmony_ci	TP_printk("Ring doorbell for %s",
55562306a36Sopenharmony_ci		  xhci_decode_doorbell(__get_buf(XHCI_MSG_MAX), __entry->slot, __entry->doorbell)
55662306a36Sopenharmony_ci	)
55762306a36Sopenharmony_ci);
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_doorbell, xhci_ring_ep_doorbell,
56062306a36Sopenharmony_ci	     TP_PROTO(u32 slot, u32 doorbell),
56162306a36Sopenharmony_ci	     TP_ARGS(slot, doorbell)
56262306a36Sopenharmony_ci);
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ciDEFINE_EVENT(xhci_log_doorbell, xhci_ring_host_doorbell,
56562306a36Sopenharmony_ci	     TP_PROTO(u32 slot, u32 doorbell),
56662306a36Sopenharmony_ci	     TP_ARGS(slot, doorbell)
56762306a36Sopenharmony_ci);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ciDECLARE_EVENT_CLASS(xhci_dbc_log_request,
57062306a36Sopenharmony_ci	TP_PROTO(struct dbc_request *req),
57162306a36Sopenharmony_ci	TP_ARGS(req),
57262306a36Sopenharmony_ci	TP_STRUCT__entry(
57362306a36Sopenharmony_ci		__field(struct dbc_request *, req)
57462306a36Sopenharmony_ci		__field(bool, dir)
57562306a36Sopenharmony_ci		__field(unsigned int, actual)
57662306a36Sopenharmony_ci		__field(unsigned int, length)
57762306a36Sopenharmony_ci		__field(int, status)
57862306a36Sopenharmony_ci	),
57962306a36Sopenharmony_ci	TP_fast_assign(
58062306a36Sopenharmony_ci		__entry->req = req;
58162306a36Sopenharmony_ci		__entry->dir = req->direction;
58262306a36Sopenharmony_ci		__entry->actual = req->actual;
58362306a36Sopenharmony_ci		__entry->length = req->length;
58462306a36Sopenharmony_ci		__entry->status = req->status;
58562306a36Sopenharmony_ci	),
58662306a36Sopenharmony_ci	TP_printk("%s: req %p length %u/%u ==> %d",
58762306a36Sopenharmony_ci		__entry->dir ? "bulk-in" : "bulk-out",
58862306a36Sopenharmony_ci		__entry->req, __entry->actual,
58962306a36Sopenharmony_ci		__entry->length, __entry->status
59062306a36Sopenharmony_ci	)
59162306a36Sopenharmony_ci);
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ciDEFINE_EVENT(xhci_dbc_log_request, xhci_dbc_alloc_request,
59462306a36Sopenharmony_ci	TP_PROTO(struct dbc_request *req),
59562306a36Sopenharmony_ci	TP_ARGS(req)
59662306a36Sopenharmony_ci);
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ciDEFINE_EVENT(xhci_dbc_log_request, xhci_dbc_free_request,
59962306a36Sopenharmony_ci	TP_PROTO(struct dbc_request *req),
60062306a36Sopenharmony_ci	TP_ARGS(req)
60162306a36Sopenharmony_ci);
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ciDEFINE_EVENT(xhci_dbc_log_request, xhci_dbc_queue_request,
60462306a36Sopenharmony_ci	TP_PROTO(struct dbc_request *req),
60562306a36Sopenharmony_ci	TP_ARGS(req)
60662306a36Sopenharmony_ci);
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ciDEFINE_EVENT(xhci_dbc_log_request, xhci_dbc_giveback_request,
60962306a36Sopenharmony_ci	TP_PROTO(struct dbc_request *req),
61062306a36Sopenharmony_ci	TP_ARGS(req)
61162306a36Sopenharmony_ci);
61262306a36Sopenharmony_ci#endif /* __XHCI_TRACE_H */
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci/* this part must be outside header guard */
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
61762306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH .
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
62062306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE xhci-trace
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci#include <trace/define_trace.h>
623