Skip to content
Closed
2 changes: 2 additions & 0 deletions src/arch/host/include/arch/lib/cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include <stddef.h>

#define PLATFORM_DCACHE_ALIGN sizeof(void *)

static inline void dcache_writeback_region(void *addr, size_t size) {}
static inline void dcache_invalidate_region(void *addr, size_t size) {}
static inline void icache_invalidate_region(void *addr, size_t size) {}
Expand Down
75 changes: 40 additions & 35 deletions src/audio/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,94 +7,99 @@

#include <sof/audio/buffer.h>
#include <sof/audio/component.h>
#include <sof/debug/panic.h>
#include <sof/drivers/interrupt.h>
#include <sof/lib/alloc.h>
#include <sof/lib/cache.h>
#include <sof/lib/memory.h>
#include <sof/list.h>
#include <sof/string.h>
#include <ipc/topology.h>
#include <errno.h>
#include <stddef.h>
#include <stdint.h>

/* create a new component in the pipeline */
struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
struct comp_buffer *buffer_alloc(uint32_t size, uint32_t caps, uint32_t align)
{
struct comp_buffer *buffer;

trace_buffer("buffer_new()");
trace_buffer("buffer_alloc()");

/* validate request */
if (desc->size == 0 || desc->size > HEAP_BUFFER_SIZE) {
trace_buffer_error("buffer_new() error: "
"new size = %u is invalid", desc->size);
if (size == 0 || size > HEAP_BUFFER_SIZE) {
trace_buffer_error("buffer_alloc() error: "
"new size = %u is invalid", size);
return NULL;
}

/* allocate new buffer */
buffer = rzalloc(RZONE_RUNTIME, SOF_MEM_CAPS_RAM, sizeof(*buffer));
if (!buffer) {
trace_buffer_error("buffer_new() error: "
trace_buffer_error("buffer_alloc() error: "
"could not alloc structure");
return NULL;
}

buffer->addr = rballoc(RZONE_BUFFER, desc->caps, desc->size);
buffer->addr = rballoc_align(RZONE_BUFFER, caps, size, align);
if (!buffer->addr) {
rfree(buffer);
trace_buffer_error("buffer_new() error: "
trace_buffer_error("buffer_alloc() error: "
"could not alloc size = %u "
"bytes of type = %u",
desc->size, desc->caps);
size, caps);
return NULL;
}

assert(!memcpy_s(&buffer->ipc_buffer, sizeof(buffer->ipc_buffer),
desc, sizeof(*desc)));
buffer_init(buffer, size, caps);

list_init(&buffer->source_list);
list_init(&buffer->sink_list);

return buffer;
}

/* create a new component in the pipeline */
struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
{
struct comp_buffer *buffer;

trace_buffer("buffer_new()");

buffer_init(buffer, desc->size);
/* allocate buffer */
buffer = buffer_alloc(desc->size, desc->caps, PLATFORM_DCACHE_ALIGN);
if (buffer) {
buffer->id = desc->comp.id;
buffer->pipeline_id = desc->comp.pipeline_id;
}

return buffer;
}

int buffer_set_size(struct comp_buffer *buffer, uint32_t size)
{
void *new_ptr = NULL;
struct sof_ipc_buffer *desc = NULL;

/* validate request */
if (size == 0 || size > HEAP_BUFFER_SIZE) {
trace_buffer_error("resize error: size = %u is invalid", size);
return -EINVAL;
}

desc = &buffer->ipc_buffer;
if (!desc) {
trace_buffer_error("resize error: invalid buffer desc");
return -EINVAL;
}

if (size == desc->size)
if (size == buffer->size)
return 0;

new_ptr = rbrealloc(buffer->addr, RZONE_BUFFER, desc->caps, size);
new_ptr = rbrealloc(buffer->addr, RZONE_BUFFER, buffer->caps, size);

/* we couldn't allocate bigger chunk */
if (!new_ptr && size > desc->size) {
if (!new_ptr && size > buffer->size) {
trace_buffer_error("resize error: can't alloc %u bytes type %u",
desc->size, desc->caps);
buffer->size, buffer->caps);
return -ENOMEM;
}

/* use bigger chunk, else just use the old chunk but set smaller */
if (new_ptr)
buffer->addr = new_ptr;

desc->size = size;

buffer_init(buffer, desc->size);
buffer_init(buffer, size, buffer->caps);

return 0;
}
Expand Down Expand Up @@ -184,10 +189,10 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
irq_local_enable(flags);

tracev_buffer("comp_update_buffer_produce(), ((buffer->avail << 16) | "
"buffer->free) = %08x, ((buffer->ipc_buffer.comp.id << "
"16) | buffer->size) = %08x",
"buffer->free) = %08x, ((buffer->id << 16) | "
"buffer->size) = %08x",
(buffer->avail << 16) | buffer->free,
(buffer->ipc_buffer.comp.id << 16) | buffer->size);
(buffer->id << 16) | buffer->size);
tracev_buffer("comp_update_buffer_produce(), ((buffer->r_ptr - buffer"
"->addr) << 16 | (buffer->w_ptr - buffer->addr)) = %08x",
(buffer->r_ptr - buffer->addr) << 16 |
Expand Down Expand Up @@ -240,11 +245,11 @@ void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)

tracev_buffer("comp_update_buffer_consume(), "
"(buffer->avail << 16) | buffer->free = %08x, "
"(buffer->ipc_buffer.comp.id << 16) | buffer->size = "
" %08x, (buffer->r_ptr - buffer->addr) << 16 | "
"(buffer->id << 16) | buffer->size = %08x, "
"(buffer->r_ptr - buffer->addr) << 16 | "
"(buffer->w_ptr - buffer->addr)) = %08x",
(buffer->avail << 16) | buffer->free,
(buffer->ipc_buffer.comp.id << 16) | buffer->size,
(buffer->id << 16) | buffer->size,
(buffer->r_ptr - buffer->addr) << 16 |
(buffer->w_ptr - buffer->addr));
}
Loading