Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions sound/soc/sof/ipc3-dtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
enum sof_dtrace_state {
SOF_DTRACE_DISABLED,
SOF_DTRACE_STOPPED,
SOF_DTRACE_INITIALIZING,
SOF_DTRACE_ENABLED,
};

Expand All @@ -32,6 +33,15 @@ struct sof_dtrace_priv {
enum sof_dtrace_state dtrace_state;
};

static bool trace_pos_update_expected(struct sof_dtrace_priv *priv)
{
if (priv->dtrace_state == SOF_DTRACE_ENABLED ||
priv->dtrace_state == SOF_DTRACE_INITIALIZING)
return true;

return false;
}

static int trace_filter_append_elem(struct snd_sof_dev *sdev, u32 key, u32 value,
struct sof_ipc_trace_filter_elem *elem_list,
int capacity, int *counter)
Expand Down Expand Up @@ -273,7 +283,7 @@ static size_t sof_wait_dtrace_avail(struct snd_sof_dev *sdev, loff_t pos,
if (ret)
return ret;

if (priv->dtrace_state != SOF_DTRACE_ENABLED && priv->dtrace_draining) {
if (priv->dtrace_draining && !trace_pos_update_expected(priv)) {
/*
* tracing has ended and all traces have been
* read by client, return EOF
Expand Down Expand Up @@ -444,24 +454,26 @@ static int ipc3_dtrace_enable(struct snd_sof_dev *sdev)
dev_dbg(sdev->dev, "%s: stream_tag: %d\n", __func__, params.stream_tag);

/* send IPC to the DSP */
priv->dtrace_state = SOF_DTRACE_INITIALIZING;
ret = sof_ipc_tx_message(sdev->ipc, &params, sizeof(params), &ipc_reply, sizeof(ipc_reply));
if (ret < 0) {
dev_err(sdev->dev, "can't set params for DMA for trace %d\n", ret);
goto trace_release;
}

start:
priv->dtrace_state = SOF_DTRACE_ENABLED;

ret = sof_dtrace_host_trigger(sdev, SNDRV_PCM_TRIGGER_START);
if (ret < 0) {
dev_err(sdev->dev, "Host dtrace trigger start failed: %d\n", ret);
goto trace_release;
}

priv->dtrace_state = SOF_DTRACE_ENABLED;

return 0;

trace_release:
priv->dtrace_state = SOF_DTRACE_DISABLED;
sof_dtrace_host_release(sdev);
return ret;
}
Expand Down Expand Up @@ -545,7 +557,7 @@ int ipc3_dtrace_posn_update(struct snd_sof_dev *sdev,
if (!sdev->fw_trace_is_supported)
return 0;

if (priv->dtrace_state == SOF_DTRACE_ENABLED &&
if (trace_pos_update_expected(priv) &&
priv->host_offset != posn->host_offset) {
priv->host_offset = posn->host_offset;
wake_up(&priv->trace_sleep);
Expand Down