ASoC: SOF: Rename snd_sof_get_status() and add kernel log level parameter

The snd_sof_get_status() is not the best name for a function which in fact
is tasked to print out DSP oops and stack. Rename it to
sof_print_oops_and_stack().

At the same time add a new parameter to specify the desired kernel log
level to be used for the prints.

When updating the users of the function, pass KERN_ERR for now to make sure
that there is no functional change happens.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Chao Song <chao.song@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20211223113628.18582-18-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Peter Ujfalusi 2021-12-23 13:36:25 +02:00 committed by Mark Brown
parent b9f0bfd16d
commit 4995ffce2c
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
6 changed files with 40 additions and 29 deletions

View File

@ -68,23 +68,33 @@ static const struct sof_panic_msg panic_msg[] = {
{SOF_IPC_PANIC_ASSERT, "assertion failed"}, {SOF_IPC_PANIC_ASSERT, "assertion failed"},
}; };
/* /**
* sof_print_oops_and_stack - Handle the printing of DSP oops and stack trace
* @sdev: Pointer to the device's sdev
* @level: prink log level to use for the printing
* @panic_code: the panic code
* @tracep_code: tracepoint code
* @oops: Pointer to DSP specific oops data
* @panic_info: Pointer to the received panic information message
* @stack: Pointer to the call stack data
* @stack_words: Number of words in the stack data
*
* helper to be called from .dbg_dump callbacks. No error code is * helper to be called from .dbg_dump callbacks. No error code is
* provided, it's left as an exercise for the caller of .dbg_dump * provided, it's left as an exercise for the caller of .dbg_dump
* (typically IPC or loader) * (typically IPC or loader)
*/ */
void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code, void sof_print_oops_and_stack(struct snd_sof_dev *sdev, const char *level,
u32 tracep_code, void *oops, u32 panic_code, u32 tracep_code, void *oops,
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)
{ {
u32 code; u32 code;
int i; int i;
/* is firmware dead ? */ /* is firmware dead ? */
if ((panic_code & SOF_IPC_PANIC_MAGIC_MASK) != SOF_IPC_PANIC_MAGIC) { if ((panic_code & SOF_IPC_PANIC_MAGIC_MASK) != SOF_IPC_PANIC_MAGIC) {
dev_err(sdev->dev, "unexpected fault %#010x trace %#010x\n", dev_printk(level, sdev->dev, "unexpected fault %#010x trace %#010x\n",
panic_code, tracep_code); panic_code, tracep_code);
return; /* no fault ? */ return; /* no fault ? */
} }
@ -92,24 +102,25 @@ void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code,
for (i = 0; i < ARRAY_SIZE(panic_msg); i++) { for (i = 0; i < ARRAY_SIZE(panic_msg); i++) {
if (panic_msg[i].id == code) { if (panic_msg[i].id == code) {
dev_err(sdev->dev, "reason: %s (%#x)\n", panic_msg[i].msg, dev_printk(level, sdev->dev, "reason: %s (%#x)\n",
code & SOF_IPC_PANIC_CODE_MASK); panic_msg[i].msg, code & SOF_IPC_PANIC_CODE_MASK);
dev_err(sdev->dev, "trace point: %#010x\n", tracep_code); dev_printk(level, sdev->dev, "trace point: %#010x\n", tracep_code);
goto out; goto out;
} }
} }
/* unknown error */ /* unknown error */
dev_err(sdev->dev, "unknown panic code: %#x\n", code & SOF_IPC_PANIC_CODE_MASK); dev_printk(level, sdev->dev, "unknown panic code: %#x\n",
dev_err(sdev->dev, "trace point: %#010x\n", tracep_code); code & SOF_IPC_PANIC_CODE_MASK);
dev_printk(level, sdev->dev, "trace point: %#010x\n", tracep_code);
out: out:
dev_err(sdev->dev, "panic at %s:%d\n", panic_info->filename, dev_printk(level, sdev->dev, "panic at %s:%d\n", panic_info->filename,
panic_info->linenum); panic_info->linenum);
sof_oops(sdev, KERN_ERR, oops); sof_oops(sdev, level, oops);
sof_stack(sdev, KERN_ERR, oops, stack, stack_words); sof_stack(sdev, level, oops, stack, stack_words);
} }
EXPORT_SYMBOL(snd_sof_get_status); EXPORT_SYMBOL(sof_print_oops_and_stack);
/* /*
* FW Boot State Transition Diagram * FW Boot State Transition Diagram

View File

@ -69,8 +69,8 @@ void imx8_dump(struct snd_sof_dev *sdev, u32 flags)
IMX8_STACK_DUMP_SIZE); IMX8_STACK_DUMP_SIZE);
/* Print the information to the console */ /* Print the information to the console */
snd_sof_get_status(sdev, status, status, &xoops, &panic_info, stack, sof_print_oops_and_stack(sdev, KERN_ERR, status, status, &xoops,
IMX8_STACK_DUMP_SIZE); &panic_info, stack, IMX8_STACK_DUMP_SIZE);
} }
EXPORT_SYMBOL(imx8_dump); EXPORT_SYMBOL(imx8_dump);

View File

@ -70,8 +70,8 @@ void atom_dump(struct snd_sof_dev *sdev, u32 flags)
panic = snd_sof_dsp_read64(sdev, DSP_BAR, SHIM_IPCX); panic = snd_sof_dsp_read64(sdev, DSP_BAR, SHIM_IPCX);
atom_get_registers(sdev, &xoops, &panic_info, stack, atom_get_registers(sdev, &xoops, &panic_info, stack,
STACK_DUMP_SIZE); STACK_DUMP_SIZE);
snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, stack, sof_print_oops_and_stack(sdev, KERN_ERR, status, panic, &xoops,
STACK_DUMP_SIZE); &panic_info, stack, STACK_DUMP_SIZE);
/* provide some context for firmware debug */ /* provide some context for firmware debug */
imrx = snd_sof_dsp_read64(sdev, DSP_BAR, SHIM_IMRX); imrx = snd_sof_dsp_read64(sdev, DSP_BAR, SHIM_IMRX);

View File

@ -258,8 +258,8 @@ static void bdw_dump(struct snd_sof_dev *sdev, u32 flags)
panic = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IPCX); panic = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IPCX);
bdw_get_registers(sdev, &xoops, &panic_info, stack, bdw_get_registers(sdev, &xoops, &panic_info, stack,
BDW_STACK_DUMP_SIZE); BDW_STACK_DUMP_SIZE);
snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, stack, sof_print_oops_and_stack(sdev, KERN_ERR, status, panic, &xoops,
BDW_STACK_DUMP_SIZE); &panic_info, stack, BDW_STACK_DUMP_SIZE);
/* provide some context for firmware debug */ /* provide some context for firmware debug */
imrx = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IMRX); imrx = snd_sof_dsp_read(sdev, BDW_DSP_BAR, SHIM_IMRX);

View File

@ -554,8 +554,8 @@ void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags)
hda_dsp_get_registers(sdev, &xoops, &panic_info, stack, hda_dsp_get_registers(sdev, &xoops, &panic_info, stack,
HDA_DSP_STACK_DUMP_SIZE); HDA_DSP_STACK_DUMP_SIZE);
snd_sof_get_status(sdev, status, panic, &xoops, &panic_info, sof_print_oops_and_stack(sdev, KERN_ERR, status, panic, &xoops,
stack, HDA_DSP_STACK_DUMP_SIZE); &panic_info, stack, HDA_DSP_STACK_DUMP_SIZE);
} else { } else {
hda_dsp_dump_ext_rom_status(sdev, flags); hda_dsp_dump_ext_rom_status(sdev, flags);
} }

View File

@ -559,10 +559,10 @@ int snd_sof_debugfs_buf_item(struct snd_sof_dev *sdev,
int snd_sof_trace_update_pos(struct snd_sof_dev *sdev, int snd_sof_trace_update_pos(struct snd_sof_dev *sdev,
struct sof_ipc_dma_trace_posn *posn); struct sof_ipc_dma_trace_posn *posn);
void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev); void snd_sof_trace_notify_for_error(struct snd_sof_dev *sdev);
void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code, void sof_print_oops_and_stack(struct snd_sof_dev *sdev, const char *level,
u32 tracep_code, void *oops, u32 panic_code, u32 tracep_code, void *oops,
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); void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev);
int snd_sof_dbg_memory_info_init(struct snd_sof_dev *sdev); int snd_sof_dbg_memory_info_init(struct snd_sof_dev *sdev);