ASoC: SOF: intel: extend IPC dump information
authorKai Vehmanen <kai.vehmanen@linux.intel.com>
Wed, 12 Jun 2019 16:57:03 +0000 (11:57 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 13 Jun 2019 18:53:57 +0000 (19:53 +0100)
Extend the HDA IPC dump implementation with status of key IRQ
registers. This is useful to debug IPC timeouts and similar
issues.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/cnl.c
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.h

index 9a4927b6b6ae54cb371ecbb91bdcd1d7070240fc..d59305787fc3c81c6c16b925052520c93affe9aa 100644 (file)
@@ -168,6 +168,8 @@ static void cnl_ipc_dump(struct snd_sof_dev *sdev)
        u32 hipcida;
        u32 hipctdr;
 
+       hda_ipc_irq_dump(sdev);
+
        /* read IPC status */
        hipcida = snd_sof_dsp_read(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDA);
        hipcctl = snd_sof_dsp_read(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCCTL);
index 47b508463218a9eebd9b92292f1598a79c24a548..af546e42e1d9094d5357f92d325251667db5c86c 100644 (file)
@@ -15,6 +15,9 @@
  * Hardware interface for generic Intel audio DSP HDA IP
  */
 
+#include <sound/hdaudio_ext.h>
+#include <sound/hda_register.h>
+
 #include <linux/module.h>
 #include <sound/hdaudio_ext.h>
 #include <sound/sof.h>
@@ -183,12 +186,38 @@ void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags)
        }
 }
 
+void hda_ipc_irq_dump(struct snd_sof_dev *sdev)
+{
+       struct hdac_bus *bus = sof_to_bus(sdev);
+       u32 adspis;
+       u32 intsts;
+       u32 intctl;
+       u32 ppsts;
+       u8 rirbsts;
+
+       /* read key IRQ stats and config registers */
+       adspis = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIS);
+       intsts = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTSTS);
+       intctl = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL);
+       ppsts = snd_sof_dsp_read(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPSTS);
+       rirbsts = snd_hdac_chip_readb(bus, RIRBSTS);
+
+       dev_err(sdev->dev,
+               "error: hda irq intsts 0x%8.8x intlctl 0x%8.8x rirb %2.2x\n",
+               intsts, intctl, rirbsts);
+       dev_err(sdev->dev,
+               "error: dsp irq ppsts 0x%8.8x adspis 0x%8.8x\n",
+               ppsts, adspis);
+}
+
 void hda_ipc_dump(struct snd_sof_dev *sdev)
 {
        u32 hipcie;
        u32 hipct;
        u32 hipcctl;
 
+       hda_ipc_irq_dump(sdev);
+
        /* read IPC status */
        hipcie = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCIE);
        hipct = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCT);
index 455046612b9494188b3893beebda2c287f8e1fbb..6c7dee2627d071e3925d12bdc62c679bcdfa8bdf 100644 (file)
@@ -61,6 +61,7 @@
 #define SOF_HDA_PP_CAP_ID              0x3
 #define SOF_HDA_REG_PP_PPCH            0x10
 #define SOF_HDA_REG_PP_PPCTL           0x04
+#define SOF_HDA_REG_PP_PPSTS           0x08
 #define SOF_HDA_PPCTL_PIE              BIT(31)
 #define SOF_HDA_PPCTL_GPROCEN          BIT(30)
 
@@ -449,6 +450,7 @@ void hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev);
 void hda_dsp_dump_skl(struct snd_sof_dev *sdev, u32 flags);
 void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags);
 void hda_ipc_dump(struct snd_sof_dev *sdev);
+void hda_ipc_irq_dump(struct snd_sof_dev *sdev);
 
 /*
  * DSP PCM Operations.