ASoC: SOF: Intel: add HDA interrupt source tracing
authorNoah Klayman <noah.klayman@intel.com>
Mon, 19 Sep 2022 12:21:03 +0000 (14:21 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 19 Sep 2022 14:44:04 +0000 (15:44 +0100)
The Intel HDaudio controller relies on a single interrupt line which
wire-ORs multiple interrupt sources, such as stream, IPC, SoundWire and
wakes. This patch adds the ability to trace each event occurrence.

Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Noah Klayman <noah.klayman@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20220919122108.43764-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/trace/events/sof_intel.h [new file with mode: 0644]
sound/soc/sof/intel/hda.c

diff --git a/include/trace/events/sof_intel.h b/include/trace/events/sof_intel.h
new file mode 100644 (file)
index 0000000..37a9b92
--- /dev/null
@@ -0,0 +1,34 @@
+/* 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/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))
+);
+
+#endif /* _TRACE_SOF_INTEL_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
index 6d4ecbe..79df990 100644 (file)
@@ -31,6 +31,9 @@
 #include "../ops.h"
 #include "hda.h"
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/sof_intel.h>
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
 #include <sound/soc-acpi-intel-match.h>
 #endif
@@ -938,17 +941,25 @@ static irqreturn_t hda_dsp_interrupt_thread(int irq, void *context)
        struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
 
        /* deal with streams and controller first */
-       if (hda_dsp_check_stream_irq(sdev))
+       if (hda_dsp_check_stream_irq(sdev)) {
+               trace_sof_intel_hda_irq(sdev, "stream");
                hda_dsp_stream_threaded_handler(irq, sdev);
+       }
 
-       if (hda_check_ipc_irq(sdev))
+       if (hda_check_ipc_irq(sdev)) {
+               trace_sof_intel_hda_irq(sdev, "ipc");
                sof_ops(sdev)->irq_thread(irq, sdev);
+       }
 
-       if (hda_dsp_check_sdw_irq(sdev))
+       if (hda_dsp_check_sdw_irq(sdev)) {
+               trace_sof_intel_hda_irq(sdev, "sdw");
                hda_dsp_sdw_thread(irq, hdev->sdw);
+       }
 
-       if (hda_sdw_check_wakeen_irq(sdev))
+       if (hda_sdw_check_wakeen_irq(sdev)) {
+               trace_sof_intel_hda_irq(sdev, "wakeen");
                hda_sdw_process_wakeen(sdev);
+       }
 
        hda_check_for_state_change(sdev);