/*
 * Copyright(c) 2015 - 2017 Intel Corporation.
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * BSD LICENSE
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  - Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  - Neither the name of Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
#if !defined(__HFI1_TRACE_TX_H) || defined(TRACE_HEADER_MULTI_READ)
#define __HFI1_TRACE_TX_H

#include <linux/tracepoint.h>
#include <linux/trace_seq.h>

#include "hfi.h"
#include "mad.h"
#include "sdma.h"

const char *parse_sdma_flags(struct trace_seq *p, u64 desc0, u64 desc1);

#define __parse_sdma_flags(desc0, desc1) parse_sdma_flags(p, desc0, desc1)

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_tx

TRACE_EVENT(hfi1_piofree,
	    TP_PROTO(struct send_context *sc, int extra),
	    TP_ARGS(sc, extra),
	    TP_STRUCT__entry(DD_DEV_ENTRY(sc->dd)
	    __field(u32, sw_index)
	    __field(u32, hw_context)
	    __field(int, extra)
	    ),
	    TP_fast_assign(DD_DEV_ASSIGN(sc->dd);
	    __entry->sw_index = sc->sw_index;
	    __entry->hw_context = sc->hw_context;
	    __entry->extra = extra;
	    ),
	    TP_printk("[%s] ctxt %u(%u) extra %d",
		      __get_str(dev),
		      __entry->sw_index,
		      __entry->hw_context,
		      __entry->extra
	    )
);

TRACE_EVENT(hfi1_wantpiointr,
	    TP_PROTO(struct send_context *sc, u32 needint, u64 credit_ctrl),
	    TP_ARGS(sc, needint, credit_ctrl),
	    TP_STRUCT__entry(DD_DEV_ENTRY(sc->dd)
			__field(u32, sw_index)
			__field(u32, hw_context)
			__field(u32, needint)
			__field(u64, credit_ctrl)
			),
	    TP_fast_assign(DD_DEV_ASSIGN(sc->dd);
			__entry->sw_index = sc->sw_index;
			__entry->hw_context = sc->hw_context;
			__entry->needint = needint;
			__entry->credit_ctrl = credit_ctrl;
			),
	    TP_printk("[%s] ctxt %u(%u) on %d credit_ctrl 0x%llx",
		      __get_str(dev),
		      __entry->sw_index,
		      __entry->hw_context,
		      __entry->needint,
		      (unsigned long long)__entry->credit_ctrl
		      )
);

DECLARE_EVENT_CLASS(hfi1_qpsleepwakeup_template,
		    TP_PROTO(struct rvt_qp *qp, u32 flags),
		    TP_ARGS(qp, flags),
		    TP_STRUCT__entry(
		    DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
		    __field(u32, qpn)
		    __field(u32, flags)
		    __field(u32, s_flags)
		    ),
		    TP_fast_assign(
		    DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
		    __entry->flags = flags;
		    __entry->qpn = qp->ibqp.qp_num;
		    __entry->s_flags = qp->s_flags;
		    ),
		    TP_printk(
		    "[%s] qpn 0x%x flags 0x%x s_flags 0x%x",
		    __get_str(dev),
		    __entry->qpn,
		    __entry->flags,
		    __entry->s_flags
		    )
);

DEFINE_EVENT(hfi1_qpsleepwakeup_template, hfi1_qpwakeup,
	     TP_PROTO(struct rvt_qp *qp, u32 flags),
	     TP_ARGS(qp, flags));

DEFINE_EVENT(hfi1_qpsleepwakeup_template, hfi1_qpsleep,
	     TP_PROTO(struct rvt_qp *qp, u32 flags),
	     TP_ARGS(qp, flags));

TRACE_EVENT(hfi1_sdma_descriptor,
	    TP_PROTO(struct sdma_engine *sde,
		     u64 desc0,
		     u64 desc1,
		     u16 e,
		     void *descp),
		     TP_ARGS(sde, desc0, desc1, e, descp),
		     TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		     __field(void *, descp)
		     __field(u64, desc0)
		     __field(u64, desc1)
		     __field(u16, e)
		     __field(u8, idx)
		     ),
		     TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		     __entry->desc0 = desc0;
		     __entry->desc1 = desc1;
		     __entry->idx = sde->this_idx;
		     __entry->descp = descp;
		     __entry->e = e;
		     ),
	    TP_printk(
	    "[%s] SDE(%u) flags:%s addr:0x%016llx gen:%u len:%u d0:%016llx d1:%016llx to %p,%u",
	    __get_str(dev),
	    __entry->idx,
	    __parse_sdma_flags(__entry->desc0, __entry->desc1),
	    (__entry->desc0 >> SDMA_DESC0_PHY_ADDR_SHIFT) &
	    SDMA_DESC0_PHY_ADDR_MASK,
	    (u8)((__entry->desc1 >> SDMA_DESC1_GENERATION_SHIFT) &
	    SDMA_DESC1_GENERATION_MASK),
	    (u16)((__entry->desc0 >> SDMA_DESC0_BYTE_COUNT_SHIFT) &
	    SDMA_DESC0_BYTE_COUNT_MASK),
	    __entry->desc0,
	    __entry->desc1,
	    __entry->descp,
	    __entry->e
	    )
);

TRACE_EVENT(hfi1_sdma_engine_select,
	    TP_PROTO(struct hfi1_devdata *dd, u32 sel, u8 vl, u8 idx),
	    TP_ARGS(dd, sel, vl, idx),
	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
	    __field(u32, sel)
	    __field(u8, vl)
	    __field(u8, idx)
	    ),
	    TP_fast_assign(DD_DEV_ASSIGN(dd);
	    __entry->sel = sel;
	    __entry->vl = vl;
	    __entry->idx = idx;
	    ),
	    TP_printk("[%s] selecting SDE %u sel 0x%x vl %u",
		      __get_str(dev),
		      __entry->idx,
		      __entry->sel,
		      __entry->vl
		      )
);

TRACE_EVENT(hfi1_sdma_user_free_queues,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt),
	    TP_ARGS(dd, ctxt, subctxt),
	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
			     __field(u16, ctxt)
			     __field(u16, subctxt)
			     ),
	    TP_fast_assign(DD_DEV_ASSIGN(dd);
			   __entry->ctxt = ctxt;
			   __entry->subctxt = subctxt;
			   ),
	    TP_printk("[%s] SDMA [%u:%u] Freeing user SDMA queues",
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt
		      )
);

TRACE_EVENT(hfi1_sdma_user_process_request,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		     u16 comp_idx),
	    TP_ARGS(dd, ctxt, subctxt, comp_idx),
	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
			     __field(u16, ctxt)
			     __field(u16, subctxt)
			     __field(u16, comp_idx)
			     ),
	    TP_fast_assign(DD_DEV_ASSIGN(dd);
			   __entry->ctxt = ctxt;
			   __entry->subctxt = subctxt;
			   __entry->comp_idx = comp_idx;
			   ),
	    TP_printk("[%s] SDMA [%u:%u] Using req/comp entry: %u",
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->comp_idx
		      )
);

DECLARE_EVENT_CLASS(
	hfi1_sdma_value_template,
	TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt, u16 comp_idx,
		 u32 value),
	TP_ARGS(dd, ctxt, subctxt, comp_idx, value),
	TP_STRUCT__entry(DD_DEV_ENTRY(dd)
			 __field(u16, ctxt)
			 __field(u16, subctxt)
			 __field(u16, comp_idx)
			 __field(u32, value)
		),
	TP_fast_assign(DD_DEV_ASSIGN(dd);
		       __entry->ctxt = ctxt;
		       __entry->subctxt = subctxt;
		       __entry->comp_idx = comp_idx;
		       __entry->value = value;
		),
	TP_printk("[%s] SDMA [%u:%u:%u] value: %u",
		  __get_str(dev),
		  __entry->ctxt,
		  __entry->subctxt,
		  __entry->comp_idx,
		  __entry->value
		)
);

DEFINE_EVENT(hfi1_sdma_value_template, hfi1_sdma_user_initial_tidoffset,
	     TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		      u16 comp_idx, u32 tidoffset),
	     TP_ARGS(dd, ctxt, subctxt, comp_idx, tidoffset));

DEFINE_EVENT(hfi1_sdma_value_template, hfi1_sdma_user_data_length,
	     TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		      u16 comp_idx, u32 data_len),
	     TP_ARGS(dd, ctxt, subctxt, comp_idx, data_len));

DEFINE_EVENT(hfi1_sdma_value_template, hfi1_sdma_user_compute_length,
	     TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		      u16 comp_idx, u32 data_len),
	     TP_ARGS(dd, ctxt, subctxt, comp_idx, data_len));

TRACE_EVENT(hfi1_sdma_user_tid_info,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		     u16 comp_idx, u32 tidoffset, u32 units, u8 shift),
	    TP_ARGS(dd, ctxt, subctxt, comp_idx, tidoffset, units, shift),
	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
			     __field(u16, ctxt)
			     __field(u16, subctxt)
			     __field(u16, comp_idx)
			     __field(u32, tidoffset)
			     __field(u32, units)
			     __field(u8, shift)
			     ),
	    TP_fast_assign(DD_DEV_ASSIGN(dd);
			   __entry->ctxt = ctxt;
			   __entry->subctxt = subctxt;
			   __entry->comp_idx = comp_idx;
			   __entry->tidoffset = tidoffset;
			   __entry->units = units;
			   __entry->shift = shift;
			   ),
	    TP_printk("[%s] SDMA [%u:%u:%u] TID offset %ubytes %uunits om %u",
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->comp_idx,
		      __entry->tidoffset,
		      __entry->units,
		      __entry->shift
		      )
);

TRACE_EVENT(hfi1_sdma_request,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u16 subctxt,
		     unsigned long dim),
	    TP_ARGS(dd, ctxt, subctxt, dim),
	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
			     __field(u16, ctxt)
			     __field(u16, subctxt)
			     __field(unsigned long, dim)
			     ),
	    TP_fast_assign(DD_DEV_ASSIGN(dd);
			   __entry->ctxt = ctxt;
			   __entry->subctxt = subctxt;
			   __entry->dim = dim;
			   ),
	    TP_printk("[%s] SDMA from %u:%u (%lu)",
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->dim
		      )
);

DECLARE_EVENT_CLASS(hfi1_sdma_engine_class,
		    TP_PROTO(struct sdma_engine *sde, u64 status),
		    TP_ARGS(sde, status),
		    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		    __field(u64, status)
		    __field(u8, idx)
		    ),
		    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		    __entry->status = status;
		    __entry->idx = sde->this_idx;
		    ),
		    TP_printk("[%s] SDE(%u) status %llx",
			      __get_str(dev),
			      __entry->idx,
			      (unsigned long long)__entry->status
			      )
);

DEFINE_EVENT(hfi1_sdma_engine_class, hfi1_sdma_engine_interrupt,
	     TP_PROTO(struct sdma_engine *sde, u64 status),
	     TP_ARGS(sde, status)
);

DEFINE_EVENT(hfi1_sdma_engine_class, hfi1_sdma_engine_progress,
	     TP_PROTO(struct sdma_engine *sde, u64 status),
	     TP_ARGS(sde, status)
);

DECLARE_EVENT_CLASS(hfi1_sdma_ahg_ad,
		    TP_PROTO(struct sdma_engine *sde, int aidx),
		    TP_ARGS(sde, aidx),
		    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		    __field(int, aidx)
		    __field(u8, idx)
		    ),
		    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		    __entry->idx = sde->this_idx;
		    __entry->aidx = aidx;
		    ),
		    TP_printk("[%s] SDE(%u) aidx %d",
			      __get_str(dev),
			      __entry->idx,
			      __entry->aidx
			      )
);

DEFINE_EVENT(hfi1_sdma_ahg_ad, hfi1_ahg_allocate,
	     TP_PROTO(struct sdma_engine *sde, int aidx),
	     TP_ARGS(sde, aidx));

DEFINE_EVENT(hfi1_sdma_ahg_ad, hfi1_ahg_deallocate,
	     TP_PROTO(struct sdma_engine *sde, int aidx),
	     TP_ARGS(sde, aidx));

#ifdef CONFIG_HFI1_DEBUG_SDMA_ORDER
TRACE_EVENT(hfi1_sdma_progress,
	    TP_PROTO(struct sdma_engine *sde,
		     u16 hwhead,
		     u16 swhead,
		     struct sdma_txreq *txp
		     ),
	    TP_ARGS(sde, hwhead, swhead, txp),
	    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
	    __field(u64, sn)
	    __field(u16, hwhead)
	    __field(u16, swhead)
	    __field(u16, txnext)
	    __field(u16, tx_tail)
	    __field(u16, tx_head)
	    __field(u8, idx)
	    ),
	    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
	    __entry->hwhead = hwhead;
	    __entry->swhead = swhead;
	    __entry->tx_tail = sde->tx_tail;
	    __entry->tx_head = sde->tx_head;
	    __entry->txnext = txp ? txp->next_descq_idx : ~0;
	    __entry->idx = sde->this_idx;
	    __entry->sn = txp ? txp->sn : ~0;
	    ),
	    TP_printk(
	    "[%s] SDE(%u) sn %llu hwhead %u swhead %u next_descq_idx %u tx_head %u tx_tail %u",
	    __get_str(dev),
	    __entry->idx,
	    __entry->sn,
	    __entry->hwhead,
	    __entry->swhead,
	    __entry->txnext,
	    __entry->tx_head,
	    __entry->tx_tail
	    )
);
#else
TRACE_EVENT(hfi1_sdma_progress,
	    TP_PROTO(struct sdma_engine *sde,
		     u16 hwhead, u16 swhead,
		     struct sdma_txreq *txp
		     ),
	    TP_ARGS(sde, hwhead, swhead, txp),
	    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		    __field(u16, hwhead)
		    __field(u16, swhead)
		    __field(u16, txnext)
		    __field(u16, tx_tail)
		    __field(u16, tx_head)
		    __field(u8, idx)
		    ),
	    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		    __entry->hwhead = hwhead;
		    __entry->swhead = swhead;
		    __entry->tx_tail = sde->tx_tail;
		    __entry->tx_head = sde->tx_head;
		    __entry->txnext = txp ? txp->next_descq_idx : ~0;
		    __entry->idx = sde->this_idx;
		    ),
	    TP_printk(
		    "[%s] SDE(%u) hwhead %u swhead %u next_descq_idx %u tx_head %u tx_tail %u",
		    __get_str(dev),
		    __entry->idx,
		    __entry->hwhead,
		    __entry->swhead,
		    __entry->txnext,
		    __entry->tx_head,
		    __entry->tx_tail
	    )
);
#endif

DECLARE_EVENT_CLASS(hfi1_sdma_sn,
		    TP_PROTO(struct sdma_engine *sde, u64 sn),
		    TP_ARGS(sde, sn),
		    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		    __field(u64, sn)
		    __field(u8, idx)
		    ),
		    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		    __entry->sn = sn;
		    __entry->idx = sde->this_idx;
		    ),
		    TP_printk("[%s] SDE(%u) sn %llu",
			      __get_str(dev),
			      __entry->idx,
			      __entry->sn
			      )
);

DEFINE_EVENT(hfi1_sdma_sn, hfi1_sdma_out_sn,
	     TP_PROTO(
	     struct sdma_engine *sde,
	     u64 sn
	     ),
	     TP_ARGS(sde, sn)
);

DEFINE_EVENT(hfi1_sdma_sn, hfi1_sdma_in_sn,
	     TP_PROTO(struct sdma_engine *sde, u64 sn),
	     TP_ARGS(sde, sn)
);

#define USDMA_HDR_FORMAT \
	"[%s:%u:%u:%u] PBC=(0x%x 0x%x) LRH=(0x%x 0x%x) BTH=(0x%x 0x%x 0x%x) KDETH=(0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x) TIDVal=0x%x"

TRACE_EVENT(hfi1_sdma_user_header,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 req,
		     struct hfi1_pkt_header *hdr, u32 tidval),
	    TP_ARGS(dd, ctxt, subctxt, req, hdr, tidval),
	    TP_STRUCT__entry(
		    DD_DEV_ENTRY(dd)
		    __field(u16, ctxt)
		    __field(u8, subctxt)
		    __field(u16, req)
		    __field(u32, pbc0)
		    __field(u32, pbc1)
		    __field(u32, lrh0)
		    __field(u32, lrh1)
		    __field(u32, bth0)
		    __field(u32, bth1)
		    __field(u32, bth2)
		    __field(u32, kdeth0)
		    __field(u32, kdeth1)
		    __field(u32, kdeth2)
		    __field(u32, kdeth3)
		    __field(u32, kdeth4)
		    __field(u32, kdeth5)
		    __field(u32, kdeth6)
		    __field(u32, kdeth7)
		    __field(u32, kdeth8)
		    __field(u32, tidval)
		    ),
		    TP_fast_assign(
		    __le32 *pbc = (__le32 *)hdr->pbc;
		    __be32 *lrh = (__be32 *)hdr->lrh;
		    __be32 *bth = (__be32 *)hdr->bth;
		    __le32 *kdeth = (__le32 *)&hdr->kdeth;

		    DD_DEV_ASSIGN(dd);
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->req = req;
		    __entry->pbc0 = le32_to_cpu(pbc[0]);
		    __entry->pbc1 = le32_to_cpu(pbc[1]);
		    __entry->lrh0 = be32_to_cpu(lrh[0]);
		    __entry->lrh1 = be32_to_cpu(lrh[1]);
		    __entry->bth0 = be32_to_cpu(bth[0]);
		    __entry->bth1 = be32_to_cpu(bth[1]);
		    __entry->bth2 = be32_to_cpu(bth[2]);
		    __entry->kdeth0 = le32_to_cpu(kdeth[0]);
		    __entry->kdeth1 = le32_to_cpu(kdeth[1]);
		    __entry->kdeth2 = le32_to_cpu(kdeth[2]);
		    __entry->kdeth3 = le32_to_cpu(kdeth[3]);
		    __entry->kdeth4 = le32_to_cpu(kdeth[4]);
		    __entry->kdeth5 = le32_to_cpu(kdeth[5]);
		    __entry->kdeth6 = le32_to_cpu(kdeth[6]);
		    __entry->kdeth7 = le32_to_cpu(kdeth[7]);
		    __entry->kdeth8 = le32_to_cpu(kdeth[8]);
		    __entry->tidval = tidval;
	    ),
	    TP_printk(USDMA_HDR_FORMAT,
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->req,
		      __entry->pbc1,
		      __entry->pbc0,
		      __entry->lrh0,
		      __entry->lrh1,
		      __entry->bth0,
		      __entry->bth1,
		      __entry->bth2,
		      __entry->kdeth0,
		      __entry->kdeth1,
		      __entry->kdeth2,
		      __entry->kdeth3,
		      __entry->kdeth4,
		      __entry->kdeth5,
		      __entry->kdeth6,
		      __entry->kdeth7,
		      __entry->kdeth8,
		      __entry->tidval
	    )
);

#define SDMA_UREQ_FMT \
	"[%s:%u:%u] ver/op=0x%x, iovcnt=%u, npkts=%u, frag=%u, idx=%u"
TRACE_EVENT(hfi1_sdma_user_reqinfo,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 *i),
	    TP_ARGS(dd, ctxt, subctxt, i),
	    TP_STRUCT__entry(
		    DD_DEV_ENTRY(dd);
		    __field(u16, ctxt)
		    __field(u8, subctxt)
		    __field(u8, ver_opcode)
		    __field(u8, iovcnt)
		    __field(u16, npkts)
		    __field(u16, fragsize)
		    __field(u16, comp_idx)
	    ),
	    TP_fast_assign(
		    DD_DEV_ASSIGN(dd);
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->ver_opcode = i[0] & 0xff;
		    __entry->iovcnt = (i[0] >> 8) & 0xff;
		    __entry->npkts = i[1];
		    __entry->fragsize = i[2];
		    __entry->comp_idx = i[3];
	    ),
	    TP_printk(SDMA_UREQ_FMT,
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->ver_opcode,
		      __entry->iovcnt,
		      __entry->npkts,
		      __entry->fragsize,
		      __entry->comp_idx
		      )
);

#define usdma_complete_name(st) { st, #st }
#define show_usdma_complete_state(st)			\
	__print_symbolic(st,				\
			usdma_complete_name(FREE),	\
			usdma_complete_name(QUEUED),	\
			usdma_complete_name(COMPLETE), \
			usdma_complete_name(ERROR))

TRACE_EVENT(hfi1_sdma_user_completion,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 idx,
		     u8 state, int code),
	    TP_ARGS(dd, ctxt, subctxt, idx, state, code),
	    TP_STRUCT__entry(
	    DD_DEV_ENTRY(dd)
	    __field(u16, ctxt)
	    __field(u8, subctxt)
	    __field(u16, idx)
	    __field(u8, state)
	    __field(int, code)
	    ),
	    TP_fast_assign(
	    DD_DEV_ASSIGN(dd);
	    __entry->ctxt = ctxt;
	    __entry->subctxt = subctxt;
	    __entry->idx = idx;
	    __entry->state = state;
	    __entry->code = code;
	    ),
	    TP_printk("[%s:%u:%u:%u] SDMA completion state %s (%d)",
		      __get_str(dev), __entry->ctxt, __entry->subctxt,
		      __entry->idx, show_usdma_complete_state(__entry->state),
		      __entry->code)
);

const char *print_u32_array(struct trace_seq *, u32 *, int);
#define __print_u32_hex(arr, len) print_u32_array(p, arr, len)

TRACE_EVENT(hfi1_sdma_user_header_ahg,
	    TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 req,
		     u8 sde, u8 ahgidx, u32 *ahg, int len, u32 tidval),
	    TP_ARGS(dd, ctxt, subctxt, req, sde, ahgidx, ahg, len, tidval),
	    TP_STRUCT__entry(
	    DD_DEV_ENTRY(dd)
	    __field(u16, ctxt)
	    __field(u8, subctxt)
	    __field(u16, req)
	    __field(u8, sde)
	    __field(u8, idx)
	    __field(int, len)
	    __field(u32, tidval)
	    __array(u32, ahg, 10)
	    ),
	    TP_fast_assign(
	    DD_DEV_ASSIGN(dd);
	    __entry->ctxt = ctxt;
	    __entry->subctxt = subctxt;
	    __entry->req = req;
	    __entry->sde = sde;
	    __entry->idx = ahgidx;
	    __entry->len = len;
	    __entry->tidval = tidval;
	    memcpy(__entry->ahg, ahg, len * sizeof(u32));
	    ),
	    TP_printk("[%s:%u:%u:%u] (SDE%u/AHG%u) ahg[0-%d]=(%s) TIDVal=0x%x",
		      __get_str(dev),
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->req,
		      __entry->sde,
		      __entry->idx,
		      __entry->len - 1,
		      __print_u32_hex(__entry->ahg, __entry->len),
		      __entry->tidval
		      )
);

TRACE_EVENT(hfi1_sdma_state,
	    TP_PROTO(struct sdma_engine *sde,
		     const char *cstate,
		     const char *nstate
		     ),
	    TP_ARGS(sde, cstate, nstate),
	    TP_STRUCT__entry(DD_DEV_ENTRY(sde->dd)
		__string(curstate, cstate)
		__string(newstate, nstate)
	    ),
	    TP_fast_assign(DD_DEV_ASSIGN(sde->dd);
		__assign_str(curstate, cstate);
		__assign_str(newstate, nstate);
	    ),
	    TP_printk("[%s] current state %s new state %s",
		      __get_str(dev),
		      __get_str(curstate),
		      __get_str(newstate)
	    )
);

#define BCT_FORMAT \
	"shared_limit %x vls 0-7 [%x,%x][%x,%x][%x,%x][%x,%x][%x,%x][%x,%x][%x,%x][%x,%x] 15 [%x,%x]"

#define BCT(field) \
	be16_to_cpu( \
	((struct buffer_control *)__get_dynamic_array(bct))->field \
	)

DECLARE_EVENT_CLASS(hfi1_bct_template,
		    TP_PROTO(struct hfi1_devdata *dd,
			     struct buffer_control *bc),
		    TP_ARGS(dd, bc),
		    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
		    __dynamic_array(u8, bct, sizeof(*bc))
		    ),
		    TP_fast_assign(DD_DEV_ASSIGN(dd);
				   memcpy(__get_dynamic_array(bct), bc,
					  sizeof(*bc));
		    ),
		    TP_printk(BCT_FORMAT,
			      BCT(overall_shared_limit),

			      BCT(vl[0].dedicated),
			      BCT(vl[0].shared),

			      BCT(vl[1].dedicated),
			      BCT(vl[1].shared),

			      BCT(vl[2].dedicated),
			      BCT(vl[2].shared),

			      BCT(vl[3].dedicated),
			      BCT(vl[3].shared),

			      BCT(vl[4].dedicated),
			      BCT(vl[4].shared),

			      BCT(vl[5].dedicated),
			      BCT(vl[5].shared),

			      BCT(vl[6].dedicated),
			      BCT(vl[6].shared),

			      BCT(vl[7].dedicated),
			      BCT(vl[7].shared),

			      BCT(vl[15].dedicated),
			      BCT(vl[15].shared)
		    )
);

DEFINE_EVENT(hfi1_bct_template, bct_set,
	     TP_PROTO(struct hfi1_devdata *dd, struct buffer_control *bc),
	     TP_ARGS(dd, bc));

DEFINE_EVENT(hfi1_bct_template, bct_get,
	     TP_PROTO(struct hfi1_devdata *dd, struct buffer_control *bc),
	     TP_ARGS(dd, bc));

TRACE_EVENT(
	hfi1_qp_send_completion,
	TP_PROTO(struct rvt_qp *qp, struct rvt_swqe *wqe, u32 idx),
	TP_ARGS(qp, wqe, idx),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
		__field(struct rvt_swqe *, wqe)
		__field(u64, wr_id)
		__field(u32, qpn)
		__field(u32, qpt)
		__field(u32, length)
		__field(u32, idx)
		__field(u32, ssn)
		__field(enum ib_wr_opcode, opcode)
		__field(int, send_flags)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
		__entry->wqe = wqe;
		__entry->wr_id = wqe->wr.wr_id;
		__entry->qpn = qp->ibqp.qp_num;
		__entry->qpt = qp->ibqp.qp_type;
		__entry->length = wqe->length;
		__entry->idx = idx;
		__entry->ssn = wqe->ssn;
		__entry->opcode = wqe->wr.opcode;
		__entry->send_flags = wqe->wr.send_flags;
	),
	TP_printk(
		"[%s] qpn 0x%x qpt %u wqe %p idx %u wr_id %llx length %u ssn %u opcode %x send_flags %x",
		__get_str(dev),
		__entry->qpn,
		__entry->qpt,
		__entry->wqe,
		__entry->idx,
		__entry->wr_id,
		__entry->length,
		__entry->ssn,
		__entry->opcode,
		__entry->send_flags
	)
);

DECLARE_EVENT_CLASS(
	hfi1_do_send_template,
	TP_PROTO(struct rvt_qp *qp, bool flag),
	TP_ARGS(qp, flag),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
		__field(u32, qpn)
		__field(bool, flag)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
		__entry->qpn = qp->ibqp.qp_num;
		__entry->flag = flag;
	),
	TP_printk(
		"[%s] qpn %x flag %d",
		__get_str(dev),
		__entry->qpn,
		__entry->flag
	)
);

DEFINE_EVENT(
	hfi1_do_send_template, hfi1_rc_do_send,
	TP_PROTO(struct rvt_qp *qp, bool flag),
	TP_ARGS(qp, flag)
);

DEFINE_EVENT(
	hfi1_do_send_template, hfi1_rc_expired_time_slice,
	TP_PROTO(struct rvt_qp *qp, bool flag),
	TP_ARGS(qp, flag)
);

#endif /* __HFI1_TRACE_TX_H */

#undef TRACE_INCLUDE_PATH
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE trace_tx
#include <trace/define_trace.h>
