Unverified Commit a4b8152c authored by Kai Vehmanen's avatar Kai Vehmanen Committed by Mark Brown
Browse files

ASoC: SOF: ipc4-pcm: do not report invalid delay values



Add a sanity check for the calculated delay value before reporting it to
the application. If the value is clearly invalid, emit a rate limited
warning to kernel log and return a zero delay. This can occur e.g if the
host or link DMA hits a buffer over/underrun condition.

Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20251002074719.2084-5-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 18dbff48
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ struct sof_ipc4_pcm_stream_priv {
 */
#define DELAY_BOUNDARY		U32_MAX

#define DELAY_MAX		(DELAY_BOUNDARY >> 1)

static inline struct sof_ipc4_timestamp_info *
sof_ipc4_sps_to_time_info(struct snd_sof_pcm_stream *sps)
{
@@ -1266,6 +1268,13 @@ static int sof_ipc4_pcm_pointer(struct snd_soc_component *component,
	else
		time_info->delay = head_cnt - tail_cnt;

	if (time_info->delay > DELAY_MAX) {
		spcm_dbg_ratelimited(spcm, substream->stream,
				     "inaccurate delay, host %llu dai_cnt %llu",
				     host_cnt, dai_cnt);
		time_info->delay = 0;
	}

	/*
	 * Convert the host byte counter to PCM pointer which wraps in buffer
	 * and it is in frames