ASoC: SOF: ipc4-topology: Correct data structures for the SRC module
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 29 Nov 2023 13:14:10 +0000 (15:14 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 20 Jan 2024 10:51:40 +0000 (11:51 +0100)
[ Upstream commit c447636970e3409ac39f0bb8c2dcff6b726f36b0 ]

Separate the IPC message part as struct sof_ipc4_src_data. This struct
describes the message payload passed to the firmware via the mailbox.

It is not wise to be 'clever' and try to use the first part of a struct
as IPC message without marking the message section as packed and aligned.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20231129131411.27516-2-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/sof/ipc4-topology.c
sound/soc/sof/ipc4-topology.h

index 05c3b11..42f6a99 100644 (file)
@@ -139,7 +139,7 @@ static const struct sof_topology_token gain_tokens[] = {
 /* SRC */
 static const struct sof_topology_token src_tokens[] = {
        {SOF_TKN_SRC_RATE_OUT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
-               offsetof(struct sof_ipc4_src, sink_rate)},
+               offsetof(struct sof_ipc4_src_data, sink_rate)},
 };
 
 static const struct sof_token_info ipc4_token_list[SOF_TOKEN_COUNT] = {
@@ -812,11 +812,12 @@ static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget)
 
        swidget->private = src;
 
-       ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, &src->base_config);
+       ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt,
+                                    &src->data.base_config);
        if (ret)
                goto err;
 
-       ret = sof_update_ipc_object(scomp, src, SOF_SRC_TOKENS, swidget->tuples,
+       ret = sof_update_ipc_object(scomp, &src->data, SOF_SRC_TOKENS, swidget->tuples,
                                    swidget->num_tuples, sizeof(*src), 1);
        if (ret) {
                dev_err(scomp->dev, "Parsing SRC tokens failed\n");
@@ -825,7 +826,7 @@ static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget)
 
        spipe->core_mask |= BIT(swidget->core);
 
-       dev_dbg(scomp->dev, "SRC sink rate %d\n", src->sink_rate);
+       dev_dbg(scomp->dev, "SRC sink rate %d\n", src->data.sink_rate);
 
        ret = sof_ipc4_widget_setup_msg(swidget, &src->msg);
        if (ret)
@@ -1896,7 +1897,7 @@ static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
        u32 out_ref_rate, out_ref_channels, out_ref_valid_bits;
        int output_format_index, input_format_index;
 
-       input_format_index = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->base_config,
+       input_format_index = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->data.base_config,
                                                           pipeline_params, available_fmt);
        if (input_format_index < 0)
                return input_format_index;
@@ -1926,7 +1927,7 @@ static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
         */
        out_ref_rate = params_rate(fe_params);
 
-       output_format_index = sof_ipc4_init_output_audio_fmt(sdev, &src->base_config,
+       output_format_index = sof_ipc4_init_output_audio_fmt(sdev, &src->data.base_config,
                                                             available_fmt, out_ref_rate,
                                                             out_ref_channels, out_ref_valid_bits);
        if (output_format_index < 0) {
@@ -1936,10 +1937,10 @@ static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
        }
 
        /* update pipeline memory usage */
-       sof_ipc4_update_resource_usage(sdev, swidget, &src->base_config);
+       sof_ipc4_update_resource_usage(sdev, swidget, &src->data.base_config);
 
        out_audio_fmt = &available_fmt->output_pin_fmts[output_format_index].audio_fmt;
-       src->sink_rate = out_audio_fmt->sampling_frequency;
+       src->data.sink_rate = out_audio_fmt->sampling_frequency;
 
        /* update pipeline_params for sink widgets */
        return sof_ipc4_update_hw_params(sdev, pipeline_params, out_audio_fmt);
@@ -2297,8 +2298,8 @@ static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget
        {
                struct sof_ipc4_src *src = swidget->private;
 
-               ipc_size = sizeof(struct sof_ipc4_base_module_cfg) + sizeof(src->sink_rate);
-               ipc_data = src;
+               ipc_size = sizeof(src->data);
+               ipc_data = &src->data;
 
                msg = &src->msg;
                break;
index d75f17f..f96536d 100644 (file)
@@ -387,16 +387,24 @@ struct sof_ipc4_mixer {
        struct sof_ipc4_msg msg;
 };
 
-/**
- * struct sof_ipc4_src SRC config data
+/*
+ * struct sof_ipc4_src_data - IPC data for SRC
  * @base_config: IPC base config data
  * @sink_rate: Output rate for sink module
+ */
+struct sof_ipc4_src_data {
+       struct sof_ipc4_base_module_cfg base_config;
+       uint32_t sink_rate;
+} __packed __aligned(4);
+
+/**
+ * struct sof_ipc4_src - SRC config data
+ * @data: IPC base config data
  * @available_fmt: Available audio format
  * @msg: IPC4 message struct containing header and data info
  */
 struct sof_ipc4_src {
-       struct sof_ipc4_base_module_cfg base_config;
-       uint32_t sink_rate;
+       struct sof_ipc4_src_data data;
        struct sof_ipc4_available_audio_format available_fmt;
        struct sof_ipc4_msg msg;
 };