/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM intel_avs

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

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

TRACE_EVENT(avs_dsp_core_op,

	TP_PROTO(unsigned int reg, unsigned int mask, const char *op, bool flag),

	TP_ARGS(reg, mask, op, flag),

	TP_STRUCT__entry(
		__field(unsigned int,	reg	)
		__field(unsigned int,	mask	)
		__string(op,		op	)
		__field(bool,		flag	)
	),

	TP_fast_assign(
		__entry->reg = reg;
		__entry->mask = mask;
		__assign_str(op, op);
		__entry->flag = flag;
	),

	TP_printk("%s: %d, core mask: 0x%X, prev state: 0x%08X",
		  __get_str(op), __entry->flag, __entry->mask, __entry->reg)
);

#ifndef __TRACE_INTEL_AVS_TRACE_HELPER
#define __TRACE_INTEL_AVS_TRACE_HELPER

void trace_avs_msg_payload(const void *data, size_t size);

#define trace_avs_request(msg, fwregs) \
({ \
	trace_avs_ipc_request_msg((msg)->header, fwregs); \
	trace_avs_msg_payload((msg)->data, (msg)->size); \
})

#define trace_avs_reply(msg, fwregs) \
({ \
	trace_avs_ipc_reply_msg((msg)->header, fwregs); \
	trace_avs_msg_payload((msg)->data, (msg)->size); \
})

#define trace_avs_notify(msg, fwregs) \
({ \
	trace_avs_ipc_notify_msg((msg)->header, fwregs); \
	trace_avs_msg_payload((msg)->data, (msg)->size); \
})
#endif

DECLARE_EVENT_CLASS(avs_ipc_msg_hdr,

	TP_PROTO(u64 header, u64 fwregs),

	TP_ARGS(header, fwregs),

	TP_STRUCT__entry(
		__field(u64,	header)
		__field(u64,	fwregs)
	),

	TP_fast_assign(
		__entry->header = header;
		__entry->fwregs = fwregs;
	),

	TP_printk("primary: 0x%08X, extension: 0x%08X,\n"
		  "fwstatus: 0x%08X, fwerror: 0x%08X",
		  lower_32_bits(__entry->header), upper_32_bits(__entry->header),
		  lower_32_bits(__entry->fwregs), upper_32_bits(__entry->fwregs))
);

DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_request_msg,
	TP_PROTO(u64 header, u64 fwregs),
	TP_ARGS(header, fwregs)
);

DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_reply_msg,
	TP_PROTO(u64 header, u64 fwregs),
	TP_ARGS(header, fwregs)
);

DEFINE_EVENT(avs_ipc_msg_hdr, avs_ipc_notify_msg,
	TP_PROTO(u64 header, u64 fwregs),
	TP_ARGS(header, fwregs)
);

TRACE_EVENT_CONDITION(avs_ipc_msg_payload,

	TP_PROTO(const u8 *data, size_t size, size_t offset, size_t total),

	TP_ARGS(data, size, offset, total),

	TP_CONDITION(data && size),

	TP_STRUCT__entry(
		__dynamic_array(u8,	buf,	size	)
		__field(size_t,		offset		)
		__field(size_t,		pos		)
		__field(size_t,		total		)
	),

	TP_fast_assign(
		memcpy(__get_dynamic_array(buf), data + offset, size);
		__entry->offset = offset;
		__entry->pos = offset + size;
		__entry->total = total;
	),

	TP_printk("range %zu-%zu out of %zu bytes%s",
		  __entry->offset, __entry->pos, __entry->total,
		  __print_hex_dump("", DUMP_PREFIX_NONE, 16, 4,
				   __get_dynamic_array(buf),
				   __get_dynamic_array_len(buf), false))
);

TRACE_EVENT(avs_d0ix,

	TP_PROTO(const char *op, bool proceed, u64 header),

	TP_ARGS(op, proceed, header),

	TP_STRUCT__entry(
		__string(op,	op	)
		__field(bool,	proceed	)
		__field(u64,	header	)
	),

	TP_fast_assign(
		__assign_str(op, op);
		__entry->proceed = proceed;
		__entry->header = header;
	),

	TP_printk("%s%s for request: 0x%08X 0x%08X",
		  __entry->proceed ? "" : "ignore ", __get_str(op),
		  lower_32_bits(__entry->header), upper_32_bits(__entry->header))
);

#endif /* _TRACE_INTEL_AVS_H */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE trace
#include <trace/define_trace.h>
