ASoC: SOF: amd: Handle IPC replies before FW_BOOT_COMPLETE
In some cases, e.g. during resuming from suspend, there is a possibility that some IPC reply messages get received by the host while the DSP firmware has not yet reached the complete boot state. Detect when this happens and do not attempt to process the unexpected replies from DSP. Instead, provide proper debugging support. Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com> Link: https://patch.msgid.link/20250207-sof-vangogh-fixes-v1-3-67824c1e4c9a@collabora.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2ecbc2e9f3
commit
ac84ca815a
1 changed files with 16 additions and 7 deletions
|
@ -167,6 +167,7 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
|
||||
if (sdev->first_boot && sdev->fw_state != SOF_FW_BOOT_COMPLETE) {
|
||||
acp_mailbox_read(sdev, sdev->dsp_box.offset, &status, sizeof(status));
|
||||
|
||||
if ((status & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
|
||||
snd_sof_dsp_panic(sdev, sdev->dsp_box.offset + sizeof(status),
|
||||
true);
|
||||
|
@ -188,13 +189,21 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
|
||||
dsp_ack = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SCRATCH_REG_0 + dsp_ack_write);
|
||||
if (dsp_ack) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
if (likely(sdev->fw_state == SOF_FW_BOOT_COMPLETE)) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
} else {
|
||||
dev_dbg_ratelimited(sdev->dev, "IPC reply before FW_BOOT_COMPLETE: %#x\n",
|
||||
dsp_ack);
|
||||
}
|
||||
|
||||
ipc_irq = true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue