From: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
To: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>,
vkoul@kernel.org, perex@perex.cz, tiwai@suse.com,
lgirdwood@gmail.com, broonie@kernel.org,
srinivas.kandagatla@oss.qualcomm.com
Cc: linux-sound@vger.kernel.org, kai.vehmanen@linux.intel.com,
yung-chuan.liao@linux.intel.com, daniel.baluta@nxp.com
Subject: Re: [PATCH v2 11/24] ASoC: SOF: pcm: Modify the signature of a couple of PCM IPC ops
Date: Wed, 9 Sep 2026 14:43:29 +0200 [thread overview]
Message-ID: <837e06dc-6291-4d25-9e48-93044b7d5b62@linux.dev> (raw)
In-Reply-To: <20260909090949.7503-12-peter.ujfalusi@linux.intel.com>
On 9/9/26 11:09, Peter Ujfalusi wrote:
> From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
>
> In order to reuse the pipeline triggering logic for compressed support
> with IPC4, modify the signature of the trigger and hw_free PCM IPC ops
> so that they can be reused.
>
> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
> ---
> sound/soc/sof/ipc3-pcm.c | 26 +++++++---------------
> sound/soc/sof/ipc4-pcm.c | 45 ++++++++++++++++++++-------------------
> sound/soc/sof/pcm.c | 7 +++---
> sound/soc/sof/sof-audio.h | 7 +++---
> 4 files changed, 39 insertions(+), 46 deletions(-)
also a prerequisite patch that should be submitted separately before the
bigger changes.
>
> diff --git a/sound/soc/sof/ipc3-pcm.c b/sound/soc/sof/ipc3-pcm.c
> index 1d0c80466f6a..42f93e596598 100644
> --- a/sound/soc/sof/ipc3-pcm.c
> +++ b/sound/soc/sof/ipc3-pcm.c
> @@ -14,23 +14,18 @@
> #include "sof-audio.h"
>
> static int sof_ipc3_pcm_hw_free(struct snd_soc_component *component,
> - struct snd_pcm_substream *substream)
> + struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int dir)
> {
> struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
> - struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
> struct sof_ipc_stream stream;
> - struct snd_sof_pcm *spcm;
> -
> - spcm = snd_sof_find_spcm_dai(component, rtd);
> - if (!spcm)
> - return -EINVAL;
>
> - if (!spcm->prepared[substream->stream])
> + if (!spcm->prepared[dir])
> return 0;
>
> stream.hdr.size = sizeof(stream);
> stream.hdr.cmd = SOF_IPC_GLB_STREAM_MSG | SOF_IPC_STREAM_PCM_FREE;
> - stream.comp_id = spcm->stream[substream->stream].comp_id;
> + stream.comp_id = spcm->stream[dir].comp_id;
>
> /* send IPC to the DSP */
> return sof_ipc_tx_message_no_reply(sdev->ipc, &stream, sizeof(stream));
> @@ -141,20 +136,15 @@ static int sof_ipc3_pcm_hw_params(struct snd_soc_component *component,
> }
>
> static int sof_ipc3_pcm_trigger(struct snd_soc_component *component,
> - struct snd_pcm_substream *substream, int cmd)
> + struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int cmd, int dir)
> {
> - struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
> struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
> struct sof_ipc_stream stream;
> - struct snd_sof_pcm *spcm;
> -
> - spcm = snd_sof_find_spcm_dai(component, rtd);
> - if (!spcm)
> - return -EINVAL;
>
> stream.hdr.size = sizeof(stream);
> stream.hdr.cmd = SOF_IPC_GLB_STREAM_MSG;
> - stream.comp_id = spcm->stream[substream->stream].comp_id;
> + stream.comp_id = spcm->stream[dir].comp_id;
>
> switch (cmd) {
> case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
> @@ -172,7 +162,7 @@ static int sof_ipc3_pcm_trigger(struct snd_soc_component *component,
> stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP;
> break;
> default:
> - spcm_err(spcm, substream->stream, "Unhandled trigger cmd %d\n", cmd);
> + spcm_err(spcm, dir, "Unhandled trigger cmd %d\n", cmd);
> return -EINVAL;
> }
>
> diff --git a/sound/soc/sof/ipc4-pcm.c b/sound/soc/sof/ipc4-pcm.c
> index 9d4be9ef4403..6e8522d03a2b 100644
> --- a/sound/soc/sof/ipc4-pcm.c
> +++ b/sound/soc/sof/ipc4-pcm.c
> @@ -412,28 +412,23 @@ static int sof_ipc4_chain_dma_trigger(struct snd_sof_dev *sdev,
> }
>
> static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> - struct snd_pcm_substream *substream, int state, int cmd)
> + struct snd_pcm_substream *substream, int state, int cmd,
> + struct snd_sof_pcm *spcm, int dir)
> {
> struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
> - struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
> struct snd_sof_pcm_stream_pipeline_list *pipeline_list;
> struct sof_ipc4_fw_data *ipc4_data = sdev->private;
> struct ipc4_pipeline_set_state_data *trigger_list;
> struct snd_sof_widget *pipe_widget;
> struct sof_ipc4_pipeline *pipeline;
> struct snd_sof_pipeline *spipe;
> - struct snd_sof_pcm *spcm;
> u8 *pipe_priority;
> int ret;
> int i;
>
> - spcm = snd_sof_find_spcm_dai(component, rtd);
> - if (!spcm)
> - return -EINVAL;
> + spcm_dbg(spcm, dir, "cmd: %d, state: %d\n", cmd, state);
>
> - spcm_dbg(spcm, substream->stream, "cmd: %d, state: %d\n", cmd, state);
> -
> - pipeline_list = &spcm->stream[substream->stream].pipeline_list;
> + pipeline_list = &spcm->stream[dir].pipeline_list;
> guard(mutex)(&ipc4_data->pipeline_state_mutex);
>
> /* nothing to trigger if the list is empty */
> @@ -454,9 +449,9 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> if (pipeline->use_chain_dma) {
> struct sof_ipc4_timestamp_info *time_info;
>
> - time_info = sof_ipc4_sps_to_time_info(&spcm->stream[substream->stream]);
> + time_info = sof_ipc4_sps_to_time_info(&spcm->stream[dir]);
>
> - ret = sof_ipc4_chain_dma_trigger(sdev, spcm, substream->stream,
> + ret = sof_ipc4_chain_dma_trigger(sdev, spcm, dir,
> pipeline_list, state, cmd);
> if (ret || !time_info)
> return ret;
> @@ -465,12 +460,16 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> /*
> * Record the DAI position for delay reporting
> * To handle multiple pause/resume/xrun we need to add
> - * the positions to simulate how the firmware behaves
> + * the positions to simulate how the firmware behaves.
> + * Chained DMA does not support compress streams. We should
> + * never get here with compress.
> */
> - u64 pos = snd_sof_pcm_get_dai_frame_counter(sdev, component,
> - substream);
> + if (substream) {
> + u64 pos = snd_sof_pcm_get_dai_frame_counter(sdev, component,
> + substream);
>
> - time_info->stream_end_offset += pos;
> + time_info->stream_end_offset += pos;
> + }
> } else if (state == SOF_IPC4_PIPE_RESET) {
> /* Reset the end offset as the stream is stopped */
> time_info->stream_end_offset = 0;
> @@ -533,7 +532,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> */
> ret = sof_ipc4_set_multi_pipeline_state(sdev, SOF_IPC4_PIPE_PAUSED, trigger_list);
> if (ret < 0) {
> - spcm_err(spcm, substream->stream, "failed to pause all pipelines\n");
> + spcm_err(spcm, dir, "failed to pause all pipelines\n");
> /*
> * workaround: if the firmware is crashed or the IPC timed out
> * while setting the pipeline state we must ignore the error
> @@ -566,7 +565,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> * Invalidate the stream_start_offset to make sure that it is
> * going to be updated if the stream resumes
> */
> - time_info = sof_ipc4_sps_to_time_info(&spcm->stream[substream->stream]);
> + time_info = sof_ipc4_sps_to_time_info(&spcm->stream[dir]);
> if (time_info)
> time_info->stream_start_offset = SOF_IPC4_INVALID_STREAM_POSITION;
>
> @@ -576,7 +575,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> /* else set the RUNNING/RESET state in the DSP */
> ret = sof_ipc4_set_multi_pipeline_state(sdev, state, trigger_list);
> if (ret < 0) {
> - spcm_err(spcm, substream->stream,
> + spcm_err(spcm, dir,
> "failed to set final state %d for all pipelines\n",
> state);
> /*
> @@ -609,7 +608,8 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
> }
>
> static int sof_ipc4_pcm_trigger(struct snd_soc_component *component,
> - struct snd_pcm_substream *substream, int cmd)
> + struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int cmd, int dir)
> {
> int state;
>
> @@ -631,14 +631,15 @@ static int sof_ipc4_pcm_trigger(struct snd_soc_component *component,
> }
>
> /* set the pipeline state */
> - return sof_ipc4_trigger_pipelines(component, substream, state, cmd);
> + return sof_ipc4_trigger_pipelines(component, substream, state, cmd, spcm, dir);
> }
>
> static int sof_ipc4_pcm_hw_free(struct snd_soc_component *component,
> - struct snd_pcm_substream *substream)
> + struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int dir)
> {
> /* command is not relevant with RESET, so just pass 0 */
> - return sof_ipc4_trigger_pipelines(component, substream, SOF_IPC4_PIPE_RESET, 0);
> + return sof_ipc4_trigger_pipelines(component, substream, SOF_IPC4_PIPE_RESET, 0, spcm, dir);
> }
>
> static int ipc4_ssp_dai_config_pcm_params_match(struct snd_sof_dev *sdev,
> diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c
> index 8f59c200b8ec..42738f12fa33 100644
> --- a/sound/soc/sof/pcm.c
> +++ b/sound/soc/sof/pcm.c
> @@ -152,7 +152,7 @@ static int sof_pcm_hw_params(struct snd_soc_component *component,
> * between. At least ALSA OSS emulation depends on this.
> */
> if (spcm->prepared[substream->stream] && pcm_ops && pcm_ops->hw_free) {
> - ret = pcm_ops->hw_free(component, substream);
> + ret = pcm_ops->hw_free(component, substream, spcm, substream->stream);
> if (ret < 0)
> return ret;
>
> @@ -223,7 +223,8 @@ static int sof_pcm_stream_free(struct snd_sof_dev *sdev,
>
> /* free PCM in the DSP */
> if (pcm_ops && pcm_ops->hw_free) {
> - ret = pcm_ops->hw_free(sdev->component, substream);
> + ret = pcm_ops->hw_free(sdev->component, substream, spcm,
> + substream->stream);
> if (ret < 0) {
> spcm_err(spcm, substream->stream,
> "pcm_ops->hw_free failed %d\n", ret);
> @@ -458,7 +459,7 @@ static int sof_pcm_trigger(struct snd_soc_component *component,
> snd_sof_pcm_platform_trigger(sdev, substream, cmd);
>
> if (pcm_ops && pcm_ops->trigger)
> - ret = pcm_ops->trigger(component, substream, cmd);
> + ret = pcm_ops->trigger(component, substream, spcm, cmd, substream->stream);
>
> switch (cmd) {
> case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
> diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h
> index 1b3e66037584..0610f2ab844d 100644
> --- a/sound/soc/sof/sof-audio.h
> +++ b/sound/soc/sof/sof-audio.h
> @@ -125,9 +125,10 @@ struct sof_ipc_pcm_ops {
> int (*hw_params)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
> struct snd_pcm_hw_params *params,
> struct snd_sof_platform_stream_params *platform_params);
> - int (*hw_free)(struct snd_soc_component *component, struct snd_pcm_substream *substream);
> - int (*trigger)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
> - int cmd);
> + int (*hw_free)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int dir);
> + int (*trigger)(struct snd_soc_component *component, struct snd_pcm_substream *substream,
> + struct snd_sof_pcm *spcm, int cmd, int dir);
> int (*dai_link_fixup)(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params);
> int (*pcm_setup)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
> void (*pcm_free)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
next prev parent reply other threads:[~2026-09-09 14:23 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 9:09 [PATCH v2 00/24] ALSA compress / ASoC compress / SOF: Compressed audio support with IPC4 Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 01/24] ALSA: compress: pin card module while stream is open Peter Ujfalusi
2026-09-09 15:12 ` Takashi Iwai
2026-09-09 9:09 ` [PATCH v2 02/24] ALSA: compress: register the open file with the card Peter Ujfalusi
2026-09-09 15:12 ` Takashi Iwai
2026-09-09 9:09 ` [PATCH v2 03/24] ALSA: compress: stop active streams on disconnect Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 04/24] ASoC: soc-compress: Provide a runtime for the compressed FE substream Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 05/24] ASoC: soc-compress: Implement trigger FE-BE sequencing as with normal PCMs Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 06/24] ASoC: soc-compress: Stop running dpcm on free Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 07/24] ASoC: SOF: compress: Rename compress ops with ipc3 prefix Peter Ujfalusi
2026-09-09 12:34 ` Pierre-Louis Bossart
2026-09-10 14:13 ` Péter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 08/24] ASoC: SOF: ipc4-pcm: harden pipeline teardown races Peter Ujfalusi
2026-09-09 12:37 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 09/24] ASoC: SOF: sof-audio: do not dereference swidget->spipe unconditionally on free Peter Ujfalusi
2026-09-09 12:39 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 10/24] ASoC: SOF: sof-audio: Expose a couple of functions Peter Ujfalusi
2026-09-09 12:41 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 11/24] ASoC: SOF: pcm: Modify the signature of a couple of PCM IPC ops Peter Ujfalusi
2026-09-09 12:43 ` Pierre-Louis Bossart [this message]
2026-09-09 9:09 ` [PATCH v2 12/24] ASoC: SOF: intel: hda-stream: Clear the current position when releasing stream Peter Ujfalusi
2026-09-09 12:45 ` Pierre-Louis Bossart
2026-09-11 6:31 ` Péter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 13/24] ASoC: SOF: ops: Add new platform-specific ops for compress Peter Ujfalusi
2026-09-09 14:23 ` Pierre-Louis Bossart
2026-09-10 14:25 ` Péter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 14/24] ASoC: SOF: ipc4: Add definition of module data in init_ext object type Peter Ujfalusi
2026-09-09 12:49 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 15/24] ASoC: SOF: ipc4-topology: Support init_ext_module_data for process modules Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 16/24] ASoC: SOF: ipc4-pcm: Make the timestamp info usable outside of ipc4-pcm.c Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 17/24] ASoC: SOF: ipc4/ipc4-loader: Add SOF_INFO and CODEC_INFO to fw_config_params Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 18/24] ASoC: SOF: ipc4-pcm: Handle COMPR DRAIN triggers as EOS pipeline state Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 19/24] ASoC: SOF: ipc4-topology: Set FAST_MODE for host copier in compr mode Peter Ujfalusi
2026-09-09 13:21 ` Pierre-Louis Bossart
2026-09-10 14:49 ` Péter Ujfalusi
2026-09-11 19:08 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 20/24] ASoC: SOF: Add support for IPC4 compressed Peter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 21/24] ASoC: SOF: ipc4: Handle compressed drain done notification from firmware Peter Ujfalusi
2026-09-09 13:28 ` Pierre-Louis Bossart
2026-09-10 15:08 ` Péter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 22/24] ASoC: SOF: Intel: Kconfig: Remove redundant IPC version selects Peter Ujfalusi
2026-09-09 13:29 ` Pierre-Louis Bossart
2026-09-09 9:09 ` [PATCH v2 23/24] ASoC: SOF: Intel: Kconfig: Select compress support for TGL+ platforms Peter Ujfalusi
2026-09-09 13:37 ` Pierre-Louis Bossart
2026-09-10 14:57 ` Péter Ujfalusi
2026-09-09 9:09 ` [PATCH v2 24/24] ASoC: SOF: topology: Add support for decoder and encoder widgets Peter Ujfalusi
2026-09-09 13:42 ` [PATCH v2 00/24] ALSA compress / ASoC compress / SOF: Compressed audio support with IPC4 Pierre-Louis Bossart
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=837e06dc-6291-4d25-9e48-93044b7d5b62@linux.dev \
--to=pierre-louis.bossart@linux.dev \
--cc=broonie@kernel.org \
--cc=daniel.baluta@nxp.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=peter.ujfalusi@linux.intel.com \
--cc=srinivas.kandagatla@oss.qualcomm.com \
--cc=tiwai@suse.com \
--cc=vkoul@kernel.org \
--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