Unverified Commit a35551a3 authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: Intel: avs: Set of streaming fixes

Merge series from Cezary Rojewski <cezary.rojewski@intel.com>:

Small set of patches two of which fix problems observed during shutdown
and XRUN scenarios for PCM streaming. These ensure HDAudio HOST stream
is reset and re-setup during XRUNs and synchronize avs_dai_fe_shutdown()
and period-elapsed work (thread) so that no slab-use-after-free panics
occur.

The last change makes the 'format' parameter provided by a
compress-application taken into account - currently its ignored. Such
approach helps us increase the coverage of data probing (debug)
functionality.
parents 79a6f2da 64007ad3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -651,6 +651,7 @@ static void avs_dai_fe_shutdown(struct snd_pcm_substream *substream, struct snd_

	data = snd_soc_dai_get_dma_data(dai, substream);

	disable_work_sync(&data->period_elapsed_work);
	snd_hdac_ext_stream_release(data->host_stream, HDAC_EXT_STREAM_TYPE_HOST);
	avs_dai_shutdown(substream, dai);
}
@@ -754,6 +755,8 @@ static int avs_dai_fe_prepare(struct snd_pcm_substream *substream, struct snd_so
	data = snd_soc_dai_get_dma_data(dai, substream);
	host_stream = data->host_stream;

	if (runtime->state == SNDRV_PCM_STATE_XRUN)
		hdac_stream(host_stream)->prepared = false;
	if (hdac_stream(host_stream)->prepared)
		return 0;

+10 −8
Original line number Diff line number Diff line
@@ -14,8 +14,8 @@
#include "debug.h"
#include "messages.h"

static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id node_id,
			      size_t buffer_size)
static int avs_dsp_init_probe(struct avs_dev *adev, struct snd_compr_params *params, int bps,
			      union avs_connector_node_id node_id, size_t buffer_size)
{
	struct avs_probe_cfg cfg = {{0}};
	struct avs_module_entry mentry;
@@ -27,12 +27,16 @@ static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id
		return ret;

	/*
	 * Probe module uses no cycles, audio data format and input and output
	 * frame sizes are unused. It is also not owned by any pipeline.
	 * Probe module uses no cycles, input and output frame sizes are unused.
	 * It is also not owned by any pipeline.
	 */
	cfg.base.ibs = 1;
	/* BSS module descriptor is always segment of index=2. */
	cfg.base.is_pages = mentry.segments[2].flags.length;
	cfg.base.audio_fmt.sampling_freq = params->codec.sample_rate;
	cfg.base.audio_fmt.bit_depth = bps;
	cfg.base.audio_fmt.num_channels = params->codec.ch_out;
	cfg.base.audio_fmt.valid_bit_depth = bps;
	cfg.gtw_cfg.node_id = node_id;
	cfg.gtw_cfg.dma_buffer_size = buffer_size;

@@ -128,8 +132,6 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
	struct hdac_ext_stream *host_stream = avs_compr_get_host_stream(cstream);
	struct snd_compr_runtime *rtd = cstream->runtime;
	struct avs_dev *adev = to_avs_dev(dai->dev);
	/* compr params do not store bit depth, default to S32_LE. */
	snd_pcm_format_t format = SNDRV_PCM_FORMAT_S32_LE;
	unsigned int format_val;
	int bps, ret;

@@ -142,7 +144,7 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
	ret = snd_compr_malloc_pages(cstream, rtd->buffer_size);
	if (ret < 0)
		return ret;
	bps = snd_pcm_format_physical_width(format);
	bps = snd_pcm_format_physical_width(params->codec.format);
	if (bps < 0)
		return bps;
	format_val = snd_hdac_stream_format(params->codec.ch_out, bps, params->codec.sample_rate);
@@ -166,7 +168,7 @@ static int avs_probe_compr_set_params(struct snd_compr_stream *cstream,
		node_id.vindex = hdac_stream(host_stream)->stream_tag - 1;
		node_id.dma_type = AVS_DMA_HDA_HOST_INPUT;

		ret = avs_dsp_init_probe(adev, node_id, rtd->dma_bytes);
		ret = avs_dsp_init_probe(adev, params, bps, node_id, rtd->dma_bytes);
		if (ret < 0) {
			dev_err(dai->dev, "probe init failed: %d\n", ret);
			avs_dsp_enable_d0ix(adev);
+1 −0
Original line number Diff line number Diff line
@@ -313,6 +313,7 @@ struct asoc_sdw_codec_info codec_info_list[] = {
	},
	{
		.part_id = 0x1321,
		.name_prefix = "rt1320",
		.dais = {
			{
				.direction = {true, false},