diff options
author | Kai Vehmanen <[email protected]> | 2023-05-12 13:46:38 +0300 |
---|---|---|
committer | Mark Brown <[email protected]> | 2023-05-15 10:21:14 +0900 |
commit | 171b53be635ac15d4feafeb33946035649b1ca14 (patch) | |
tree | 1b99dd91940305b2b6e142fac3de2801d4d21b47 | |
parent | 647b5f5fdcbaba6f6fd8db69508fcbeb1fdfc2a6 (diff) |
ASoC: SOF: pm: save io region state in case of errors in resume
If there are failures in DSP runtime resume, the device state will not
reach active and this makes it impossible e.g. to retrieve a possible
DSP panic dump via "exception" debugfs node. If
CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE=y is set, the data in
cache is stale. If debugfs cache is not used, the region simply cannot
be read.
To allow debugging these scenarios, update the debugfs cache contents in
resume error handler. User-space can then later retrieve DSP panic and
other state via debugfs (requires SOF debugfs cache to be enabled in
build).
Reported-by: Curtis Malainey <[email protected]
Link: https://github.com/thesofproject/linux/issues/4274
Signed-off-by: Kai Vehmanen <[email protected]
Reviewed-by: Pierre-Louis Bossart <[email protected]
Reviewed-by: Ranjani Sridharan <[email protected]
Reviewed-by: Curtis Malainey <[email protected]
Reviewed-by: Péter Ujfalusi <[email protected]
Signed-off-by: Peter Ujfalusi <[email protected]
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]
-rw-r--r-- | sound/soc/sof/pm.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/sound/soc/sof/pm.c b/sound/soc/sof/pm.c index 2fdbc53ca715..2b232442e84b 100644 --- a/sound/soc/sof/pm.c +++ b/sound/soc/sof/pm.c @@ -164,7 +164,7 @@ static int sof_resume(struct device *dev, bool runtime_resume) ret = tplg_ops->set_up_all_pipelines(sdev, false); if (ret < 0) { dev_err(sdev->dev, "Failed to restore pipeline after resume %d\n", ret); - return ret; + goto setup_fail; } } @@ -178,6 +178,18 @@ static int sof_resume(struct device *dev, bool runtime_resume) dev_err(sdev->dev, "ctx_restore IPC error during resume: %d\n", ret); } +setup_fail: +#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE) + if (ret < 0) { + /* + * Debugfs cannot be read in runtime suspend, so cache + * the contents upon failure. This allows to capture + * possible DSP coredump information. + */ + sof_cache_debugfs(sdev); + } +#endif + return ret; } |