ASoC: SOF: make dma_config_tlv be an array
authorBard Liao <yung-chuan.liao@linux.intel.com>
Tue, 2 Apr 2024 15:18:15 +0000 (10:18 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 2 Apr 2024 16:14:45 +0000 (17:14 +0100)
Each stream needs a dma_config_tlv. We will handle multi dma_config_tlv
in the follow up commits.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://msgid.link/r/20240402151828.175002-5-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-dai.c
sound/soc/sof/ipc4-topology.c
sound/soc/sof/ipc4-topology.h

index 6a39ca632f55e4835d472c18626cd7dcc5173d7a..01c544b7e04673bc1fd5cccc8d9f3f389bac1e37 100644 (file)
@@ -392,7 +392,7 @@ static int non_hda_dai_hw_params(struct snd_pcm_substream *substream,
        /* configure TLV */
        ipc4_copier = widget_to_copier(w);
 
-       dma_config_tlv = &ipc4_copier->dma_config_tlv;
+       dma_config_tlv = &ipc4_copier->dma_config_tlv[0];
        dma_config_tlv->type = SOF_IPC4_GTW_DMA_CONFIG_ID;
        /* dma_config_priv_size is zero */
        dma_config_tlv->length = sizeof(dma_config_tlv->dma_config);
index da4a83afb87a8a2c4163f34a8d6e9993b92bde77..1e9276b9b35ce7c7db0ffeae11e5bbecb7b142f3 100644 (file)
@@ -1454,6 +1454,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
        u32 deep_buffer_dma_ms = 0;
        int output_fmt_index;
        bool single_output_format;
+       int i;
 
        dev_dbg(sdev->dev, "copier %s, type %d", swidget->widget->name, swidget->id);
 
@@ -1679,7 +1680,6 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
                        u32 ch_map;
                        u32 step;
                        u32 mask;
-                       int i;
 
                        blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config;
 
@@ -1789,19 +1789,18 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
        gtw_cfg_config_length = copier_data->gtw_cfg.config_length * 4;
        ipc_size = sizeof(*copier_data) + gtw_cfg_config_length;
 
-       if (ipc4_copier->dma_config_tlv.type == SOF_IPC4_GTW_DMA_CONFIG_ID &&
-           ipc4_copier->dma_config_tlv.length) {
-               dma_config_tlv_size = sizeof(ipc4_copier->dma_config_tlv) +
-                       ipc4_copier->dma_config_tlv.dma_config.dma_priv_config_size;
-
-               /* paranoia check on TLV size/length */
-               if (dma_config_tlv_size != ipc4_copier->dma_config_tlv.length +
-                   sizeof(uint32_t) * 2) {
-                       dev_err(sdev->dev, "Invalid configuration, TLV size %d length %d\n",
-                               dma_config_tlv_size, ipc4_copier->dma_config_tlv.length);
-                       return -EINVAL;
-               }
+       dma_config_tlv_size = 0;
+       for (i = 0; i < SOF_IPC4_DMA_DEVICE_MAX_COUNT; i++) {
+               if (ipc4_copier->dma_config_tlv[i].type != SOF_IPC4_GTW_DMA_CONFIG_ID)
+                       continue;
+               dma_config_tlv_size += ipc4_copier->dma_config_tlv[i].length;
+               dma_config_tlv_size +=
+                       ipc4_copier->dma_config_tlv[i].dma_config.dma_priv_config_size;
+               dma_config_tlv_size += (sizeof(ipc4_copier->dma_config_tlv[i]) -
+                       sizeof(ipc4_copier->dma_config_tlv[i].dma_config));
+       }
 
+       if (dma_config_tlv_size) {
                ipc_size += dma_config_tlv_size;
 
                /* we also need to increase the size at the gtw level */
index dce174a190ddc630068ee5c6393a83dfb2dd2d05..aa5122c3721d3a7d7ea72408fe81ea2a5a9a24d9 100644 (file)
@@ -313,7 +313,7 @@ struct sof_ipc4_copier {
        struct sof_ipc4_gtw_attributes *gtw_attr;
        u32 dai_type;
        int dai_index;
-       struct sof_ipc4_dma_config_tlv dma_config_tlv;
+       struct sof_ipc4_dma_config_tlv dma_config_tlv[SOF_IPC4_DMA_DEVICE_MAX_COUNT];
 };
 
 /**