“fe176de0ffdc2dd300fbcece84434a32b482b5b1”上不存在“arch/x86/kernel/microcode_intel.c”
未验证 提交 2f148430 编写于 作者: P Peter Ujfalusi 提交者: Mark Brown

ASoC: SOF: Add a 'message' parameter to snd_sof_dsp_dbg_dump()

When snd_sof_dsp_dbg_dump() is called we have an explanatory message to
give some hint on the reason why we have the dump on the caller level.

Pass this message to snd_sof_dsp_dbg_dump() and handle the print according
to the dump rules.

This way we can finally print information on the HDA boot iteration if all
dumps are enabled.
Signed-off-by: NPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: NRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: NPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: NKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211223113628.18582-7-peter.ujfalusi@linux.intel.comSigned-off-by: NMark Brown <broonie@kernel.org>
上级 b2b10aa7
...@@ -955,7 +955,7 @@ static void snd_sof_dbg_print_fw_state(struct snd_sof_dev *sdev) ...@@ -955,7 +955,7 @@ static void snd_sof_dbg_print_fw_state(struct snd_sof_dev *sdev)
dev_err(sdev->dev, "fw_state: UNKNOWN (%d)\n", sdev->fw_state); dev_err(sdev->dev, "fw_state: UNKNOWN (%d)\n", sdev->fw_state);
} }
void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags) void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, const char *msg, u32 flags)
{ {
bool print_all = sof_debug_check_flag(SOF_DBG_PRINT_ALL_DUMPS); bool print_all = sof_debug_check_flag(SOF_DBG_PRINT_ALL_DUMPS);
...@@ -964,11 +964,15 @@ void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags) ...@@ -964,11 +964,15 @@ void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags)
if (sof_ops(sdev)->dbg_dump && !sdev->dbg_dump_printed) { if (sof_ops(sdev)->dbg_dump && !sdev->dbg_dump_printed) {
dev_err(sdev->dev, "------------[ DSP dump start ]------------\n"); dev_err(sdev->dev, "------------[ DSP dump start ]------------\n");
if (msg)
dev_err(sdev->dev, "%s\n", msg);
snd_sof_dbg_print_fw_state(sdev); snd_sof_dbg_print_fw_state(sdev);
sof_ops(sdev)->dbg_dump(sdev, flags); sof_ops(sdev)->dbg_dump(sdev, flags);
dev_err(sdev->dev, "------------[ DSP dump end ]------------\n"); dev_err(sdev->dev, "------------[ DSP dump end ]------------\n");
if (!print_all) if (!print_all)
sdev->dbg_dump_printed = true; sdev->dbg_dump_printed = true;
} else if (msg) {
dev_err(sdev->dev, "%s\n", msg);
} }
} }
EXPORT_SYMBOL(snd_sof_dsp_dbg_dump); EXPORT_SYMBOL(snd_sof_dsp_dbg_dump);
...@@ -997,7 +1001,8 @@ void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev) ...@@ -997,7 +1001,8 @@ void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev)
/* dump vital information to the logs */ /* dump vital information to the logs */
snd_sof_ipc_dump(sdev); snd_sof_ipc_dump(sdev);
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX); snd_sof_dsp_dbg_dump(sdev, "Firmware exception",
SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX);
snd_sof_trace_notify_for_error(sdev); snd_sof_trace_notify_for_error(sdev);
} }
EXPORT_SYMBOL(snd_sof_handle_fw_exception); EXPORT_SYMBOL(snd_sof_handle_fw_exception);
...@@ -88,6 +88,7 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag) ...@@ -88,6 +88,7 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
const struct sof_intel_dsp_desc *chip = hda->desc; const struct sof_intel_dsp_desc *chip = hda->desc;
unsigned int status; unsigned int status;
unsigned long mask; unsigned long mask;
char *dump_msg;
u32 flags, j; u32 flags, j;
int ret; int ret;
int i; int i;
...@@ -189,9 +190,12 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag) ...@@ -189,9 +190,12 @@ static int cl_dsp_init(struct snd_sof_dev *sdev, int stream_tag)
if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS)
flags &= ~SOF_DBG_DUMP_OPTIONAL; flags &= ~SOF_DBG_DUMP_OPTIONAL;
snd_sof_dsp_dbg_dump(sdev, flags); dump_msg = kasprintf(GFP_KERNEL, "Boot iteration failed: %d/%d",
hda->boot_iteration, HDA_FW_BOOT_ATTEMPTS);
snd_sof_dsp_dbg_dump(sdev, dump_msg, flags);
hda_dsp_core_reset_power_down(sdev, chip->host_managed_cores_mask); hda_dsp_core_reset_power_down(sdev, chip->host_managed_cores_mask);
kfree(dump_msg);
return ret; return ret;
} }
...@@ -421,12 +425,11 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev) ...@@ -421,12 +425,11 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
*/ */
hda->boot_iteration = HDA_FW_BOOT_ATTEMPTS; hda->boot_iteration = HDA_FW_BOOT_ATTEMPTS;
ret = cl_copy_fw(sdev, stream); ret = cl_copy_fw(sdev, stream);
if (!ret) { if (!ret)
dev_dbg(sdev->dev, "Firmware download successful, booting...\n"); dev_dbg(sdev->dev, "Firmware download successful, booting...\n");
} else { else
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX); snd_sof_dsp_dbg_dump(sdev, "Firmware download failed",
dev_err(sdev->dev, "error: load fw failed ret: %d\n", ret); SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX);
}
cleanup: cleanup:
/* /*
......
...@@ -820,8 +820,8 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) ...@@ -820,8 +820,8 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
/* boot the firmware on the DSP */ /* boot the firmware on the DSP */
ret = snd_sof_dsp_run(sdev); ret = snd_sof_dsp_run(sdev);
if (ret < 0) { if (ret < 0) {
dev_err(sdev->dev, "error: failed to start DSP\n"); snd_sof_dsp_dbg_dump(sdev, "Failed to start DSP",
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_MBOX | SOF_DBG_DUMP_PCI); SOF_DBG_DUMP_MBOX | SOF_DBG_DUMP_PCI);
return ret; return ret;
} }
...@@ -835,8 +835,8 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) ...@@ -835,8 +835,8 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS, sdev->fw_state > SOF_FW_BOOT_IN_PROGRESS,
msecs_to_jiffies(sdev->boot_timeout)); msecs_to_jiffies(sdev->boot_timeout));
if (ret == 0) { if (ret == 0) {
dev_err(sdev->dev, "error: firmware boot failure\n"); snd_sof_dsp_dbg_dump(sdev, "Firmware boot failure due to timeout",
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX | SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX |
SOF_DBG_DUMP_TEXT | SOF_DBG_DUMP_PCI); SOF_DBG_DUMP_TEXT | SOF_DBG_DUMP_PCI);
sof_set_fw_state(sdev, SOF_FW_BOOT_FAILED); sof_set_fw_state(sdev, SOF_FW_BOOT_FAILED);
return -EIO; return -EIO;
......
...@@ -171,12 +171,11 @@ void snd_sof_dsp_panic(struct snd_sof_dev *sdev, u32 offset, bool non_recoverabl ...@@ -171,12 +171,11 @@ void snd_sof_dsp_panic(struct snd_sof_dev *sdev, u32 offset, bool non_recoverabl
* if all dumps should be printed * if all dumps should be printed
*/ */
if (non_recoverable || sof_debug_check_flag(SOF_DBG_PRINT_ALL_DUMPS)) { if (non_recoverable || sof_debug_check_flag(SOF_DBG_PRINT_ALL_DUMPS)) {
dev_err(sdev->dev, "DSP panic!\n");
/* We want to see the DSP panic! */ /* We want to see the DSP panic! */
sdev->dbg_dump_printed = false; sdev->dbg_dump_printed = false;
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX); snd_sof_dsp_dbg_dump(sdev, "DSP panic!",
SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX);
snd_sof_trace_notify_for_error(sdev); snd_sof_trace_notify_for_error(sdev);
} }
} }
......
...@@ -274,7 +274,7 @@ snd_sof_dsp_set_power_state(struct snd_sof_dev *sdev, ...@@ -274,7 +274,7 @@ snd_sof_dsp_set_power_state(struct snd_sof_dev *sdev,
} }
/* debug */ /* debug */
void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags); void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, const char *msg, u32 flags);
static inline int snd_sof_debugfs_add_region_item(struct snd_sof_dev *sdev, static inline int snd_sof_debugfs_add_region_item(struct snd_sof_dev *sdev,
enum snd_sof_fw_blk_type blk_type, u32 offset, size_t size, enum snd_sof_fw_blk_type blk_type, u32 offset, size_t size,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册