Skip to content
Open
Show file tree
Hide file tree
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
63 changes: 29 additions & 34 deletions src/audio/dai-zephyr.c
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,6 @@ __cold int dai_common_new(struct dai_data *dd, struct comp_dev *dev,

dma_sg_init(&dd->config.elem_array);
dd->xrun = 0;
dd->chan = NULL;

/* I/O performance init, keep it last so the function does not reach this in case
* of return on error, so that we do not waste a slot
Expand Down Expand Up @@ -597,6 +596,8 @@ __cold static struct comp_dev *dai_new(const struct comp_driver *drv,
if (!dd)
goto e_data;

dd->chan_index = -EINVAL;

comp_set_drvdata(dev, dd);

ret = dai_common_new(dd, dev, dai_cfg);
Expand Down Expand Up @@ -627,10 +628,8 @@ __cold void dai_common_free(struct dai_data *dd)
if (dd->group)
dai_group_put(dd->group);

if (dd->chan) {
sof_dma_release_channel(dd->dma, dd->chan->index);
dd->chan->dev_data = NULL;
}
if (dd->chan_index != -EINVAL)
sof_dma_release_channel(dd->dma, dd->chan_index);
Comment on lines +631 to +632

sof_dma_put(dd->dma);

Expand Down Expand Up @@ -1160,9 +1159,9 @@ int dai_common_config_prepare(struct dai_data *dd, struct comp_dev *dev)
return -EINVAL;
}

if (dd->chan) {
if (dd->chan_index != -EINVAL) {
comp_info(dev, "dma channel index %d already configured",
dd->chan->index);
dd->chan_index);
return 0;
}

Expand All @@ -1176,18 +1175,14 @@ int dai_common_config_prepare(struct dai_data *dd, struct comp_dev *dev)
}

/* get DMA channel */
channel = sof_dma_request_channel(dd->dma, channel);
if (channel < 0) {
dd->chan_index = sof_dma_request_channel(dd->dma, channel);
if (dd->chan_index < 0) {
comp_err(dev, "dma_request_channel() failed");
dd->chan = NULL;
return -EIO;
}
Comment on lines 1177 to 1182

dd->chan = &dd->dma->chan[channel];
dd->chan->dev_data = dd;

comp_dbg(dev, "new configured dma channel index %d",
dd->chan->index);
dd->chan_index);

return 0;
}
Expand All @@ -1198,8 +1193,8 @@ int dai_common_prepare(struct dai_data *dd, struct comp_dev *dev)

dd->total_data_processed = 0;

if (!dd->chan) {
comp_err(dev, "Missing dd->chan.");
if (dd->chan_index == -EINVAL) {
comp_err(dev, "Missing dd->chan_index.");
comp_set_state(dev, COMP_TRIGGER_RESET);
return -EINVAL;
}
Expand All @@ -1220,7 +1215,7 @@ int dai_common_prepare(struct dai_data *dd, struct comp_dev *dev)
return 0;
}

ret = sof_dma_config(dd->chan->dma, dd->chan->index, dd->z_config);
ret = sof_dma_config(dd->dma, dd->chan_index, dd->z_config);
if (ret < 0)
comp_set_state(dev, COMP_TRIGGER_RESET);

Expand Down Expand Up @@ -1307,7 +1302,7 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,

/* only start the DAI if we are not XRUN handling */
if (dd->xrun == 0) {
ret = sof_dma_start(dd->chan->dma, dd->chan->index);
ret = sof_dma_start(dd->dma, dd->chan_index);
if (ret < 0)
return ret;

Expand Down Expand Up @@ -1345,16 +1340,16 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,
/* only start the DAI if we are not XRUN handling */
if (dd->xrun == 0) {
/* recover valid start position */
ret = sof_dma_stop(dd->chan->dma, dd->chan->index);
ret = sof_dma_stop(dd->dma, dd->chan_index);
if (ret < 0)
return ret;

/* dma_config needed after stop */
ret = sof_dma_config(dd->chan->dma, dd->chan->index, dd->z_config);
ret = sof_dma_config(dd->dma, dd->chan_index, dd->z_config);
if (ret < 0)
return ret;

ret = sof_dma_start(dd->chan->dma, dd->chan->index);
ret = sof_dma_start(dd->dma, dd->chan_index);
if (ret < 0)
return ret;

Expand Down Expand Up @@ -1382,11 +1377,11 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,
* as soon as possible.
*/
#if CONFIG_COMP_DAI_STOP_TRIGGER_ORDER_REVERSE
ret = sof_dma_stop(dd->chan->dma, dd->chan->index);
ret = sof_dma_stop(dd->dma, dd->chan_index);
dai_trigger_op(dd->dai, cmd, dev->direction);
#else
dai_trigger_op(dd->dai, cmd, dev->direction);
ret = sof_dma_stop(dd->chan->dma, dd->chan->index);
ret = sof_dma_stop(dd->dma, dd->chan_index);
if (ret) {
comp_warn(dev, "dma was stopped earlier");
ret = 0;
Expand All @@ -1396,11 +1391,11 @@ static int dai_comp_trigger_internal(struct dai_data *dd, struct comp_dev *dev,
case COMP_TRIGGER_PAUSE:
comp_dbg(dev, "PAUSE");
#if CONFIG_COMP_DAI_STOP_TRIGGER_ORDER_REVERSE
ret = sof_dma_suspend(dd->chan->dma, dd->chan->index);
ret = sof_dma_suspend(dd->dma, dd->chan_index);
dai_trigger_op(dd->dai, cmd, dev->direction);
#else
dai_trigger_op(dd->dai, cmd, dev->direction);
ret = sof_dma_suspend(dd->chan->dma, dd->chan->index);
ret = sof_dma_suspend(dd->dma, dd->chan_index);
#endif
break;
case COMP_TRIGGER_PRE_START:
Expand Down Expand Up @@ -1498,7 +1493,7 @@ static int dai_comp_trigger(struct comp_dev *dev, int cmd)
*/
static int dai_get_status(struct comp_dev *dev, struct dai_data *dd, struct dma_status *stat)
{
int ret = sof_dma_get_status(dd->chan->dma, dd->chan->index, stat);
int ret = sof_dma_get_status(dd->dma, dd->chan_index, stat);
#if CONFIG_XRUN_NOTIFICATIONS_ENABLE
if (ret == -EPIPE && !dd->xrun_notification_sent) {
dd->xrun_notification_sent = send_copier_gateway_xrun_notif_msg
Expand Down Expand Up @@ -1603,7 +1598,7 @@ int dai_zephyr_multi_endpoint_copy(struct dai_data **dd, struct comp_dev *dev,
#endif

for (i = 0; i < num_endpoints; i++) {
ret = sof_dma_reload(dd[i]->chan->dma, dd[i]->chan->index, 0);
ret = sof_dma_reload(dd[i]->dma, dd[i]->chan_index, 0);
if (ret < 0) {
dai_report_reload_xrun(dd[i], dev, 0);
return ret;
Expand All @@ -1629,10 +1624,10 @@ int dai_zephyr_multi_endpoint_copy(struct dai_data **dd, struct comp_dev *dev,

status = dai_dma_multi_endpoint_cb(dd[i], dev, frames, multi_endpoint_buffer);
if (status == SOF_DMA_CB_STATUS_END)
sof_dma_stop(dd[i]->chan->dma, dd[i]->chan->index);
sof_dma_stop(dd[i]->dma, dd[i]->chan_index);

copy_bytes = frames * audio_stream_frame_bytes(&dd[i]->dma_buffer->stream);
ret = sof_dma_reload(dd[i]->chan->dma, dd[i]->chan->index, copy_bytes);
ret = sof_dma_reload(dd[i]->dma, dd[i]->chan_index, copy_bytes);
if (ret < 0) {
dai_report_reload_xrun(dd[i], dev, copy_bytes);
return ret;
Expand Down Expand Up @@ -1821,7 +1816,7 @@ int dai_common_copy(struct dai_data *dd, struct comp_dev *dev, pcm_converter_fun
comp_warn(dev, "nothing to copy, src_frames: %u, sink_frames: %u",
src_frames, sink_frames);
#endif
sof_dma_reload(dd->chan->dma, dd->chan->index, 0);
sof_dma_reload(dd->dma, dd->chan_index, 0);
return 0;
}

Expand All @@ -1831,9 +1826,9 @@ int dai_common_copy(struct dai_data *dd, struct comp_dev *dev, pcm_converter_fun
comp_warn(dev, "dai trigger copy failed");

if (dai_dma_cb(dd, dev, copy_bytes, converter) == SOF_DMA_CB_STATUS_END)
sof_dma_stop(dd->chan->dma, dd->chan->index);
sof_dma_stop(dd->dma, dd->chan_index);

ret = sof_dma_reload(dd->chan->dma, dd->chan->index, copy_bytes);
ret = sof_dma_reload(dd->dma, dd->chan_index, copy_bytes);
if (ret < 0) {
dai_report_reload_xrun(dd, dev, copy_bytes);
return ret;
Expand Down Expand Up @@ -1871,7 +1866,7 @@ int dai_common_ts_config_op(struct dai_data *dd, struct comp_dev *dev)
struct dai_ts_cfg *cfg = &dd->ts_config;

comp_dbg(dev, "dai_ts_config()");
if (!dd->chan) {
if (dd->chan_index == -EINVAL) {
comp_err(dev, "No DMA channel information");
return -EINVAL;
}
Expand All @@ -1894,7 +1889,7 @@ int dai_common_ts_config_op(struct dai_data *dd, struct comp_dev *dev)
cfg->direction = dai->direction;
cfg->index = dd->dai->index;
cfg->dma_id = dd->dma->plat_data.id;
cfg->dma_chan_index = dd->chan->index;
cfg->dma_chan_index = dd->chan_index;
cfg->dma_chan_count = dd->dma->plat_data.channels;

return dai_ts_config(dd->dai->dev, cfg);
Expand Down
2 changes: 1 addition & 1 deletion src/include/sof/lib/dai-zephyr.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ typedef int (*channel_copy_func)(const struct audio_stream *src, unsigned int sr
*/
struct dai_data {
/* local DMA config */
struct dma_chan_data *chan;
int chan_index;
uint32_t stream_id;
struct dma_sg_config config;
struct dma_config *z_config;
Expand Down
19 changes: 10 additions & 9 deletions src/ipc/ipc4/dai.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ void dai_dma_release(struct dai_data *dd, struct comp_dev *dev)
}

/* put the allocated DMA channel first */
if (dd->chan) {
if (dd->chan_index != -EINVAL) {
struct ipc4_llp_reading_slot slot;
Comment on lines 225 to 227

if (dd->slot_info.node_id) {
Expand All @@ -245,15 +245,16 @@ void dai_dma_release(struct dai_data *dd, struct comp_dev *dev)
*/
#if CONFIG_ZEPHYR_NATIVE_DRIVERS
/* if reset is after pause dma has already been stopped */
dma_stop(dd->chan->dma->z_dev, dd->chan->index);
dma_stop(dd->dma->z_dev, dd->chan_index);

dma_release_channel(dd->chan->dma->z_dev, dd->chan->index);
dma_release_channel(dd->dma->z_dev, dd->chan_index);
#else
Comment on lines 246 to 251
/* TODO: to remove this, no longer works! */
dma_stop_legacy(dd->chan);
dma_channel_put_legacy(dd->chan);
#endif
dd->chan->dev_data = NULL;
dd->chan = NULL;
#endif

}
}

Expand Down Expand Up @@ -377,9 +378,9 @@ __cold int dai_config(struct dai_data *dd, struct comp_dev *dev,
return 0;
}

if (dd->chan) {
if (dd->chan_index != -EINVAL) {
comp_info(dev, "Configured. dma channel index %d, ignore...",
dd->chan->index);
dd->chan_index);
return 0;
Comment on lines +381 to 384
}

Expand Down Expand Up @@ -438,7 +439,7 @@ int dai_common_position(struct dai_data *dd, struct comp_dev *dev,
platform_dai_wallclock(dev, &dd->wallclock);
posn->wallclock = dd->wallclock;

ret = dma_get_status(dd->dma->z_dev, dd->chan->index, &status);
ret = dma_get_status(dd->dma->z_dev, dd->chan_index, &status);
if (ret < 0)
return ret;

Expand All @@ -463,7 +464,7 @@ void dai_dma_position_update(struct dai_data *dd, struct comp_dev *dev)
if (!dd->slot_info.node_id)
return;

ret = dma_get_status(dd->dma->z_dev, dd->chan->index, &status);
ret = dma_get_status(dd->dma->z_dev, dd->chan_index, &status);
if (ret < 0)
return;

Expand Down
Loading