Linux Sound subsystem development
 help / color / mirror / Atom feed
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);


  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