]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: ipc4-topology: Enable deep buffer capture
authorSeppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
Fri, 22 May 2026 07:56:59 +0000 (10:56 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 22 May 2026 11:07:37 +0000 (12:07 +0100)
This patch lets a capture PCM to operate with deep buffer
by taking dsp_max_burst_size_in_ms from topology if it is
defined. Earlier the value from topology was omitted for
capture.

If not defined, the maximum burst size for capture is set
similarly as before to one millisecond.

The dma_buffer_size is set similarly as for playback from
largest of deep_buffer_dma_ms or SOF_IPC4_MIN_DMA_BUFFER_SIZE
times OBS.

Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20260522075659.2645-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4-topology.c

index d2a2617887941eb2a86005e5dad4a504f0822a97..f61ed271f23b212e103f2f1a3229614b7bf8d25a 100644 (file)
@@ -642,6 +642,7 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
        struct sof_ipc4_available_audio_format *available_fmt;
        struct snd_soc_component *scomp = swidget->scomp;
        struct sof_ipc4_copier *ipc4_copier;
+       struct snd_sof_pcm_stream *sps;
        struct snd_sof_pcm *spcm;
        int node_type = 0;
        int ret, dir;
@@ -686,24 +687,23 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
        if (ret)
                goto free_available_fmt;
 
-       if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
-               struct snd_sof_pcm_stream *sps = &spcm->stream[dir];
+       sps = &spcm->stream[dir];
+       sof_update_ipc_object(scomp, &sps->dsp_max_burst_size_in_ms,
+                             SOF_COPIER_DEEP_BUFFER_TOKENS,
+                             swidget->tuples,
+                             swidget->num_tuples, sizeof(u32), 1);
 
-               sof_update_ipc_object(scomp, &sps->dsp_max_burst_size_in_ms,
-                                     SOF_COPIER_DEEP_BUFFER_TOKENS,
-                                     swidget->tuples,
-                                     swidget->num_tuples, sizeof(u32), 1);
-               /* Set default DMA buffer size if it is not specified in topology */
-               if (!sps->dsp_max_burst_size_in_ms) {
-                       struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
-                       struct sof_ipc4_pipeline *pipeline = pipe_widget->private;
+       /* Set default DMA buffer size if it is not specified in topology */
+       if (!sps->dsp_max_burst_size_in_ms) {
+               struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
+               struct sof_ipc4_pipeline *pipeline = pipe_widget->private;
 
+               if (dir == SNDRV_PCM_STREAM_PLAYBACK)
                        sps->dsp_max_burst_size_in_ms = pipeline->use_chain_dma ?
                                SOF_IPC4_CHAIN_DMA_BUFFER_SIZE : SOF_IPC4_MIN_DMA_BUFFER_SIZE;
-               }
-       } else {
-               /* Capture data is copied from DSP to host in 1ms bursts */
-               spcm->stream[dir].dsp_max_burst_size_in_ms = 1;
+               else
+                       /* Capture data is copied from DSP to host in 1ms bursts */
+                       sps->dsp_max_burst_size_in_ms = 1;
        }
 
 skip_gtw_cfg:
@@ -2442,10 +2442,19 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
                        copier_data->gtw_cfg.dma_buffer_size);
                break;
        case snd_soc_dapm_dai_out:
-       case snd_soc_dapm_aif_out:
                copier_data->gtw_cfg.dma_buffer_size =
                        SOF_IPC4_MIN_DMA_BUFFER_SIZE * copier_data->base_config.obs;
                break;
+       case snd_soc_dapm_aif_out:
+               copier_data->gtw_cfg.dma_buffer_size =
+                       max((u32)SOF_IPC4_MIN_DMA_BUFFER_SIZE, deep_buffer_dma_ms) *
+                               copier_data->base_config.obs;
+               dev_dbg(sdev->dev, "copier %s, dma buffer%s: %u ms (%u bytes)",
+                       swidget->widget->name,
+                       deep_buffer_dma_ms ? " (using Deep Buffer)" : "",
+                       max((u32)SOF_IPC4_MIN_DMA_BUFFER_SIZE, deep_buffer_dma_ms),
+                       copier_data->gtw_cfg.dma_buffer_size);
+               break;
        default:
                break;
        }