mirror of https://github.com/thesofproject/sof.git
dma: fixed writebacks when operating via L1 on dma buffer in L2 mem
Signed-off-by: Marcin Maka <marcin.maka@linux.intel.com>
This commit is contained in:
parent
83ed9f8139
commit
43398d22db
|
@ -73,7 +73,6 @@ struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bzero(buffer->addr, desc->size);
|
||||
memcpy(&buffer->ipc_buffer, desc, sizeof(*desc));
|
||||
|
||||
buffer->size = buffer->alloc_size = desc->size;
|
||||
|
@ -84,6 +83,8 @@ struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
|
|||
buffer->avail = 0;
|
||||
buffer->connected = 0;
|
||||
|
||||
buffer_zero(buffer);
|
||||
|
||||
spinlock_init(&buffer->lock);
|
||||
|
||||
return buffer;
|
||||
|
|
|
@ -106,11 +106,7 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
|
|||
struct comp_buffer, sink_list);
|
||||
|
||||
/* fill buffer with silence */
|
||||
bzero(dma_buffer->addr, dma_buffer->size);
|
||||
|
||||
/* writeback buffer contents from cache */
|
||||
dcache_writeback_region(dma_buffer->addr,
|
||||
dma_buffer->size);
|
||||
buffer_zero(dma_buffer);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -453,6 +449,7 @@ static int dai_prepare(struct comp_dev *dev)
|
|||
struct comp_buffer, source_list);
|
||||
}
|
||||
|
||||
/* TODO: not sure what this wb is for? */
|
||||
/* write back buffer contents from cache */
|
||||
dcache_writeback_region(dma_buffer->addr, dma_buffer->size);
|
||||
|
||||
|
|
|
@ -591,7 +591,7 @@ static int dw_dma_set_config(struct dma *dma, int channel,
|
|||
|
||||
/* initialise descriptors */
|
||||
bzero(p->chan[channel].lli, sizeof(struct dw_lli2) *
|
||||
p->chan[channel].desc_count);
|
||||
p->chan[channel].desc_count);
|
||||
lli_desc = lli_desc_head = p->chan[channel].lli;
|
||||
lli_desc_tail = p->chan[channel].lli + p->chan[channel].desc_count - 1;
|
||||
|
||||
|
|
|
@ -85,6 +85,15 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes);
|
|||
/* called by a component after consuming data from this buffer */
|
||||
void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes);
|
||||
|
||||
static inline void buffer_zero(struct comp_buffer *buffer)
|
||||
{
|
||||
tracev_buffer("BZr");
|
||||
|
||||
bzero(buffer->addr, buffer->size);
|
||||
if (buffer->ipc_buffer.caps & SOF_MEM_CAPS_DMA)
|
||||
dcache_writeback_region(buffer->addr, buffer->size);
|
||||
}
|
||||
|
||||
/* get the max number of bytes that can be copied between sink and source */
|
||||
static inline int comp_buffer_can_copy_bytes(struct comp_buffer *source,
|
||||
struct comp_buffer *sink, uint32_t bytes)
|
||||
|
@ -122,7 +131,7 @@ static inline void buffer_reset_pos(struct comp_buffer *buffer)
|
|||
buffer->avail = 0;
|
||||
|
||||
/* clear buffer contents */
|
||||
bzero(buffer->addr, buffer->size);
|
||||
buffer_zero(buffer);
|
||||
}
|
||||
|
||||
/* set the runtime size of a buffer in bytes and improve the data cache */
|
||||
|
@ -139,11 +148,4 @@ static inline int buffer_set_size(struct comp_buffer *buffer, uint32_t size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void buffer_zero(struct comp_buffer *buffer)
|
||||
{
|
||||
tracev_buffer("BZr");
|
||||
|
||||
bzero(buffer->addr, buffer->size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -308,7 +308,7 @@ int platform_init(struct sof *sof)
|
|||
trace_point(TRACE_BOOT_PLATFORM_MBOX);
|
||||
|
||||
/* clear mailbox for early trace and debug */
|
||||
bzero((void*)MAILBOX_BASE, IPC_MAX_MAILBOX_BYTES);
|
||||
bzero((void *)MAILBOX_BASE, IPC_MAX_MAILBOX_BYTES);
|
||||
|
||||
trace_point(TRACE_BOOT_PLATFORM_SHIM);
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ int platform_init(struct sof *sof)
|
|||
trace_point(TRACE_BOOT_PLATFORM_MBOX);
|
||||
|
||||
/* clear mailbox for early trace and debug */
|
||||
bzero((void*)MAILBOX_BASE, IPC_MAX_MAILBOX_BYTES);
|
||||
bzero((void *)MAILBOX_BASE, IPC_MAX_MAILBOX_BYTES);
|
||||
|
||||
trace_point(TRACE_BOOT_PLATFORM_SHIM);
|
||||
platform_init_shim();
|
||||
|
|
|
@ -158,8 +158,8 @@ static void test_lib_lib_bzero_char_zero_middle_beg(void **state)
|
|||
|
||||
(void) state;
|
||||
|
||||
bzero(test_data->str+test_data_zero_middle->beg,
|
||||
test_data_zero_middle->len);
|
||||
bzero(test_data->str + test_data_zero_middle->beg,
|
||||
test_data_zero_middle->len);
|
||||
assert_int_equal(check_test_arr(default_char),
|
||||
test_data_zero_middle->beg);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue