/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2013 - 2018 Intel Corporation. */

/* Modeled on trace-events-sample.h */

/* The trace subsystem name for i40e will be "i40e".
 *
 * This file is named i40e_trace.h.
 *
 * Since this include file's name is different from the trace
 * subsystem name, we'll have to define TRACE_INCLUDE_FILE at the end
 * of this file.
 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM i40e

/* See trace-events-sample.h for a detailed description of why this
 * guard clause is different from most normal include files.
 */
#if !defined(_I40E_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
#define _I40E_TRACE_H_

#include <linux/tracepoint.h>

/*
 * i40e_trace() macro enables shared code to refer to trace points
 * like:
 *
 * trace_i40e{,vf}_example(args...)
 *
 * ... as:
 *
 * i40e_trace(example, args...)
 *
 * ... to resolve to the PF or VF version of the tracepoint without
 * ifdefs, and to allow tracepoints to be disabled entirely at build
 * time.
 *
 * Trace point should always be referred to in the driver via this
 * macro.
 *
 * Similarly, i40e_trace_enabled(trace_name) wraps references to
 * trace_i40e{,vf}_<trace_name>_enabled() functions.
 */
#define _I40E_TRACE_NAME(trace_name) (trace_ ## i40e ## _ ## trace_name)
#define I40E_TRACE_NAME(trace_name) _I40E_TRACE_NAME(trace_name)

#define i40e_trace(trace_name, args...) I40E_TRACE_NAME(trace_name)(args)

#define i40e_trace_enabled(trace_name) I40E_TRACE_NAME(trace_name##_enabled)()

/* Events common to PF and VF. Corresponding versions will be defined
 * for both, named trace_i40e_* and trace_i40evf_*. The i40e_trace()
 * macro above will select the right trace point name for the driver
 * being built from shared code.
 */

#define NO_DEV "(i40e no_device)"

TRACE_EVENT(i40e_napi_poll,

	TP_PROTO(struct napi_struct *napi, struct i40e_q_vector *q, int budget,
		 int budget_per_ring, unsigned int rx_cleaned, unsigned int tx_cleaned,
		 bool rx_clean_complete, bool tx_clean_complete),

	TP_ARGS(napi, q, budget, budget_per_ring, rx_cleaned, tx_cleaned,
		rx_clean_complete, tx_clean_complete),

	TP_STRUCT__entry(
		__field(int, budget)
		__field(int, budget_per_ring)
		__field(unsigned int, rx_cleaned)
		__field(unsigned int, tx_cleaned)
		__field(int, rx_clean_complete)
		__field(int, tx_clean_complete)
		__field(int, irq_num)
		__field(int, curr_cpu)
		__string(qname, q->name)
		__string(dev_name, napi->dev ? napi->dev->name : NO_DEV)
		__bitmask(irq_affinity,	nr_cpumask_bits)
	),

	TP_fast_assign(
		__entry->budget = budget;
		__entry->budget_per_ring = budget_per_ring;
		__entry->rx_cleaned = rx_cleaned;
		__entry->tx_cleaned = tx_cleaned;
		__entry->rx_clean_complete = rx_clean_complete;
		__entry->tx_clean_complete = tx_clean_complete;
		__entry->irq_num = q->irq_num;
		__entry->curr_cpu = get_cpu();
		__assign_str(qname, q->name);
		__assign_str(dev_name, napi->dev ? napi->dev->name : NO_DEV);
		__assign_bitmask(irq_affinity, cpumask_bits(&q->affinity_mask),
				 nr_cpumask_bits);
	),

	TP_printk("i40e_napi_poll on dev %s q %s irq %d irq_mask %s curr_cpu %d "
		  "budget %d bpr %d rx_cleaned %u tx_cleaned %u "
		  "rx_clean_complete %d tx_clean_complete %d",
		__get_str(dev_name), __get_str(qname), __entry->irq_num,
		__get_bitmask(irq_affinity), __entry->curr_cpu, __entry->budget,
		__entry->budget_per_ring, __entry->rx_cleaned, __entry->tx_cleaned,
		__entry->rx_clean_complete, __entry->tx_clean_complete)
);

/* Events related to a vsi & ring */
DECLARE_EVENT_CLASS(
	i40e_tx_template,

	TP_PROTO(struct i40e_ring *ring,
		 struct i40e_tx_desc *desc,
		 struct i40e_tx_buffer *buf),

	TP_ARGS(ring, desc, buf),

	/* The convention here is to make the first fields in the
	 * TP_STRUCT match the TP_PROTO exactly. This enables the use
	 * of the args struct generated by the tplist tool (from the
	 * bcc-tools package) to be used for those fields. To access
	 * fields other than the tracepoint args will require the
	 * tplist output to be adjusted.
	 */
	TP_STRUCT__entry(
		__field(void*, ring)
		__field(void*, desc)
		__field(void*, buf)
		__string(devname, ring->netdev->name)
	),

	TP_fast_assign(
		__entry->ring = ring;
		__entry->desc = desc;
		__entry->buf = buf;
		__assign_str(devname, ring->netdev->name);
	),

	TP_printk(
		"netdev: %s ring: %p desc: %p buf %p",
		__get_str(devname), __entry->ring,
		__entry->desc, __entry->buf)
);

DEFINE_EVENT(
	i40e_tx_template, i40e_clean_tx_irq,
	TP_PROTO(struct i40e_ring *ring,
		 struct i40e_tx_desc *desc,
		 struct i40e_tx_buffer *buf),

	TP_ARGS(ring, desc, buf));

DEFINE_EVENT(
	i40e_tx_template, i40e_clean_tx_irq_unmap,
	TP_PROTO(struct i40e_ring *ring,
		 struct i40e_tx_desc *desc,
		 struct i40e_tx_buffer *buf),

	TP_ARGS(ring, desc, buf));

DECLARE_EVENT_CLASS(
	i40e_rx_template,

	TP_PROTO(struct i40e_ring *ring,
		 union i40e_16byte_rx_desc *desc,
		 struct xdp_buff *xdp),

	TP_ARGS(ring, desc, xdp),

	TP_STRUCT__entry(
		__field(void*, ring)
		__field(void*, desc)
		__field(void*, xdp)
		__string(devname, ring->netdev->name)
	),

	TP_fast_assign(
		__entry->ring = ring;
		__entry->desc = desc;
		__entry->xdp = xdp;
		__assign_str(devname, ring->netdev->name);
	),

	TP_printk(
		"netdev: %s ring: %p desc: %p xdp %p",
		__get_str(devname), __entry->ring,
		__entry->desc, __entry->xdp)
);

DEFINE_EVENT(
	i40e_rx_template, i40e_clean_rx_irq,
	TP_PROTO(struct i40e_ring *ring,
		 union i40e_16byte_rx_desc *desc,
		 struct xdp_buff *xdp),

	TP_ARGS(ring, desc, xdp));

DEFINE_EVENT(
	i40e_rx_template, i40e_clean_rx_irq_rx,
	TP_PROTO(struct i40e_ring *ring,
		 union i40e_16byte_rx_desc *desc,
		 struct xdp_buff *xdp),

	TP_ARGS(ring, desc, xdp));

DECLARE_EVENT_CLASS(
	i40e_xmit_template,

	TP_PROTO(struct sk_buff *skb,
		 struct i40e_ring *ring),

	TP_ARGS(skb, ring),

	TP_STRUCT__entry(
		__field(void*, skb)
		__field(void*, ring)
		__string(devname, ring->netdev->name)
	),

	TP_fast_assign(
		__entry->skb = skb;
		__entry->ring = ring;
		__assign_str(devname, ring->netdev->name);
	),

	TP_printk(
		"netdev: %s skb: %p ring: %p",
		__get_str(devname), __entry->skb,
		__entry->ring)
);

DEFINE_EVENT(
	i40e_xmit_template, i40e_xmit_frame_ring,
	TP_PROTO(struct sk_buff *skb,
		 struct i40e_ring *ring),

	TP_ARGS(skb, ring));

DEFINE_EVENT(
	i40e_xmit_template, i40e_xmit_frame_ring_drop,
	TP_PROTO(struct sk_buff *skb,
		 struct i40e_ring *ring),

	TP_ARGS(skb, ring));

/* Events unique to the PF. */

#endif /* _I40E_TRACE_H_ */
/* This must be outside ifdef _I40E_TRACE_H */

/* This trace include file is not located in the .../include/trace
 * with the kernel tracepoint definitions, because we're a loadable
 * module.
 */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE i40e_trace
#include <trace/define_trace.h>
