From 4b9d08cee9efefde16fcc7f8115fecd9e94c8e9b Mon Sep 17 00:00:00 2001 From: Mateusz Junkier Date: Wed, 4 Mar 2026 09:53:36 +0100 Subject: [PATCH] ASoC: SOF: ipc4-mtrace: resync host_read_ptr on debugfs open core_data->dsp_write_ptr is updated on each aging timer IPC, but there is 256ms window between DSP write and IPC. If reader opens in this window and DSP goes idle before next IPC,there wont be further writes and sof_wait_mtrace_avail() blocks until timeout. Fix by reading dsp_write_ptr directly from SRAM in open() to get current write position without waiting for the next IPC. host_read_ptr is left unchanged to preserve inter-session data. Signed-off-by: Mateusz Junkier --- sound/soc/sof/ipc4-mtrace.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sound/soc/sof/ipc4-mtrace.c b/sound/soc/sof/ipc4-mtrace.c index 667dda3f043978..fa8de5e64644d8 100644 --- a/sound/soc/sof/ipc4-mtrace.c +++ b/sound/soc/sof/ipc4-mtrace.c @@ -109,6 +109,20 @@ static int sof_ipc4_mtrace_dfs_open(struct inode *inode, struct file *file) return -ENOMEM; } + /* + * Re-sync dsp_write_ptr from SRAM on open to avoid blocking when + * DSP goes idle before next aging timer IPC arrives. + */ + if (core_data->slot_offset != SOF_IPC4_INVALID_SLOT_OFFSET) { + struct snd_sof_dev *sdev = core_data->sdev; + u32 write_ptr; + + sof_mailbox_read(sdev, core_data->slot_offset + sizeof(u32), + &write_ptr, sizeof(write_ptr)); + write_ptr -= write_ptr % 4; + core_data->dsp_write_ptr = write_ptr; + } + ret = simple_open(inode, file); if (ret) { kfree(core_data->log_buffer);