diff options
author | Daniel Baluta <daniel.baluta@nxp.com> | 2022-05-03 11:38:50 +0300 |
---|---|---|
committer | Daniel Baluta <daniel.baluta@nxp.com> | 2022-05-03 16:41:46 +0300 |
commit | ed3cd714974f6655ce4d3edf913ea14851d139a9 (patch) | |
tree | efab64c016110789c872207b0704c03f3ec063de /sound/soc/sof | |
parent | 7c733e0cee086ea100bb7db319c6800aeab6eb0d (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.c | 17 |
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, ¶ms->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); |