From: "Péter Ujfalusi" <peter.ujfalusi@linux.intel.com>
To: Sasha Levin <sashal@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>
Cc: Bard Liao <yung-chuan.liao@linux.intel.com>,
Kai Vehmanen <kai.vehmanen@linux.intel.com>,
Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>,
Daniel Baluta <daniel.baluta@nxp.com>,
Takashi Iwai <tiwai@suse.com>, Jaroslav Kysela <perex@perex.cz>,
sound-open-firmware@alsa-project.org,
linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
yifan2.li@intel.com
Subject: Re: [PATCH] ASoC: SOF: Intel: hda: Stop the controller before freeing its DMA buffers
Date: Thu, 29 Oct 2026 09:46:45 +0200 [thread overview]
Message-ID: <3d074141-2360-4a63-9fcb-ac8f86a8cbb0@linux.intel.com> (raw)
In-Reply-To: <20261028144446.992948-1-sashal@kernel.org>
On 28/10/2026 16:44, Sasha Levin wrote:
> hda_dsp_probe() starts the CORB/RIRB DMA engines through
> hda_dsp_ctrl_init_chip(), but neither hda_dsp_remove() nor the error
> path of hda_dsp_probe() stops them before hda_dsp_stream_free() frees
> the CORB/RIRB ring buffer and the position buffer. Unsolicited
> responses also stay enabled, so the controller can keep writing RIRB
> entries into the freed page.
>
> Until commit 9e6966f70404 ("ASoC: SOF: Intel: hda: Keep non-alt mlinks
> powered at probe on ACE2+"), hda_init_caps() dropped the initial
> references to the non-alternate links, and dropping the last one
> stopped the command DMA, so a probe that failed later, e.g. because
> the firmware is missing, did not leave it running. Now it does, and
> as the probe runs from a work item, the device stays bound after the
> failure, with bus mastering enabled and the DMA engines pointed at
> freed memory.
>
> Normal removal resumes the device first, which restarts the command
> DMA, so there the ring buffer is freed while the DMA is running until
> pci_disable_device() clears bus mastering.
>
> Stop the controller with hda_dsp_ctrl_stop_chip() before freeing the
> buffers, as is done on suspend, and export it for use from hda.c.
>
> This was reproduced by binding SOF in DSPless mode to a QEMU
> ich9-intel-hda: after the probe fails with "SOF firmware and/or
> topology file not found", CORB and RIRB DMA are still running with
> unsolicited responses and bus mastering enabled, and the page they use
> is soon reused as a page table.
This is indeed a possibility which I have overlooked.
FWIW, Li Yifan spotted the same issue earlier:
https://github.com/thesofproject/linux/pull/5976
but using hda_dsp_ctrl_stop_chip() is the better way.
> Fixes: dd96daca6c83 ("ASoC: SOF: Intel: Add APL/CNL HW DSP support")
Can you drop this Fixes tag, the hda-ctrl.c hunk will not apply nicely
to older stable kernels
With the removed tag:
Acked-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Fixes: 9e6966f70404 ("ASoC: SOF: Intel: hda: Keep non-alt mlinks powered at probe on ACE2+")
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
> sound/soc/sof/intel/hda-ctrl.c | 1 +
> sound/soc/sof/intel/hda.c | 4 ++++
> 2 files changed, 5 insertions(+)
>
> diff --git a/sound/soc/sof/intel/hda-ctrl.c b/sound/soc/sof/intel/hda-ctrl.c
> index aeb34310eebd6..333f6bbea7539 100644
> --- a/sound/soc/sof/intel/hda-ctrl.c
> +++ b/sound/soc/sof/intel/hda-ctrl.c
> @@ -349,6 +349,7 @@ void hda_dsp_ctrl_stop_chip(struct snd_sof_dev *sdev)
>
> bus->chip_init = false;
> }
> +EXPORT_SYMBOL_NS(hda_dsp_ctrl_stop_chip, "SND_SOC_SOF_INTEL_HDA_COMMON");
>
> MODULE_LICENSE("Dual BSD/GPL");
> MODULE_DESCRIPTION("SOF helpers for HDaudio platforms");
> diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
> index 4dbba9186b29d..2a40cb9bf24d9 100644
> --- a/sound/soc/sof/intel/hda.c
> +++ b/sound/soc/sof/intel/hda.c
> @@ -939,6 +939,7 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
> hda_dsp_ctrl_ppcap_enable(sdev, false);
> }
> free_ipc_irq:
> + hda_dsp_ctrl_stop_chip(sdev);
> free_irq(sdev->ipc_irq, sdev);
> free_irq_vector:
> if (sdev->msi_enabled)
> @@ -1006,6 +1007,9 @@ void hda_dsp_remove(struct snd_sof_dev *sdev)
> snd_dma_free_pages(&hda->iccmax_dmab);
>
> skip_disable_dsp:
> + /* stop CORB/RIRB and position buffer DMA before the buffers are freed */
> + hda_dsp_ctrl_stop_chip(sdev);
> +
> free_irq(sdev->ipc_irq, sdev);
> if (sdev->msi_enabled)
> pci_free_irq_vectors(pci);
--
Péter
next prev parent reply other threads:[~2026-10-29 7:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 14:44 Sasha Levin
2026-10-29 7:46 ` Péter Ujfalusi [this message]
2026-10-29 9:20 ` Li, Yifan2
2026-10-29 11:41 ` Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3d074141-2360-4a63-9fcb-ac8f86a8cbb0@linux.intel.com \
--to=peter.ujfalusi@linux.intel.com \
--cc=broonie@kernel.org \
--cc=daniel.baluta@nxp.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=pierre-louis.bossart@linux.dev \
--cc=sashal@kernel.org \
--cc=sound-open-firmware@alsa-project.org \
--cc=tiwai@suse.com \
--cc=yifan2.li@intel.com \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®