summaryrefslogtreecommitdiff
path: root/sound/soc/sof
diff options
context:
space:
mode:
authorDaniel Baluta <daniel.baluta@nxp.com>2022-05-03 11:38:50 +0300
committerDaniel Baluta <daniel.baluta@nxp.com>2022-05-03 16:41:46 +0300
commited3cd714974f6655ce4d3edf913ea14851d139a9 (patch)
treeefab64c016110789c872207b0704c03f3ec063de /sound/soc/sof
parent7c733e0cee086ea100bb7db319c6800aeab6eb0d (diff)
LF-5980-6 ASoC: SOF: Copy compress parameters into extended data
Allocate memory at the end of sof_ipc_stream_params to store snd_compr_params in order to be sent them to SOF firmware. This will help firmware correctly configure codecs parameters. Notice, that we use 2 bytes from the reseved pool in order to store the extended data length. This is compatible with older FWs where there was no extended data. Reviwed-by: Paul Olaru <paul.olaru@nxp.com> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Diffstat (limited to 'sound/soc/sof')
-rw-r--r--sound/soc/sof/compress.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sound/soc/sof/compress.c b/sound/soc/sof/compress.c
index 7ebc9f4109a9..565b4385c0ad 100644
--- a/sound/soc/sof/compress.c
+++ b/sound/soc/sof/compress.c
@@ -164,16 +164,22 @@ int sof_compr_set_params(struct snd_soc_component *component,
struct sof_ipc_pcm_params_reply ipc_params_reply;
struct sof_ipc_pcm_params *pcm;
struct snd_sof_pcm *spcm;
+ int data_size;
int ret;
spcm = snd_sof_find_spcm_dai(component, rtd_pcm);
if (!spcm)
return -EINVAL;
- pcm = kzalloc(GFP_KERNEL, sizeof(*pcm));
+ data_size = sizeof(params->codec);
+
+ pcm = kzalloc(GFP_KERNEL, sizeof(*pcm) + data_size);
if (!pcm)
return -ENOMEM;
+ if (data_size + sizeof(*pcm) > SOF_IPC_MSG_MAX_SIZE)
+ return -EINVAL;
+
cstream->dma_buffer.dev.type = SNDRV_DMA_TYPE_DEV_SG;
cstream->dma_buffer.dev.dev = sdev->dev;
ret = snd_compr_malloc_pages(cstream, rtd->buffer_size);
@@ -183,11 +189,11 @@ int sof_compr_set_params(struct snd_soc_component *component,
create_page_table(component, cstream, rtd->dma_area, rtd->dma_bytes);
pcm->params.buffer.pages = PFN_UP(rtd->dma_bytes);
- pcm->hdr.size = sizeof(*pcm);
+ pcm->hdr.size = sizeof(*pcm) + data_size;
pcm->hdr.cmd = SOF_IPC_GLB_STREAM_MSG | SOF_IPC_STREAM_PCM_PARAMS;
pcm->comp_id = spcm->stream[cstream->direction].comp_id;
- pcm->params.hdr.size = sizeof(pcm->params);
+ pcm->params.hdr.size = sizeof(pcm->params) + data_size;
pcm->params.buffer.phy_addr = spcm->stream[cstream->direction].page_table.addr;
pcm->params.buffer.size = rtd->dma_bytes;
pcm->params.direction = cstream->direction;
@@ -198,8 +204,11 @@ int sof_compr_set_params(struct snd_soc_component *component,
pcm->params.sample_container_bytes =
snd_pcm_format_physical_width(SNDRV_PCM_FORMAT_S32) >> 3;
pcm->params.host_period_bytes = params->buffer.fragment_size;
+ pcm->params.ext_data_length = data_size;
+
+ memcpy((u8*)pcm->params.data, &params->codec, data_size);
- ret = sof_ipc_tx_message(sdev->ipc, pcm->hdr.cmd, pcm, sizeof(*pcm),
+ ret = sof_ipc_tx_message(sdev->ipc, pcm->hdr.cmd, pcm, sizeof(*pcm) + data_size,
&ipc_params_reply, sizeof(ipc_params_reply));
if (ret < 0) {
kfree(pcm);