Skip to content

Commit

Permalink
ASoC: SOF: ipc4-topology: Allocate ref_params on stack
Browse files Browse the repository at this point in the history
Currently the compiler (clang 19.1.7) is not happy about the size of
the stack frame in sof_ipc4_prepare_copier_module:

sound/soc/sof/ipc4-topology.c:1800:1: error: stack frame size (1288) exceeds limit (1024) in 'sof_ipc4_prepare_copier_module' [-Werror,-Wframe-larger-than]
 1800 | sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
      | ^

Work around this by allocating ref_params on stack, as it looks the biggest
variable on stack right now.

Note, this only happens when compile for 32-bit machines (x86_32 in my case).

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20250312160516.3864295-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Andy Shevchenko authored and Mark Brown committed Mar 13, 2025
1 parent 87fa872 commit a935b3f
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions sound/soc/sof/ipc4-topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//
//
#include <linux/bitfield.h>
#include <linux/cleanup.h>
#include <uapi/sound/sof/tokens.h>
#include <sound/pcm_params.h>
#include <sound/sof/ext_manifest4.h>
Expand Down Expand Up @@ -1807,8 +1808,8 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
struct sof_ipc4_copier_data *copier_data;
int input_fmt_index, output_fmt_index;
struct snd_pcm_hw_params ref_params;
struct sof_ipc4_copier *ipc4_copier;
struct snd_pcm_hw_params *ref_params __free(kfree) = NULL;
struct snd_sof_dai *dai;
u32 gtw_cfg_config_length;
u32 dma_config_tlv_size = 0;
Expand Down Expand Up @@ -1885,9 +1886,11 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
* for capture.
*/
if (dir == SNDRV_PCM_STREAM_PLAYBACK)
ref_params = *fe_params;
ref_params = kmemdup(fe_params, sizeof(*ref_params), GFP_KERNEL);
else
ref_params = *pipeline_params;
ref_params = kmemdup(pipeline_params, sizeof(*ref_params), GFP_KERNEL);
if (!ref_params)
return -ENOMEM;

copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK;
copier_data->gtw_cfg.node_id |=
Expand Down Expand Up @@ -1924,8 +1927,11 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
* In case of capture the ref_params returned will be used to
* find the input configuration of the copier.
*/
ref_params = *fe_params;
ret = sof_ipc4_prepare_dai_copier(sdev, dai, &ref_params, dir);
ref_params = kmemdup(fe_params, sizeof(*ref_params), GFP_KERNEL);
if (!ref_params)
return -ENOMEM;

ret = sof_ipc4_prepare_dai_copier(sdev, dai, ref_params, dir);
if (ret < 0)
return ret;

Expand All @@ -1934,7 +1940,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
* input configuration of the copier.
*/
if (dir == SNDRV_PCM_STREAM_PLAYBACK)
ref_params = *pipeline_params;
memcpy(ref_params, pipeline_params, sizeof(*ref_params));

break;
}
Expand All @@ -1946,7 +1952,10 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
ipc4_copier = (struct sof_ipc4_copier *)swidget->private;
copier_data = &ipc4_copier->data;
available_fmt = &ipc4_copier->available_fmt;
ref_params = *pipeline_params;

ref_params = kmemdup(pipeline_params, sizeof(*ref_params), GFP_KERNEL);
if (!ref_params)
return -ENOMEM;

break;
}
Expand All @@ -1959,7 +1968,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
/* set input and output audio formats */
input_fmt_index = sof_ipc4_init_input_audio_fmt(sdev, swidget,
&copier_data->base_config,
&ref_params, available_fmt);
ref_params, available_fmt);
if (input_fmt_index < 0)
return input_fmt_index;

Expand Down

0 comments on commit a935b3f

Please sign in to comment.