Unverified Commit 86069318 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: pcm: Add snd_sof_pcm specific wrappers for dev_dbg() and dev_err()



Introduce spcm_dbg() and spcm_err() macros to provide consistent printing
for debug and error messages which includes usable information in the
print's prefix.

Update the prints in pcm.c, ipc3-pcm.c and ipc4-pcm.c to take advantage of
the features provided by the macros.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarLiam Girdwood <liam.r.girdwood@intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://patch.msgid.link/20250206092828.7569-4-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 4d2ea165
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -117,13 +117,15 @@ static int sof_ipc3_pcm_hw_params(struct snd_soc_component *component,
	if (platform_params->cont_update_posn)
		pcm.params.cont_update_posn = 1;

	dev_dbg(component->dev, "stream_tag %d", pcm.params.stream_tag);
	spcm_dbg(spcm, substream->stream, "stream_tag %d\n",
		 pcm.params.stream_tag);

	/* send hw_params IPC to the DSP */
	ret = sof_ipc_tx_message(sdev->ipc, &pcm, sizeof(pcm),
				 &ipc_params_reply, sizeof(ipc_params_reply));
	if (ret < 0) {
		dev_err(component->dev, "HW params ipc failed for stream %d\n",
		spcm_err(spcm, substream->stream,
			 "STREAM_PCM_PARAMS ipc failed for stream_tag %d\n",
			 pcm.params.stream_tag);
		return ret;
	}
@@ -131,8 +133,7 @@ static int sof_ipc3_pcm_hw_params(struct snd_soc_component *component,
	ret = snd_sof_set_stream_data_offset(sdev, &spcm->stream[substream->stream],
					     ipc_params_reply.posn_offset);
	if (ret < 0) {
		dev_err(component->dev, "%s: invalid stream data offset for PCM %d\n",
			__func__, spcm->pcm.pcm_id);
		spcm_err(spcm, substream->stream, "invalid stream data offset\n");
		return ret;
	}

@@ -171,7 +172,7 @@ static int sof_ipc3_pcm_trigger(struct snd_soc_component *component,
		stream.hdr.cmd |= SOF_IPC_STREAM_TRIG_STOP;
		break;
	default:
		dev_err(component->dev, "Unhandled trigger cmd %d\n", cmd);
		spcm_err(spcm, substream->stream, "Unhandled trigger cmd %d\n", cmd);
		return -EINVAL;
	}

+9 −7
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ static int sof_ipc4_chain_dma_trigger(struct snd_sof_dev *sdev,
		set_fifo_size = false;
		break;
	default:
		dev_err(sdev->dev, "Unexpected state %d", state);
		spcm_err(spcm, direction, "Unexpected pipeline state %d\n", state);
		return -EINVAL;
	}

@@ -333,8 +333,8 @@ static int sof_ipc4_chain_dma_trigger(struct snd_sof_dev *sdev,
		struct sof_ipc4_pipeline *pipeline = pipe_widget->private;

		if (!pipeline->use_chain_dma) {
			dev_err(sdev->dev,
				"All pipelines in chained DMA stream should have use_chain_dma attribute set.");
			spcm_err(spcm, direction,
				 "All pipelines in chained DMA path should have use_chain_dma attribute set.");
			return -EINVAL;
		}

@@ -389,12 +389,12 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
	int ret;
	int i;

	dev_dbg(sdev->dev, "trigger cmd: %d state: %d\n", cmd, state);

	spcm = snd_sof_find_spcm_dai(component, rtd);
	if (!spcm)
		return -EINVAL;

	spcm_dbg(spcm, substream->stream, "cmd: %d, state: %d\n", cmd, state);

	pipeline_list = &spcm->stream[substream->stream].pipeline_list;

	/* nothing to trigger if the list is empty */
@@ -465,7 +465,7 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
	 */
	ret = sof_ipc4_set_multi_pipeline_state(sdev, SOF_IPC4_PIPE_PAUSED, trigger_list);
	if (ret < 0) {
		dev_err(sdev->dev, "failed to pause all pipelines\n");
		spcm_err(spcm, substream->stream, "failed to pause all pipelines\n");
		goto free;
	}

@@ -494,7 +494,9 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
	/* else set the RUNNING/RESET state in the DSP */
	ret = sof_ipc4_set_multi_pipeline_state(sdev, state, trigger_list);
	if (ret < 0) {
		dev_err(sdev->dev, "failed to set final state %d for all pipelines\n", state);
		spcm_err(spcm, substream->stream,
			 "failed to set final state %d for all pipelines\n",
			 state);
		/*
		 * workaround: if the firmware is crashed while setting the
		 * pipelines to reset state we must ignore the error code and
+42 −53
Original line number Diff line number Diff line
@@ -99,8 +99,8 @@ sof_pcm_setup_connected_widgets(struct snd_sof_dev *sdev, struct snd_soc_pcm_run
		ret = snd_soc_dapm_dai_get_connected_widgets(dai, dir, &list,
							     dpcm_end_walk_at_be);
		if (ret < 0) {
			dev_err(sdev->dev, "error: dai %s has no valid %s path\n", dai->name,
				snd_pcm_direction_name(dir));
			spcm_err(spcm, dir, "dai %s has no valid %s path\n",
				 dai->name, snd_pcm_direction_name(dir));
			return ret;
		}

@@ -108,8 +108,7 @@ sof_pcm_setup_connected_widgets(struct snd_sof_dev *sdev, struct snd_soc_pcm_run

		ret = sof_widget_list_setup(sdev, spcm, params, platform_params, dir);
		if (ret < 0) {
			dev_err(sdev->dev, "error: failed widget list set up for pcm %d dir %d\n",
				spcm->pcm.pcm_id, dir);
			spcm_err(spcm, dir, "Widget list set up failed\n");
			spcm->stream[dir].list = NULL;
			snd_soc_dapm_dai_free_widgets(&list);
			return ret;
@@ -139,6 +138,8 @@ static int sof_pcm_hw_params(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	spcm_dbg(spcm, substream->stream, "Entry: hw_params\n");

	/*
	 * Handle repeated calls to hw_params() without free_pcm() in
	 * between. At least ALSA OSS emulation depends on this.
@@ -151,12 +152,9 @@ static int sof_pcm_hw_params(struct snd_soc_component *component,
		spcm->prepared[substream->stream] = false;
	}

	dev_dbg(component->dev, "pcm: hw params stream %d dir %d\n",
		spcm->pcm.pcm_id, substream->stream);

	ret = snd_sof_pcm_platform_hw_params(sdev, substream, params, &platform_params);
	if (ret < 0) {
		dev_err(component->dev, "platform hw params failed\n");
		spcm_err(spcm, substream->stream, "platform hw params failed\n");
		return ret;
	}

@@ -210,8 +208,8 @@ static int sof_pcm_stream_free(struct snd_sof_dev *sdev,
		if (pcm_ops && pcm_ops->hw_free) {
			ret = pcm_ops->hw_free(sdev->component, substream);
			if (ret < 0) {
				dev_err(sdev->dev, "%s: pcm_ops hw_free failed %d\n",
					__func__, ret);
				spcm_err(spcm, substream->stream,
					 "pcm_ops->hw_free failed %d\n", ret);
				err = ret;
			}
		}
@@ -223,8 +221,8 @@ static int sof_pcm_stream_free(struct snd_sof_dev *sdev,
	/* reset the DMA */
	ret = snd_sof_pcm_platform_hw_free(sdev, substream);
	if (ret < 0) {
		dev_err(sdev->dev, "%s: platform hw free failed %d\n",
			__func__, ret);
		spcm_err(spcm, substream->stream,
			 "platform hw free failed %d\n", ret);
		if (!err)
			err = ret;
	}
@@ -233,8 +231,8 @@ static int sof_pcm_stream_free(struct snd_sof_dev *sdev,
	if (free_widget_list) {
		ret = sof_widget_list_free(sdev, spcm, dir);
		if (ret < 0) {
			dev_err(sdev->dev, "%s: sof_widget_list_free failed %d\n",
				__func__, ret);
			spcm_err(spcm, substream->stream,
				 "sof_widget_list_free failed %d\n", ret);
			if (!err)
				err = ret;
		}
@@ -285,8 +283,7 @@ static int sof_pcm_hw_free(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	dev_dbg(component->dev, "pcm: free stream %d dir %d\n",
		spcm->pcm.pcm_id, substream->stream);
	spcm_dbg(spcm, substream->stream, "Entry: hw_free\n");

	ret = sof_pcm_stream_free(sdev, substream, spcm, substream->stream, true);

@@ -311,6 +308,8 @@ static int sof_pcm_prepare(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	spcm_dbg(spcm, substream->stream, "Entry: prepare\n");

	if (spcm->prepared[substream->stream]) {
		if (!spcm->pending_stop[substream->stream])
			return 0;
@@ -324,15 +323,12 @@ static int sof_pcm_prepare(struct snd_soc_component *component,
			return ret;
	}

	dev_dbg(component->dev, "pcm: prepare stream %d dir %d\n",
		spcm->pcm.pcm_id, substream->stream);

	/* set hw_params */
	ret = sof_pcm_hw_params(component,
				substream, &spcm->params[substream->stream]);
	if (ret < 0) {
		dev_err(component->dev,
			"error: set pcm hw_params after resume\n");
		spcm_err(spcm, substream->stream,
			 "failed to set hw_params after resume\n");
		return ret;
	}

@@ -362,8 +358,7 @@ static int sof_pcm_trigger(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	dev_dbg(component->dev, "pcm: trigger stream %d dir %d cmd %d\n",
		spcm->pcm.pcm_id, substream->stream, cmd);
	spcm_dbg(spcm, substream->stream, "Entry: trigger (cmd: %d)\n", cmd);

	spcm->pending_stop[substream->stream] = false;

@@ -412,7 +407,7 @@ static int sof_pcm_trigger(struct snd_soc_component *component,
			reset_hw_params = true;
		break;
	default:
		dev_err(component->dev, "Unhandled trigger cmd %d\n", cmd);
		spcm_err(spcm, substream->stream, "Unhandled trigger cmd %d\n", cmd);
		return -EINVAL;
	}

@@ -514,9 +509,7 @@ static int sof_pcm_open(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	dev_dbg(component->dev, "pcm: open stream %d dir %d\n",
		spcm->pcm.pcm_id, substream->stream);

	spcm_dbg(spcm, substream->stream, "Entry: open\n");

	caps = &spcm->pcm.caps[substream->stream];

@@ -546,18 +539,16 @@ static int sof_pcm_open(struct snd_soc_component *component,

	ret = snd_sof_pcm_platform_open(sdev, substream);
	if (ret < 0) {
		dev_err(component->dev, "error: pcm open failed %d\n", ret);
		spcm_err(spcm, substream->stream,
			 "platform pcm open failed %d\n", ret);
		return ret;
	}

	dev_dbg(component->dev, "period bytes min %zd, max %zd\n",
		runtime->hw.period_bytes_min,
		runtime->hw.period_bytes_max);
	dev_dbg(component->dev, "period count min %d, max %d\n",
		runtime->hw.periods_min,
		runtime->hw.periods_max);
	dev_dbg(component->dev, "buffer bytes max %zd\n",
		runtime->hw.buffer_bytes_max);
	spcm_dbg(spcm, substream->stream, "period bytes min %zd, max %zd\n",
		 runtime->hw.period_bytes_min, runtime->hw.period_bytes_max);
	spcm_dbg(spcm, substream->stream, "period count min %d, max %d\n",
		 runtime->hw.periods_min, runtime->hw.periods_max);
	spcm_dbg(spcm, substream->stream, "buffer bytes max %zd\n", runtime->hw.buffer_bytes_max);

	return 0;
}
@@ -578,13 +569,12 @@ static int sof_pcm_close(struct snd_soc_component *component,
	if (!spcm)
		return -EINVAL;

	dev_dbg(component->dev, "pcm: close stream %d dir %d\n",
		spcm->pcm.pcm_id, substream->stream);
	spcm_dbg(spcm, substream->stream, "Entry: close\n");

	err = snd_sof_pcm_platform_close(sdev, substream);
	if (err < 0) {
		dev_err(component->dev, "error: pcm close failed %d\n",
			err);
		spcm_err(spcm, substream->stream,
			 "platform pcm close failed %d\n", err);
		/*
		 * keep going, no point in preventing the close
		 * from happening
@@ -616,7 +606,8 @@ static int sof_pcm_new(struct snd_soc_component *component,
		return 0;
	}

	dev_dbg(component->dev, "creating new PCM %s\n", spcm->pcm.pcm_name);
	dev_dbg(spcm->scomp->dev, "pcm%u (%s): Entry: pcm_construct\n",
		spcm->pcm.pcm_id, spcm->pcm.pcm_name);

	/* do we need to pre-allocate playback audio buffer pages */
	if (!spcm->pcm.playback)
@@ -624,16 +615,15 @@ static int sof_pcm_new(struct snd_soc_component *component,

	caps = &spcm->pcm.caps[stream];

	/* pre-allocate playback audio buffer pages */
	dev_dbg(component->dev,
		"spcm: allocate %s playback DMA buffer size 0x%x max 0x%x\n",
		caps->name, caps->buffer_size_min, caps->buffer_size_max);

	if (!pcm->streams[stream].substream) {
		dev_err(component->dev, "error: NULL playback substream!\n");
		spcm_err(spcm, stream, "NULL playback substream!\n");
		return -EINVAL;
	}

	/* pre-allocate playback audio buffer pages */
	spcm_dbg(spcm, stream, "allocate %s playback DMA buffer size 0x%x max 0x%x\n",
		 caps->name, caps->buffer_size_min, caps->buffer_size_max);

	snd_pcm_set_managed_buffer(pcm->streams[stream].substream,
				   SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
				   0, le32_to_cpu(caps->buffer_size_max));
@@ -646,16 +636,15 @@ static int sof_pcm_new(struct snd_soc_component *component,

	caps = &spcm->pcm.caps[stream];

	/* pre-allocate capture audio buffer pages */
	dev_dbg(component->dev,
		"spcm: allocate %s capture DMA buffer size 0x%x max 0x%x\n",
		caps->name, caps->buffer_size_min, caps->buffer_size_max);

	if (!pcm->streams[stream].substream) {
		dev_err(component->dev, "error: NULL capture substream!\n");
		spcm_err(spcm, stream, "NULL capture substream!\n");
		return -EINVAL;
	}

	/* pre-allocate capture audio buffer pages */
	spcm_dbg(spcm, stream, "allocate %s capture DMA buffer size 0x%x max 0x%x\n",
		 caps->name, caps->buffer_size_min, caps->buffer_size_max);

	snd_pcm_set_managed_buffer(pcm->streams[stream].substream,
				   SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
				   0, le32_to_cpu(caps->buffer_size_max));
+14 −0
Original line number Diff line number Diff line
@@ -617,6 +617,20 @@ struct snd_sof_pcm *snd_sof_find_spcm_comp(struct snd_soc_component *scomp,
void snd_sof_pcm_period_elapsed(struct snd_pcm_substream *substream);
void snd_sof_pcm_init_elapsed_work(struct work_struct *work);

/*
 * snd_sof_pcm specific wrappers for dev_dbg() and dev_err() to provide
 * consistent and useful prints.
 */
#define spcm_dbg(__spcm, __dir, __fmt, ...)					\
	dev_dbg((__spcm)->scomp->dev, "pcm%u (%s), dir %d: " __fmt,		\
		(__spcm)->pcm.pcm_id, (__spcm)->pcm.pcm_name, __dir,		\
		##__VA_ARGS__)

#define spcm_err(__spcm, __dir, __fmt, ...)					\
	dev_err((__spcm)->scomp->dev, "%s: pcm%u (%s), dir %d: " __fmt,		\
		__func__, (__spcm)->pcm.pcm_id, (__spcm)->pcm.pcm_name, __dir,	\
		##__VA_ARGS__)

#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMPRESS)
void snd_sof_compr_fragment_elapsed(struct snd_compr_stream *cstream);
void snd_sof_compr_init_elapsed_work(struct work_struct *work);