/*
 *
 * 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
 *
 * Copyright(c) 2015 Intel Corporation.
 *
 * 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
 *
 * Copyright(c) 2015 Intel Corporation.
 *
 * 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.
 *
 */
#undef TRACE_SYSTEM_VAR
#define TRACE_SYSTEM_VAR hfi1

#if !defined(__HFI1_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define __HFI1_TRACE_H

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

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

#define DD_DEV_ENTRY(dd)       __string(dev, dev_name(&(dd)->pcidev->dev))
#define DD_DEV_ASSIGN(dd)      __assign_str(dev, dev_name(&(dd)->pcidev->dev))

#define packettype_name(etype) { RHF_RCV_TYPE_##etype, #etype }
#define show_packettype(etype)                  \
__print_symbolic(etype,                         \
	packettype_name(EXPECTED),              \
	packettype_name(EAGER),                 \
	packettype_name(IB),                    \
	packettype_name(ERROR),                 \
	packettype_name(BYPASS))

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_rx

TRACE_EVENT(hfi1_rcvhdr,
	TP_PROTO(struct hfi1_devdata *dd,
		 u64 eflags,
		 u32 ctxt,
		 u32 etype,
		 u32 hlen,
		 u32 tlen,
		 u32 updegr,
		 u32 etail),
	TP_ARGS(dd, ctxt, eflags, etype, hlen, tlen, updegr, etail),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd)
		__field(u64, eflags)
		__field(u32, ctxt)
		__field(u32, etype)
		__field(u32, hlen)
		__field(u32, tlen)
		__field(u32, updegr)
		__field(u32, etail)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd);
		__entry->eflags = eflags;
		__entry->ctxt = ctxt;
		__entry->etype = etype;
		__entry->hlen = hlen;
		__entry->tlen = tlen;
		__entry->updegr = updegr;
		__entry->etail = etail;
	),
	TP_printk(
"[%s] ctxt %d eflags 0x%llx etype %d,%s hlen %d tlen %d updegr %d etail %d",
		__get_str(dev),
		__entry->ctxt,
		__entry->eflags,
		__entry->etype, show_packettype(__entry->etype),
		__entry->hlen,
		__entry->tlen,
		__entry->updegr,
		__entry->etail
	)
);

TRACE_EVENT(hfi1_receive_interrupt,
	TP_PROTO(struct hfi1_devdata *dd, u32 ctxt),
	TP_ARGS(dd, ctxt),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd)
		__field(u32, ctxt)
		__field(u8, slow_path)
		__field(u8, dma_rtail)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd);
		__entry->ctxt = ctxt;
		if (dd->rcd[ctxt]->do_interrupt ==
		    &handle_receive_interrupt) {
			__entry->slow_path = 1;
			__entry->dma_rtail = 0xFF;
		} else if (dd->rcd[ctxt]->do_interrupt ==
			&handle_receive_interrupt_dma_rtail){
			__entry->dma_rtail = 1;
			__entry->slow_path = 0;
		} else if (dd->rcd[ctxt]->do_interrupt ==
			 &handle_receive_interrupt_nodma_rtail) {
			__entry->dma_rtail = 0;
			__entry->slow_path = 0;
		}
	),
	TP_printk(
		"[%s] ctxt %d SlowPath: %d DmaRtail: %d",
		__get_str(dev),
		__entry->ctxt,
		__entry->slow_path,
		__entry->dma_rtail
	)
);

const char *print_u64_array(struct trace_seq *, u64 *, int);

TRACE_EVENT(hfi1_exp_tid_map,
	    TP_PROTO(unsigned ctxt, u16 subctxt, int dir,
		     unsigned long *maps, u16 count),
	    TP_ARGS(ctxt, subctxt, dir, maps, count),
	    TP_STRUCT__entry(
		    __field(unsigned, ctxt)
		    __field(u16, subctxt)
		    __field(int, dir)
		    __field(u16, count)
		    __dynamic_array(unsigned long, maps, sizeof(*maps) * count)
		    ),
	    TP_fast_assign(
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->dir = dir;
		    __entry->count = count;
		    memcpy(__get_dynamic_array(maps), maps,
			   sizeof(*maps) * count);
		    ),
	    TP_printk("[%3u:%02u] %s tidmaps %s",
		      __entry->ctxt,
		      __entry->subctxt,
		      (__entry->dir ? ">" : "<"),
		      print_u64_array(p, __get_dynamic_array(maps),
				      __entry->count)
		    )
	);

TRACE_EVENT(hfi1_exp_rcv_set,
	    TP_PROTO(unsigned ctxt, u16 subctxt, u32 tid,
		     unsigned long vaddr, u64 phys_addr, void *page),
	    TP_ARGS(ctxt, subctxt, tid, vaddr, phys_addr, page),
	    TP_STRUCT__entry(
		    __field(unsigned, ctxt)
		    __field(u16, subctxt)
		    __field(u32, tid)
		    __field(unsigned long, vaddr)
		    __field(u64, phys_addr)
		    __field(void *, page)
		    ),
	    TP_fast_assign(
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->tid = tid;
		    __entry->vaddr = vaddr;
		    __entry->phys_addr = phys_addr;
		    __entry->page = page;
		    ),
	    TP_printk("[%u:%u] TID %u, vaddrs 0x%lx, physaddr 0x%llx, pgp %p",
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->tid,
		      __entry->vaddr,
		      __entry->phys_addr,
		      __entry->page
		    )
	);

TRACE_EVENT(hfi1_exp_rcv_free,
	    TP_PROTO(unsigned ctxt, u16 subctxt, u32 tid,
		     unsigned long phys, void *page),
	    TP_ARGS(ctxt, subctxt, tid, phys, page),
	    TP_STRUCT__entry(
		    __field(unsigned, ctxt)
		    __field(u16, subctxt)
		    __field(u32, tid)
		    __field(unsigned long, phys)
		    __field(void *, page)
		    ),
	    TP_fast_assign(
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->tid = tid;
		    __entry->phys = phys;
		    __entry->page = page;
		    ),
	    TP_printk("[%u:%u] freeing TID %u, 0x%lx, pgp %p",
		      __entry->ctxt,
		      __entry->subctxt,
		      __entry->tid,
		      __entry->phys,
		      __entry->page
		    )
	);
#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 hfi1_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 hfi1_qp *qp, u32 flags),
	     TP_ARGS(qp, flags));

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

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_qphash
DECLARE_EVENT_CLASS(hfi1_qphash_template,
	TP_PROTO(struct hfi1_qp *qp, u32 bucket),
	TP_ARGS(qp, bucket),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
		__field(u32, qpn)
		__field(u32, bucket)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
		__entry->qpn = qp->ibqp.qp_num;
		__entry->bucket = bucket;
	),
	TP_printk(
		"[%s] qpn 0x%x bucket %u",
		__get_str(dev),
		__entry->qpn,
		__entry->bucket
	)
);

DEFINE_EVENT(hfi1_qphash_template, hfi1_qpinsert,
	TP_PROTO(struct hfi1_qp *qp, u32 bucket),
	TP_ARGS(qp, bucket));

DEFINE_EVENT(hfi1_qphash_template, hfi1_qpremove,
	TP_PROTO(struct hfi1_qp *qp, u32 bucket),
	TP_ARGS(qp, bucket));

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_ibhdrs

u8 ibhdr_exhdr_len(struct hfi1_ib_header *hdr);
const char *parse_everbs_hdrs(
	struct trace_seq *p,
	u8 opcode,
	void *ehdrs);

#define __parse_ib_ehdrs(op, ehdrs) parse_everbs_hdrs(p, op, ehdrs)

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)


#define lrh_name(lrh) { HFI1_##lrh, #lrh }
#define show_lnh(lrh)                    \
__print_symbolic(lrh,                    \
	lrh_name(LRH_BTH),               \
	lrh_name(LRH_GRH))

#define ib_opcode_name(opcode) { IB_OPCODE_##opcode, #opcode  }
#define show_ib_opcode(opcode)                             \
__print_symbolic(opcode,                                   \
	ib_opcode_name(RC_SEND_FIRST),                     \
	ib_opcode_name(RC_SEND_MIDDLE),                    \
	ib_opcode_name(RC_SEND_LAST),                      \
	ib_opcode_name(RC_SEND_LAST_WITH_IMMEDIATE),       \
	ib_opcode_name(RC_SEND_ONLY),                      \
	ib_opcode_name(RC_SEND_ONLY_WITH_IMMEDIATE),       \
	ib_opcode_name(RC_RDMA_WRITE_FIRST),               \
	ib_opcode_name(RC_RDMA_WRITE_MIDDLE),              \
	ib_opcode_name(RC_RDMA_WRITE_LAST),                \
	ib_opcode_name(RC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
	ib_opcode_name(RC_RDMA_WRITE_ONLY),                \
	ib_opcode_name(RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
	ib_opcode_name(RC_RDMA_READ_REQUEST),              \
	ib_opcode_name(RC_RDMA_READ_RESPONSE_FIRST),       \
	ib_opcode_name(RC_RDMA_READ_RESPONSE_MIDDLE),      \
	ib_opcode_name(RC_RDMA_READ_RESPONSE_LAST),        \
	ib_opcode_name(RC_RDMA_READ_RESPONSE_ONLY),        \
	ib_opcode_name(RC_ACKNOWLEDGE),                    \
	ib_opcode_name(RC_ATOMIC_ACKNOWLEDGE),             \
	ib_opcode_name(RC_COMPARE_SWAP),                   \
	ib_opcode_name(RC_FETCH_ADD),                      \
	ib_opcode_name(UC_SEND_FIRST),                     \
	ib_opcode_name(UC_SEND_MIDDLE),                    \
	ib_opcode_name(UC_SEND_LAST),                      \
	ib_opcode_name(UC_SEND_LAST_WITH_IMMEDIATE),       \
	ib_opcode_name(UC_SEND_ONLY),                      \
	ib_opcode_name(UC_SEND_ONLY_WITH_IMMEDIATE),       \
	ib_opcode_name(UC_RDMA_WRITE_FIRST),               \
	ib_opcode_name(UC_RDMA_WRITE_MIDDLE),              \
	ib_opcode_name(UC_RDMA_WRITE_LAST),                \
	ib_opcode_name(UC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \
	ib_opcode_name(UC_RDMA_WRITE_ONLY),                \
	ib_opcode_name(UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \
	ib_opcode_name(UD_SEND_ONLY),                      \
	ib_opcode_name(UD_SEND_ONLY_WITH_IMMEDIATE))


#define LRH_PRN "vl %d lver %d sl %d lnh %d,%s dlid %.4x len %d slid %.4x"
#define BTH_PRN \
	"op 0x%.2x,%s se %d m %d pad %d tver %d pkey 0x%.4x " \
	"f %d b %d qpn 0x%.6x a %d psn 0x%.8x"
#define EHDR_PRN "%s"

DECLARE_EVENT_CLASS(hfi1_ibhdr_template,
	TP_PROTO(struct hfi1_devdata *dd,
		 struct hfi1_ib_header *hdr),
	TP_ARGS(dd, hdr),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd)
		/* LRH */
		__field(u8, vl)
		__field(u8, lver)
		__field(u8, sl)
		__field(u8, lnh)
		__field(u16, dlid)
		__field(u16, len)
		__field(u16, slid)
		/* BTH */
		__field(u8, opcode)
		__field(u8, se)
		__field(u8, m)
		__field(u8, pad)
		__field(u8, tver)
		__field(u16, pkey)
		__field(u8, f)
		__field(u8, b)
		__field(u32, qpn)
		__field(u8, a)
		__field(u32, psn)
		/* extended headers */
		__dynamic_array(u8, ehdrs, ibhdr_exhdr_len(hdr))
	),
	TP_fast_assign(
		struct hfi1_other_headers *ohdr;

		DD_DEV_ASSIGN(dd);
		/* LRH */
		__entry->vl =
			(u8)(be16_to_cpu(hdr->lrh[0]) >> 12);
		__entry->lver =
			(u8)(be16_to_cpu(hdr->lrh[0]) >> 8) & 0xf;
		__entry->sl =
			(u8)(be16_to_cpu(hdr->lrh[0]) >> 4) & 0xf;
		__entry->lnh =
			(u8)(be16_to_cpu(hdr->lrh[0]) & 3);
		__entry->dlid =
			be16_to_cpu(hdr->lrh[1]);
		/* allow for larger len */
		__entry->len =
			be16_to_cpu(hdr->lrh[2]);
		__entry->slid =
			be16_to_cpu(hdr->lrh[3]);
		/* BTH */
		if (__entry->lnh == HFI1_LRH_BTH)
			ohdr = &hdr->u.oth;
		else
			ohdr = &hdr->u.l.oth;
		__entry->opcode =
			(be32_to_cpu(ohdr->bth[0]) >> 24) & 0xff;
		__entry->se =
			(be32_to_cpu(ohdr->bth[0]) >> 23) & 1;
		__entry->m =
			 (be32_to_cpu(ohdr->bth[0]) >> 22) & 1;
		__entry->pad =
			(be32_to_cpu(ohdr->bth[0]) >> 20) & 3;
		__entry->tver =
			(be32_to_cpu(ohdr->bth[0]) >> 16) & 0xf;
		__entry->pkey =
			be32_to_cpu(ohdr->bth[0]) & 0xffff;
		__entry->f =
			(be32_to_cpu(ohdr->bth[1]) >> HFI1_FECN_SHIFT)
			& HFI1_FECN_MASK;
		__entry->b =
			(be32_to_cpu(ohdr->bth[1]) >> HFI1_BECN_SHIFT)
			& HFI1_BECN_MASK;
		__entry->qpn =
			be32_to_cpu(ohdr->bth[1]) & HFI1_QPN_MASK;
		__entry->a =
			(be32_to_cpu(ohdr->bth[2]) >> 31) & 1;
		/* allow for larger PSN */
		__entry->psn =
			be32_to_cpu(ohdr->bth[2]) & 0x7fffffff;
		/* extended headers */
		 memcpy(
			__get_dynamic_array(ehdrs),
			&ohdr->u,
			ibhdr_exhdr_len(hdr));
	),
	TP_printk("[%s] " LRH_PRN " " BTH_PRN " " EHDR_PRN,
		__get_str(dev),
		/* LRH */
		__entry->vl,
		__entry->lver,
		__entry->sl,
		__entry->lnh, show_lnh(__entry->lnh),
		__entry->dlid,
		__entry->len,
		__entry->slid,
		/* BTH */
		__entry->opcode, show_ib_opcode(__entry->opcode),
		__entry->se,
		__entry->m,
		__entry->pad,
		__entry->tver,
		__entry->pkey,
		__entry->f,
		__entry->b,
		__entry->qpn,
		__entry->a,
		__entry->psn,
		/* extended headers */
		__parse_ib_ehdrs(
			__entry->opcode,
			(void *)__get_dynamic_array(ehdrs))
	)
);

DEFINE_EVENT(hfi1_ibhdr_template, input_ibhdr,
	     TP_PROTO(struct hfi1_devdata *dd, struct hfi1_ib_header *hdr),
	     TP_ARGS(dd, hdr));

DEFINE_EVENT(hfi1_ibhdr_template, output_ibhdr,
	     TP_PROTO(struct hfi1_devdata *dd, struct hfi1_ib_header *hdr),
	     TP_ARGS(dd, hdr));

#define SNOOP_PRN \
	"slid %.4x dlid %.4x qpn 0x%.6x opcode 0x%.2x,%s " \
	"svc lvl %d pkey 0x%.4x [header = %d bytes] [data = %d bytes]"

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_snoop


TRACE_EVENT(snoop_capture,
	TP_PROTO(struct hfi1_devdata *dd,
		 int hdr_len,
		 struct hfi1_ib_header *hdr,
		 int data_len,
		 void *data),
	TP_ARGS(dd, hdr_len, hdr, data_len, data),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd)
		__field(u16, slid)
		__field(u16, dlid)
		__field(u32, qpn)
		__field(u8, opcode)
		__field(u8, sl)
		__field(u16, pkey)
		__field(u32, hdr_len)
		__field(u32, data_len)
		__field(u8, lnh)
		__dynamic_array(u8, raw_hdr, hdr_len)
		__dynamic_array(u8, raw_pkt, data_len)
	),
	TP_fast_assign(
		struct hfi1_other_headers *ohdr;

		__entry->lnh = (u8)(be16_to_cpu(hdr->lrh[0]) & 3);
		if (__entry->lnh == HFI1_LRH_BTH)
			ohdr = &hdr->u.oth;
		else
			ohdr = &hdr->u.l.oth;
		DD_DEV_ASSIGN(dd);
		__entry->slid = be16_to_cpu(hdr->lrh[3]);
		__entry->dlid = be16_to_cpu(hdr->lrh[1]);
		__entry->qpn = be32_to_cpu(ohdr->bth[1]) & HFI1_QPN_MASK;
		__entry->opcode = (be32_to_cpu(ohdr->bth[0]) >> 24) & 0xff;
		__entry->sl = (u8)(be16_to_cpu(hdr->lrh[0]) >> 4) & 0xf;
		__entry->pkey =	be32_to_cpu(ohdr->bth[0]) & 0xffff;
		__entry->hdr_len = hdr_len;
		__entry->data_len = data_len;
		memcpy(__get_dynamic_array(raw_hdr), hdr, hdr_len);
		memcpy(__get_dynamic_array(raw_pkt), data, data_len);
	),
	TP_printk("[%s] " SNOOP_PRN,
		__get_str(dev),
		__entry->slid,
		__entry->dlid,
		__entry->qpn,
		__entry->opcode,
		show_ib_opcode(__entry->opcode),
		__entry->sl,
		__entry->pkey,
		__entry->hdr_len,
		__entry->data_len
	)
);

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_ctxts

#define UCTXT_FMT \
	"cred:%u, credaddr:0x%llx, piobase:0x%llx, rcvhdr_cnt:%u, "	\
	"rcvbase:0x%llx, rcvegrc:%u, rcvegrb:0x%llx"
TRACE_EVENT(hfi1_uctxtdata,
	    TP_PROTO(struct hfi1_devdata *dd, struct hfi1_ctxtdata *uctxt),
	    TP_ARGS(dd, uctxt),
	    TP_STRUCT__entry(
		    DD_DEV_ENTRY(dd)
		    __field(unsigned, ctxt)
		    __field(u32, credits)
		    __field(u64, hw_free)
		    __field(u64, piobase)
		    __field(u16, rcvhdrq_cnt)
		    __field(u64, rcvhdrq_phys)
		    __field(u32, eager_cnt)
		    __field(u64, rcvegr_phys)
		    ),
	    TP_fast_assign(
		    DD_DEV_ASSIGN(dd);
		    __entry->ctxt = uctxt->ctxt;
		    __entry->credits = uctxt->sc->credits;
		    __entry->hw_free = (u64)uctxt->sc->hw_free;
		    __entry->piobase = (u64)uctxt->sc->base_addr;
		    __entry->rcvhdrq_cnt = uctxt->rcvhdrq_cnt;
		    __entry->rcvhdrq_phys = uctxt->rcvhdrq_phys;
		    __entry->eager_cnt = uctxt->egrbufs.alloced;
		    __entry->rcvegr_phys = uctxt->egrbufs.rcvtids[0].phys;
		    ),
	    TP_printk(
		    "[%s] ctxt %u " UCTXT_FMT,
		    __get_str(dev),
		    __entry->ctxt,
		    __entry->credits,
		    __entry->hw_free,
		    __entry->piobase,
		    __entry->rcvhdrq_cnt,
		    __entry->rcvhdrq_phys,
		    __entry->eager_cnt,
		    __entry->rcvegr_phys
		    )
	);

#define CINFO_FMT \
	"egrtids:%u, egr_size:%u, hdrq_cnt:%u, hdrq_size:%u, sdma_ring_size:%u"
TRACE_EVENT(hfi1_ctxt_info,
	    TP_PROTO(struct hfi1_devdata *dd, unsigned ctxt, unsigned subctxt,
		     struct hfi1_ctxt_info cinfo),
	    TP_ARGS(dd, ctxt, subctxt, cinfo),
	    TP_STRUCT__entry(
		    DD_DEV_ENTRY(dd)
		    __field(unsigned, ctxt)
		    __field(unsigned, subctxt)
		    __field(u16, egrtids)
		    __field(u16, rcvhdrq_cnt)
		    __field(u16, rcvhdrq_size)
		    __field(u16, sdma_ring_size)
		    __field(u32, rcvegr_size)
		    ),
	    TP_fast_assign(
		    DD_DEV_ASSIGN(dd);
		    __entry->ctxt = ctxt;
		    __entry->subctxt = subctxt;
		    __entry->egrtids = cinfo.egrtids;
		    __entry->rcvhdrq_cnt = cinfo.rcvhdrq_cnt;
		    __entry->rcvhdrq_size = cinfo.rcvhdrq_entsize;
		    __entry->sdma_ring_size = cinfo.sdma_ring_size;
		    __entry->rcvegr_size = cinfo.rcvegr_size;
		    ),
	    TP_printk(
		    "[%s] ctxt %u:%u " CINFO_FMT,
		    __get_str(dev),
		    __entry->ctxt,
		    __entry->subctxt,
		    __entry->egrtids,
		    __entry->rcvegr_size,
		    __entry->rcvhdrq_cnt,
		    __entry->rcvhdrq_size,
		    __entry->sdma_ring_size
		    )
	);

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_sma

#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));

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_sdma

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
	)
);

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(__le32, pbc0)
		    __field(__le32, pbc1)
		    __field(__be32, lrh0)
		    __field(__be32, lrh1)
		    __field(__be32, bth0)
		    __field(__be32, bth1)
		    __field(__be32, bth2)
		    __field(__le32, kdeth0)
		    __field(__le32, kdeth1)
		    __field(__le32, kdeth2)
		    __field(__le32, kdeth3)
		    __field(__le32, kdeth4)
		    __field(__le32, kdeth5)
		    __field(__le32, kdeth6)
		    __field(__le32, kdeth7)
		    __field(__le32, 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 = pbc[0];
		    __entry->pbc1 = 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 = kdeth[0];
		    __entry->kdeth1 = kdeth[1];
		    __entry->kdeth2 = kdeth[2];
		    __entry->kdeth3 = kdeth[3];
		    __entry->kdeth4 = kdeth[4];
		    __entry->kdeth5 = kdeth[5];
		    __entry->kdeth6 = kdeth[6];
		    __entry->kdeth7 = kdeth[7];
		    __entry->kdeth8 = 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)
	)
);

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_rc

DECLARE_EVENT_CLASS(hfi1_rc_template,
	TP_PROTO(struct hfi1_qp *qp, u32 psn),
	TP_ARGS(qp, psn),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd_from_ibdev(qp->ibqp.device))
		__field(u32, qpn)
		__field(u32, s_flags)
		__field(u32, psn)
		__field(u32, s_psn)
		__field(u32, s_next_psn)
		__field(u32, s_sending_psn)
		__field(u32, s_sending_hpsn)
		__field(u32, r_psn)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd_from_ibdev(qp->ibqp.device))
		__entry->qpn = qp->ibqp.qp_num;
		__entry->s_flags = qp->s_flags;
		__entry->psn = psn;
		__entry->s_psn = qp->s_psn;
		__entry->s_next_psn = qp->s_next_psn;
		__entry->s_sending_psn = qp->s_sending_psn;
		__entry->s_sending_hpsn = qp->s_sending_hpsn;
		__entry->r_psn = qp->r_psn;
	),
	TP_printk(
		"[%s] qpn 0x%x s_flags 0x%x psn 0x%x s_psn 0x%x s_next_psn 0x%x s_sending_psn 0x%x sending_hpsn 0x%x r_psn 0x%x",
		__get_str(dev),
		__entry->qpn,
		__entry->s_flags,
		__entry->psn,
		__entry->s_psn,
		__entry->s_next_psn,
		__entry->s_sending_psn,
		__entry->s_sending_hpsn,
		__entry->r_psn
	)
);

DEFINE_EVENT(hfi1_rc_template, hfi1_rc_sendcomplete,
	     TP_PROTO(struct hfi1_qp *qp, u32 psn),
	     TP_ARGS(qp, psn)
);

DEFINE_EVENT(hfi1_rc_template, hfi1_rc_ack,
	     TP_PROTO(struct hfi1_qp *qp, u32 psn),
	     TP_ARGS(qp, psn)
);

DEFINE_EVENT(hfi1_rc_template, hfi1_rc_timeout,
	     TP_PROTO(struct hfi1_qp *qp, u32 psn),
	     TP_ARGS(qp, psn)
);

DEFINE_EVENT(hfi1_rc_template, hfi1_rc_rcv_error,
	     TP_PROTO(struct hfi1_qp *qp, u32 psn),
	     TP_ARGS(qp, psn)
);

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_misc

TRACE_EVENT(hfi1_interrupt,
	TP_PROTO(struct hfi1_devdata *dd, const struct is_table *is_entry,
		 int src),
	TP_ARGS(dd, is_entry, src),
	TP_STRUCT__entry(
		DD_DEV_ENTRY(dd)
		__array(char, buf, 64)
		__field(int, src)
	),
	TP_fast_assign(
		DD_DEV_ASSIGN(dd)
		is_entry->is_name(__entry->buf, 64, src - is_entry->start);
		__entry->src = src;
	),
	TP_printk("[%s] source: %s [%d]", __get_str(dev), __entry->buf,
		  __entry->src)
);

/*
 * Note:
 * This produces a REALLY ugly trace in the console output when the string is
 * too long.
 */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM hfi1_trace

#define MAX_MSG_LEN 512

DECLARE_EVENT_CLASS(hfi1_trace_template,
	TP_PROTO(const char *function, struct va_format *vaf),
	TP_ARGS(function, vaf),
	TP_STRUCT__entry(
		__string(function, function)
		__dynamic_array(char, msg, MAX_MSG_LEN)
	),
	TP_fast_assign(
		__assign_str(function, function);
		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
		     MAX_MSG_LEN, vaf->fmt,
		     *vaf->va) >= MAX_MSG_LEN);
	),
	TP_printk("(%s) %s",
		  __get_str(function),
		  __get_str(msg))
);

/*
 * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an
 * actual function to work and can not be in a macro.
 */
#define __hfi1_trace_def(lvl) \
void __hfi1_trace_##lvl(const char *funct, char *fmt, ...);		\
									\
DEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl,				\
	TP_PROTO(const char *function, struct va_format *vaf),		\
	TP_ARGS(function, vaf))

#define __hfi1_trace_fn(lvl) \
void __hfi1_trace_##lvl(const char *func, char *fmt, ...)		\
{									\
	struct va_format vaf = {					\
		.fmt = fmt,						\
	};								\
	va_list args;							\
									\
	va_start(args, fmt);						\
	vaf.va = &args;							\
	trace_hfi1_ ##lvl(func, &vaf);					\
	va_end(args);							\
	return;								\
}

/*
 * To create a new trace level simply define it below and as a __hfi1_trace_fn
 * in trace.c. This will create all the hooks for calling
 * hfi1_cdbg(LVL, fmt, ...); as well as take care of all
 * the debugfs stuff.
 */
__hfi1_trace_def(PKT);
__hfi1_trace_def(PROC);
__hfi1_trace_def(SDMA);
__hfi1_trace_def(LINKVERB);
__hfi1_trace_def(DEBUG);
__hfi1_trace_def(SNOOP);
__hfi1_trace_def(CNTR);
__hfi1_trace_def(PIO);
__hfi1_trace_def(DC8051);
__hfi1_trace_def(FIRMWARE);
__hfi1_trace_def(RCVCTRL);
__hfi1_trace_def(TID);

#define hfi1_cdbg(which, fmt, ...) \
	__hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__)

#define hfi1_dbg(fmt, ...) \
	hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__)

/*
 * Define HFI1_EARLY_DBG at compile time or here to enable early trace
 * messages. Do not check in an enablement for this.
 */

#ifdef HFI1_EARLY_DBG
#define hfi1_dbg_early(fmt, ...) \
	trace_printk(fmt, ##__VA_ARGS__)
#else
#define hfi1_dbg_early(fmt, ...)
#endif

#endif /* __HFI1_TRACE_H */

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