Skip to content

Commit

Permalink
audio: dai-zephyr: convert DMA src/dst addresses to host-relative add…
Browse files Browse the repository at this point in the history
…resses

The DMAC has the same view of the address space as the HOST.
As such, the source and destination addresses need to be converted
to HOST-relative addresses before attempting to perform a DMA
transfer. This is only relevant for platforms for which the DSP
and HOST have different views of the address space (e.g: i.MX8ULP).

Also, if a platform doesn't define the `local_to_host` macro
(used for converting DSP local address to HOST-relative address)
we assume that the HOST and the DSP have the same view of the
address space. As such, we also add a definition of `local_to_host`
which will just return the passed address.

Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
  • Loading branch information
LaurentiuM1234 authored and dbaluta committed Mar 18, 2024
1 parent 12ad82a commit fc48fbd
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions src/audio/dai-zephyr.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@
#include <zephyr/device.h>
#include <zephyr/drivers/dai.h>

/* note: if this macro is not defined
* then that means the HOST and the DSP
* have the same view of the address space.
*/
#ifndef local_to_host
#define local_to_host(addr) (addr)
#endif /* local_to_host */

static const struct comp_driver comp_dai;

LOG_MODULE_REGISTER(dai_comp, CONFIG_SOF_LOG_LEVEL);
Expand Down Expand Up @@ -751,12 +759,18 @@ static int dai_set_dma_config(struct dai_data *dd, struct comp_dev *dev)
for (i = 0; i < dma_cfg->block_count; i++) {
dma_block_cfg->dest_scatter_en = config->scatter;
dma_block_cfg->block_size = config->elem_array.elems[i].size;
dma_block_cfg->source_address = config->elem_array.elems[i].src;
dma_block_cfg->dest_address = config->elem_array.elems[i].dest;
if (dev->direction == SOF_IPC_STREAM_PLAYBACK) {
dma_block_cfg->source_address =
local_to_host(config->elem_array.elems[i].src);
dma_block_cfg->dest_address =
config->elem_array.elems[i].dest;
dma_block_cfg->source_addr_adj = DMA_ADDR_ADJ_DECREMENT;
dma_block_cfg->dest_addr_adj = DMA_ADDR_ADJ_INCREMENT;
} else {
dma_block_cfg->source_address =
config->elem_array.elems[i].src;
dma_block_cfg->dest_address =
local_to_host(config->elem_array.elems[i].dest);
dma_block_cfg->source_addr_adj = DMA_ADDR_ADJ_INCREMENT;
dma_block_cfg->dest_addr_adj = DMA_ADDR_ADJ_DECREMENT;
}
Expand Down

0 comments on commit fc48fbd

Please sign in to comment.