Unverified Commit 3f70c360 authored by Daniel Baluta's avatar Daniel Baluta Committed by Mark Brown
Browse files

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 reserved pool in order to store
the extended data length. This is compatible with older FWs where
there was no extended data.

Signed-off-by: default avatarDaniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20220712141531.14599-3-daniel.baluta@oss.nxp.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d5770dae
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -86,9 +86,11 @@ struct sof_ipc_stream_params {
	uint32_t host_period_bytes;
	uint16_t no_stream_position; /**< 1 means don't send stream position */
	uint8_t cont_update_posn; /**< 1 means continuous update stream position */

	uint8_t reserved[5];
	uint8_t reserved0;
	int16_t ext_data_length; /**< 0, means no extended data */
	uint8_t reserved[2];
	uint16_t chmap[SOF_IPC_MAX_CHANNELS];	/**< channel map - SOF_CHMAP_ */
	uint8_t ext_data[]; /**< extended data */
} __packed;

/* PCM params info - SOF_IPC_STREAM_PCM_PARAMS */
+13 −4
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ static int sof_compr_set_params(struct snd_soc_component *component,
	struct snd_compr_tstamp *tstamp;
	struct sof_ipc_pcm_params *pcm;
	struct snd_sof_pcm *spcm;
	size_t ext_data_size;
	int ret;

	tstamp = crtd->private_data;
@@ -179,7 +180,12 @@ static int sof_compr_set_params(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
	ext_data_size = sizeof(params->codec);

	if (sizeof(*pcm) + ext_data_size > sdev->ipc->max_payload_size)
		return -EINVAL;

	pcm = kzalloc(sizeof(*pcm) + ext_data_size, GFP_KERNEL);
	if (!pcm)
		return -ENOMEM;

@@ -194,11 +200,11 @@ static int sof_compr_set_params(struct snd_soc_component *component,
		goto out;

	pcm->params.buffer.pages = PFN_UP(crtd->dma_bytes);
	pcm->hdr.size = sizeof(*pcm);
	pcm->hdr.size = sizeof(*pcm) + ext_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) + ext_data_size;
	pcm->params.buffer.phy_addr = spcm->stream[cstream->direction].page_table.addr;
	pcm->params.buffer.size = crtd->dma_bytes;
	pcm->params.direction = cstream->direction;
@@ -209,8 +215,11 @@ static 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 = ext_data_size;

	memcpy((u8 *)pcm->params.ext_data, &params->codec, ext_data_size);

	ret = sof_ipc_tx_message(sdev->ipc, pcm, sizeof(*pcm),
	ret = sof_ipc_tx_message(sdev->ipc, pcm, sizeof(*pcm) + ext_data_size,
				 &ipc_params_reply, sizeof(ipc_params_reply));
	if (ret < 0) {
		dev_err(component->dev, "error ipc failed\n");