#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,
                  __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 <sound/sof/ext_manifest4.h>
 #include <sound/sof/ipc4/header.h>
+#include <trace/events/sof_intel.h>
 #include "../ipc4-priv.h"
 #include "../ops.h"
 #include "hda.h"
                msg_ext = hipci & CNL_DSP_REG_HIPCIDR_MSG_MASK;
                msg = hipcida & CNL_DSP_REG_HIPCIDA_MSG_MASK;
 
-               dev_vdbg(sdev->dev,
-                        "ipc: firmware response, msg:0x%x, msg_ext:0x%x\n",
-                        msg, msg_ext);
+               trace_sof_intel_ipc_firmware_response(sdev, msg, msg_ext);
 
                /* mask Done interrupt */
                snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
                msg = hipctdr & CNL_DSP_REG_HIPCTDR_MSG_MASK;
                msg_ext = hipctdd & CNL_DSP_REG_HIPCTDD_MSG_MASK;
 
-               dev_vdbg(sdev->dev,
-                        "ipc: firmware initiated, msg:0x%x, msg_ext:0x%x\n",
-                        msg, msg_ext);
+               trace_sof_intel_ipc_firmware_initiated(sdev, msg, msg_ext);
 
                /* handle messages from DSP */
                if ((hipctdr & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
 
  */
 
 #include <sound/sof/ipc4/header.h>
+#include <trace/events/sof_intel.h>
 #include "../ops.h"
 #include "hda.h"
 
                msg = hipci & HDA_DSP_REG_HIPCI_MSG_MASK;
                msg_ext = hipcie & HDA_DSP_REG_HIPCIE_MSG_MASK;
 
-               dev_vdbg(sdev->dev,
-                        "ipc: firmware response, msg:0x%x, msg_ext:0x%x\n",
-                        msg, msg_ext);
+               trace_sof_intel_ipc_firmware_response(sdev, msg, msg_ext);
 
                /* mask Done interrupt */
                snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
                msg = hipct & HDA_DSP_REG_HIPCT_MSG_MASK;
                msg_ext = hipcte & HDA_DSP_REG_HIPCTE_MSG_MASK;
 
-               dev_vdbg(sdev->dev,
-                        "ipc: firmware initiated, msg:0x%x, msg_ext:0x%x\n",
-                        msg, msg_ext);
+               trace_sof_intel_ipc_firmware_initiated(sdev, msg, msg_ext);
 
                /* mask BUSY interrupt */
                snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
 
        /* store status */
        irq_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIS);
-       dev_vdbg(sdev->dev, "irq handler: irq_status:0x%x\n", irq_status);
+       trace_sof_intel_hda_irq_ipc_check(sdev, irq_status);
 
        /* invalid message ? */
        if (irq_status == 0xffffffff)
 
 #include <sound/hdaudio_ext.h>
 #include <sound/hda_register.h>
 #include <sound/sof.h>
+#include <trace/events/sof_intel.h>
 #include "../ops.h"
 #include "../sof-audio.h"
 #include "hda.h"
        spin_lock_irq(&bus->reg_lock);
 
        status = snd_hdac_chip_readl(bus, INTSTS);
-       dev_vdbg(bus->dev, "stream irq, INTSTS status: 0x%x\n", status);
+       trace_sof_intel_hda_dsp_check_stream_irq(sdev, status);
 
        /* if Register inaccessible, ignore it.*/
        if (status != 0xffffffff)
                if (status & BIT(s->index) && s->opened) {
                        sd_status = snd_hdac_stream_readb(s, SD_STS);
 
-                       dev_vdbg(bus->dev, "stream %d status 0x%x\n",
-                                s->index, sd_status);
+                       trace_sof_intel_hda_dsp_stream_status(bus->dev, s, sd_status);
 
                        snd_hdac_stream_writeb(s, SD_STS, sd_status);