/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright(c) 2022 Intel Corporation. All rights reserved.
 *
 * Author: Noah Klayman <noah.klayman@intel.com>
 */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM sof_intel

#if !defined(_TRACE_SOF_INTEL_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_SOF_INTEL_H
#include <linux/tracepoint.h>
#include <sound/hdaudio.h>
#include "../../../sound/soc/sof/sof-audio.h"

TRACE_EVENT(sof_intel_hda_irq,
	TP_PROTO(struct snd_sof_dev *sdev, char *source),
	TP_ARGS(sdev, source),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__string(source, source)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__assign_str(source, source);
	),
	TP_printk("device_name=%s source=%s",
		  __get_str(device_name), __get_str(source))
);

DECLARE_EVENT_CLASS(sof_intel_ipc_firmware_template,
	TP_ARGS(struct snd_sof_dev *sdev, u32 msg, u32 msg_ext),
	TP_PROTO(sdev, msg, msg_ext),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__field(u32, msg)
		__field(u32, msg_ext)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__entry->msg = msg;
		__entry->msg_ext = msg_ext;
	),
	TP_printk("device_name=%s msg=%#x msg_ext=%#x",
		  __get_str(device_name), __entry->msg, __entry->msg_ext)
);

DEFINE_EVENT(sof_intel_ipc_firmware_template, sof_intel_ipc_firmware_response,
	TP_PROTO(struct snd_sof_dev *sdev, u32 msg, u32 msg_ext),
	TP_ARGS(sdev, msg, msg_ext)
);

DEFINE_EVENT(sof_intel_ipc_firmware_template, sof_intel_ipc_firmware_initiated,
	TP_PROTO(struct snd_sof_dev *sdev, u32 msg, u32 msg_ext),
	TP_ARGS(sdev, msg, msg_ext)
);

TRACE_EVENT(sof_intel_D0I3C_updated,
	TP_PROTO(struct snd_sof_dev *sdev, u8 reg),
	TP_ARGS(sdev, reg),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__field(u8, reg)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__entry->reg = reg;
	),
	TP_printk("device_name=%s register=%#x",
		  __get_str(device_name), __entry->reg)
);

TRACE_EVENT(sof_intel_hda_irq_ipc_check,
	TP_PROTO(struct snd_sof_dev *sdev, u32 irq_status),
	TP_ARGS(sdev, irq_status),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__field(u32, irq_status)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__entry->irq_status = irq_status;
	),
	TP_printk("device_name=%s irq_status=%#x",
		  __get_str(device_name), __entry->irq_status)
);

TRACE_EVENT(sof_intel_hda_dsp_pcm,
	TP_PROTO(struct snd_sof_dev *sdev,
		struct hdac_stream *hstream,
		struct snd_pcm_substream *substream,
		snd_pcm_uframes_t pos
	),
	TP_ARGS(sdev, hstream, substream, pos),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__field(u32, hstream_index)
		__field(u32, substream)
		__field(unsigned long, pos)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__entry->hstream_index = hstream->index;
		__entry->substream = substream->stream;
		__entry->pos = pos;
	),
	TP_printk("device_name=%s hstream_index=%d substream=%d pos=%lu",
		  __get_str(device_name), __entry->hstream_index,
		  __entry->substream, __entry->pos)
);

TRACE_EVENT(sof_intel_hda_dsp_stream_status,
	TP_PROTO(struct device *dev, struct hdac_stream *s, u32 status),
	TP_ARGS(dev, s, status),
	TP_STRUCT__entry(
		__string(device_name, dev_name(dev))
		__field(u32, stream)
		__field(u32, status)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(dev));
		__entry->stream = s->index;
		__entry->status = status;
	),
	TP_printk("device_name=%s stream=%d status=%#x",
		  __get_str(device_name), __entry->stream, __entry->status)
);

TRACE_EVENT(sof_intel_hda_dsp_check_stream_irq,
	TP_PROTO(struct snd_sof_dev *sdev, u32 status),
	TP_ARGS(sdev, status),
	TP_STRUCT__entry(
		__string(device_name, dev_name(sdev->dev))
		__field(u32, status)
	),
	TP_fast_assign(
		__assign_str(device_name, dev_name(sdev->dev));
		__entry->status = status;
	),
	TP_printk("device_name=%s status=%#x",
		  __get_str(device_name), __entry->status)
);

#endif /* _TRACE_SOF_INTEL_H */

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