Commit 9a06508b authored by Liam Girdwood's avatar Liam Girdwood Committed by Mark Brown

ASoC: SOF: ipc: retain DSP context after FW exception.

Add config option to prevent DSP entering D3 after any FW exception.
This can then be used to dump FW context for debug.
Signed-off-by: default avatarLiam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190927200538.660-5-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2ab4c50f
...@@ -158,6 +158,14 @@ config SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST ...@@ -158,6 +158,14 @@ config SND_SOC_SOF_DEBUG_IPC_FLOOD_TEST
Say Y if you want to enable IPC flood test. Say Y if you want to enable IPC flood test.
If unsure, select "N". If unsure, select "N".
config SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT
bool "SOF retain DSP context on any FW exceptions"
help
This option keeps the DSP in D0 state so that firmware debug
information can be retained and dumped to userspace.
Say Y if you want to retain DSP context for FW exceptions.
If unsure, select "N".
endif ## SND_SOC_SOF_DEBUG endif ## SND_SOC_SOF_DEBUG
endif ## SND_SOC_SOF_OPTIONS endif ## SND_SOC_SOF_OPTIONS
......
...@@ -461,3 +461,19 @@ void snd_sof_free_debug(struct snd_sof_dev *sdev) ...@@ -461,3 +461,19 @@ void snd_sof_free_debug(struct snd_sof_dev *sdev)
debugfs_remove_recursive(sdev->debugfs_root); debugfs_remove_recursive(sdev->debugfs_root);
} }
EXPORT_SYMBOL_GPL(snd_sof_free_debug); EXPORT_SYMBOL_GPL(snd_sof_free_debug);
void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev)
{
if (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_RETAIN_DSP_CONTEXT) ||
(sof_core_debug & SOF_DBG_RETAIN_CTX)) {
/* should we prevent DSP entering D3 ? */
dev_info(sdev->dev, "info: preventing DSP entering D3 state to preserve context\n");
pm_runtime_get_noresume(sdev->dev);
}
/* dump vital information to the logs */
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_REGS | SOF_DBG_MBOX);
snd_sof_ipc_dump(sdev);
snd_sof_trace_notify_for_error(sdev);
}
EXPORT_SYMBOL(snd_sof_handle_fw_exception);
...@@ -210,9 +210,7 @@ static int tx_wait_done(struct snd_sof_ipc *ipc, struct snd_sof_ipc_msg *msg, ...@@ -210,9 +210,7 @@ static int tx_wait_done(struct snd_sof_ipc *ipc, struct snd_sof_ipc_msg *msg,
if (ret == 0) { if (ret == 0) {
dev_err(sdev->dev, "error: ipc timed out for 0x%x size %d\n", dev_err(sdev->dev, "error: ipc timed out for 0x%x size %d\n",
hdr->cmd, hdr->size); hdr->cmd, hdr->size);
snd_sof_dsp_dbg_dump(ipc->sdev, SOF_DBG_REGS | SOF_DBG_MBOX); snd_sof_handle_fw_exception(ipc->sdev);
snd_sof_ipc_dump(ipc->sdev);
snd_sof_trace_notify_for_error(ipc->sdev);
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
} else { } else {
/* copy the data returned from DSP */ /* copy the data returned from DSP */
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define SOF_DBG_MBOX BIT(2) #define SOF_DBG_MBOX BIT(2)
#define SOF_DBG_TEXT BIT(3) #define SOF_DBG_TEXT BIT(3)
#define SOF_DBG_PCI BIT(4) #define SOF_DBG_PCI BIT(4)
#define SOF_DBG_RETAIN_CTX BIT(5) /* prevent DSP D3 on FW exception */
/* global debug state set by SOF_DBG_ flags */ /* global debug state set by SOF_DBG_ flags */
extern int sof_core_debug; extern int sof_core_debug;
...@@ -580,6 +581,7 @@ void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code, ...@@ -580,6 +581,7 @@ void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code,
struct sof_ipc_panic_info *panic_info, struct sof_ipc_panic_info *panic_info,
void *stack, size_t stack_words); void *stack, size_t stack_words);
int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev); int snd_sof_init_trace_ipc(struct snd_sof_dev *sdev);
void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev);
/* /*
* Platform specific ops. * Platform specific ops.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment