Commit 22c861fd authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: SOF: Intel: hda-stream: Print stream name on STREAM_SD_OFFSET timeout

In order to provide more information in case of timeout observed while
reading STREAM_SD_OFFSET, print out the stream name or in case there is
no audio stream associated (like dma-trace), print "--"
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20210928081744.4785-1-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent ca4c040d
...@@ -25,6 +25,33 @@ ...@@ -25,6 +25,33 @@
#define HDA_LTRP_GB_VALUE_US 95 #define HDA_LTRP_GB_VALUE_US 95
static inline const char *hda_hstream_direction_str(struct hdac_stream *hstream)
{
if (hstream->direction == SNDRV_PCM_STREAM_PLAYBACK)
return "Playback";
else
return "Capture";
}
static char *hda_hstream_dbg_get_stream_info_str(struct hdac_stream *hstream)
{
struct snd_soc_pcm_runtime *rtd;
if (hstream->substream)
rtd = asoc_substream_to_rtd(hstream->substream);
else if (hstream->cstream)
rtd = hstream->cstream->private_data;
else
/* Non audio DMA user, like dma-trace */
return kasprintf(GFP_KERNEL, "-- (%s, stream_tag: %u)",
hda_hstream_direction_str(hstream),
hstream->stream_tag);
return kasprintf(GFP_KERNEL, "dai_link \"%s\" (%s, stream_tag: %u)",
rtd->dai_link->name, hda_hstream_direction_str(hstream),
hstream->stream_tag);
}
/* /*
* set up one of BDL entries for a stream * set up one of BDL entries for a stream
*/ */
...@@ -257,7 +284,7 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev, ...@@ -257,7 +284,7 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
struct hdac_stream *hstream = &stream->hstream; struct hdac_stream *hstream = &stream->hstream;
int sd_offset = SOF_STREAM_SD_OFFSET(hstream); int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
u32 dma_start = SOF_HDA_SD_CTL_DMA_START; u32 dma_start = SOF_HDA_SD_CTL_DMA_START;
int ret; int ret = 0;
u32 run; u32 run;
/* cmd must be for audio stream */ /* cmd must be for audio stream */
...@@ -283,14 +310,9 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev, ...@@ -283,14 +310,9 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_REG_POLL_INTERVAL_US,
HDA_DSP_STREAM_RUN_TIMEOUT); HDA_DSP_STREAM_RUN_TIMEOUT);
if (ret < 0) { if (ret >= 0)
dev_err(sdev->dev, hstream->running = true;
"error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n",
__func__, cmd);
return ret;
}
hstream->running = true;
break; break;
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
...@@ -306,27 +328,32 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev, ...@@ -306,27 +328,32 @@ int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_REG_POLL_INTERVAL_US,
HDA_DSP_STREAM_RUN_TIMEOUT); HDA_DSP_STREAM_RUN_TIMEOUT);
if (ret < 0) { if (ret >= 0) {
dev_err(sdev->dev, snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
"error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n", sd_offset + SOF_HDA_ADSP_REG_CL_SD_STS,
__func__, cmd); SOF_HDA_CL_DMA_SD_INT_MASK);
return ret;
}
snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR, sd_offset + hstream->running = false;
SOF_HDA_ADSP_REG_CL_SD_STS, snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
SOF_HDA_CL_DMA_SD_INT_MASK); SOF_HDA_INTCTL,
1 << hstream->index, 0x0);
hstream->running = false; }
snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL,
1 << hstream->index, 0x0);
break; break;
default: default:
dev_err(sdev->dev, "error: unknown command: %d\n", cmd); dev_err(sdev->dev, "error: unknown command: %d\n", cmd);
return -EINVAL; return -EINVAL;
} }
return 0; if (ret < 0) {
char *stream_name = hda_hstream_dbg_get_stream_info_str(hstream);
dev_err(sdev->dev,
"%s: cmd %d on %s: timeout on STREAM_SD_OFFSET read\n",
__func__, cmd, stream_name ? stream_name : "unknown stream");
kfree(stream_name);
}
return ret;
} }
/* minimal recommended programming for ICCMAX stream */ /* minimal recommended programming for ICCMAX stream */
...@@ -440,9 +467,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, ...@@ -440,9 +467,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
HDA_DSP_STREAM_RUN_TIMEOUT); HDA_DSP_STREAM_RUN_TIMEOUT);
if (ret < 0) { if (ret < 0) {
char *stream_name = hda_hstream_dbg_get_stream_info_str(hstream);
dev_err(sdev->dev, dev_err(sdev->dev,
"error: %s: timeout on STREAM_SD_OFFSET read1\n", "%s: on %s: timeout on STREAM_SD_OFFSET read1\n",
__func__); __func__, stream_name ? stream_name : "unknown stream");
kfree(stream_name);
return ret; return ret;
} }
...@@ -506,9 +536,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev, ...@@ -506,9 +536,12 @@ int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
HDA_DSP_STREAM_RUN_TIMEOUT); HDA_DSP_STREAM_RUN_TIMEOUT);
if (ret < 0) { if (ret < 0) {
char *stream_name = hda_hstream_dbg_get_stream_info_str(hstream);
dev_err(sdev->dev, dev_err(sdev->dev,
"error: %s: timeout on STREAM_SD_OFFSET read2\n", "%s: on %s: timeout on STREAM_SD_OFFSET read1\n",
__func__); __func__, stream_name ? stream_name : "unknown stream");
kfree(stream_name);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment