Skip to content
Merged
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
7 changes: 6 additions & 1 deletion src/drivers/dw/ssi-spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ struct spi_dma_config {
enum spi_xfer_direction dir;
void *src_buf;
void *dest_buf;
uint32_t buffer_size;
uint32_t transfer_len;
};

Expand All @@ -133,6 +134,7 @@ struct spi {
const struct gpio *gpio;
uint32_t index;
uint32_t chan[2]; /* spi-slave rx/tx dma */
uint32_t buffer_size;
uint8_t *rx_buffer;
uint8_t *tx_buffer;
struct dma *dma[2];
Expand Down Expand Up @@ -379,7 +381,8 @@ int spi_push(struct spi *spi, const void *data, size_t size)
spi->ipc_status = IPC_WRITE;

/* Actually we have to send IPC messages in one go */
rmemcpy(config->src_buf, data, size);
assert(!memcpy_s(config->src_buf, config->buffer_size, data, size));

dcache_writeback_region(config->src_buf, size);

ret = spi_trigger(spi, SPI_TRIGGER_START, SPI_DIR_TX);
Expand Down Expand Up @@ -427,6 +430,7 @@ static int spi_slave_init(struct spi *spi)
config = spi->config + SPI_DIR_TX;
config->dir = SPI_DIR_TX;
config->src_buf = spi->tx_buffer;
config->buffer_size = spi->buffer_size;

spi->completion.private = NULL;
return schedule_task_init(&spi->completion, SOF_SCHEDULE_EDF,
Expand Down Expand Up @@ -475,6 +479,7 @@ int spi_probe(struct spi *spi)

spi->tx_buffer = rzalloc(RZONE_SYS_RUNTIME, SOF_MEM_CAPS_DMA,
SPI_BUFFER_SIZE);
spi->buffer_size = SPI_BUFFER_SIZE;
if (spi->tx_buffer == NULL) {
rfree(spi->rx_buffer);
trace_ipc_error("eSp");
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/intel/baytrail/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ static void do_notify(void)

/* copy the data returned from DSP */
if (msg->rx_size && msg->rx_size < SOF_IPC_MSG_MAX_SIZE)
mailbox_dspbox_read(msg->rx_data, 0, msg->rx_size);
mailbox_dspbox_read(msg->rx_data, SOF_IPC_MSG_MAX_SIZE,
Comment thread
dabekjakub marked this conversation as resolved.
Resolved
0, msg->rx_size);

/* any callback ? */
if (msg->cb)
Expand Down
13 changes: 8 additions & 5 deletions src/drivers/intel/cavs/dmic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1164,8 +1164,8 @@ static int dmic_set_config(struct dai *dai, struct sof_ipc_dai_config *config)
/* Copy the new DMIC params to persistent. The last request
* determines the parameters.
*/
memcpy(dmic_prm[di], &config->dmic,
sizeof(struct sof_ipc_dai_dmic_params));
assert(!memcpy_s(dmic_prm[di], sizeof(*dmic_prm[di]), &config->dmic,
sizeof(struct sof_ipc_dai_dmic_params)));

if (config->dmic.num_pdm_active > DMIC_HW_CONTROLLERS) {
trace_dmic_error("dmic_set_config() error: the requested "
Expand All @@ -1179,11 +1179,14 @@ static int dmic_set_config(struct dai *dai, struct sof_ipc_dai_config *config)
dmic_prm[di]->pdm[i].id = i;
for (j = 0; j < config->dmic.num_pdm_active; j++) {
/* copy the pdm controller params id the id's match */
if (dmic_prm[di]->pdm[i].id == config->dmic.pdm[j].id)
memcpy(&dmic_prm[di]->pdm[i],
if (dmic_prm[di]->pdm[i].id == config->dmic.pdm[j].id) {
assert(!memcpy_s(&dmic_prm[di]->pdm[i],
sizeof(
dmic_prm[di]->pdm[i]),
&config->dmic.pdm[j],
sizeof(
struct sof_ipc_dai_dmic_pdm_ctrl));
struct sof_ipc_dai_dmic_pdm_ctrl)));
}
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/drivers/intel/cavs/sue-ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ void ipc_platform_do_cmd(struct ipc *ipc)
/* perform command and return any error */
err = ipc_cmd();
if (err > 0) {
mailbox_hostbox_read(&reply, 0, sizeof(reply));
mailbox_hostbox_read(&reply, SOF_IPC_MSG_MAX_SIZE,
0, sizeof(reply));
goto done; /* reply created and copied by cmd() */
} else if (err < 0) {
/* send std error reply */
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/intel/haswell/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ static void do_notify(void)

/* copy the data returned from DSP */
if (msg->rx_size && msg->rx_size < SOF_IPC_MSG_MAX_SIZE)
mailbox_dspbox_read(msg->rx_data, 0, msg->rx_size);
mailbox_dspbox_read(msg->rx_data, SOF_IPC_MSG_MAX_SIZE,
0, msg->rx_size);

/* any callback ? */
if (msg->cb)
Expand Down
3 changes: 2 additions & 1 deletion src/include/sof/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,9 @@ static inline uint32_t dump_stack(uint32_t p, void *addr, size_t offset,
size = limit;

/* copy stack contents and writeback */
rmemcpy(addr, (void*)stack_top, size - sizeof(void *));
assert(!memcpy_s(addr, limit, (void *)stack_top, size - sizeof(void *)));
dcache_writeback_region(addr, size - sizeof(void *));

return p;
}

Expand Down
28 changes: 20 additions & 8 deletions src/include/sof/mailbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <arch/cache.h>
#include <stdint.h>
#include <sof/string.h>
#include <sof/panic.h>

/* For those platform did not have SW_REG window, use DEBUG at now */
#ifndef MAILBOX_SW_REG_BASE
Expand Down Expand Up @@ -72,36 +73,47 @@
static inline
void mailbox_dspbox_write(size_t offset, const void *src, size_t bytes)
{
rmemcpy((void *)(MAILBOX_DSPBOX_BASE + offset), src, bytes);
assert(!memcpy_s((void *)(MAILBOX_DSPBOX_BASE + offset),
MAILBOX_DSPBOX_SIZE - offset - MAILBOX_DSPBOX_BASE,
src, bytes));
dcache_writeback_region((void *)(MAILBOX_DSPBOX_BASE + offset), bytes);
}

static inline
void mailbox_dspbox_read(void *dest, size_t offset, size_t bytes)
void mailbox_dspbox_read(void *dest, size_t dest_size,
size_t offset, size_t bytes)
{
dcache_invalidate_region((void *)(MAILBOX_DSPBOX_BASE + offset), bytes);
rmemcpy(dest, (void *)(MAILBOX_DSPBOX_BASE + offset), bytes);
dcache_invalidate_region((void *)(MAILBOX_DSPBOX_BASE + offset),
bytes);
assert(!memcpy_s(dest, dest_size, (void *)(MAILBOX_DSPBOX_BASE + offset),
bytes));
}

static inline
void mailbox_hostbox_write(size_t offset, const void *src, size_t bytes)
{
rmemcpy((void *)(MAILBOX_HOSTBOX_BASE + offset), src, bytes);
assert(!memcpy_s((void *)(MAILBOX_HOSTBOX_BASE + offset),
MAILBOX_HOSTBOX_SIZE - offset - MAILBOX_HOSTBOX_BASE,
src, bytes));
dcache_writeback_region((void *)(MAILBOX_HOSTBOX_BASE + offset), bytes);
}

static inline
void mailbox_hostbox_read(void *dest, size_t offset, size_t bytes)
void mailbox_hostbox_read(void *dest, size_t dest_size,
size_t offset, size_t bytes)
{
dcache_invalidate_region((void *)(MAILBOX_HOSTBOX_BASE + offset),
bytes);
rmemcpy(dest, (void *)(MAILBOX_HOSTBOX_BASE + offset), bytes);
assert(!memcpy_s(dest, dest_size, (void *)(MAILBOX_HOSTBOX_BASE + offset),
bytes));
}

static inline
void mailbox_stream_write(size_t offset, const void *src, size_t bytes)
{
rmemcpy((void *)(MAILBOX_STREAM_BASE + offset), src, bytes);
assert(!memcpy_s((void *)(MAILBOX_STREAM_BASE + offset),
MAILBOX_STREAM_SIZE - offset - MAILBOX_STREAM_BASE,
src, bytes));
dcache_writeback_region((void *)(MAILBOX_STREAM_BASE + offset),
bytes);
}
Expand Down
4 changes: 4 additions & 0 deletions src/include/sof/panic.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#define __INCLUDE_SOF_IPC_PANIC__

#include <stdint.h>
#include <uapi/ipc/trace.h>

struct sof_ipc_panic_info;

Expand All @@ -43,4 +44,7 @@ void __panic(uint32_t p, char *filename, uint32_t linenum);
/* panic dump filename and linenumber of the call */
#define panic(x) __panic((x), (__FILE__), (__LINE__))

/* runtime assertion */
#define assert(cond) (void)((cond) || (panic(SOF_IPC_PANIC_ASSERT), 0))

#endif
3 changes: 0 additions & 3 deletions src/include/sof/sof.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ struct sa;
__attribute__((unused)) \
typedef char META_CONCAT(assertion_failed_, MESSAGE)[(COND) ? 1 : -1]

/* runtime assertion */
#define assert(cond) (void)((cond) || (panic(SOF_IPC_PANIC_ASSERT), 0))

/* general firmware context */
struct sof {
/* init data */
Expand Down
14 changes: 8 additions & 6 deletions src/ipc/handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,16 +105,17 @@
#define _IPC_COPY_CMD(rx, tx, rx_size) \
do { \
if (rx_size > tx->size) { \
memcpy(rx, tx, tx->size); \
assert(!memcpy_s(rx, rx_size, tx, tx->size)); \
bzero((void *)rx + tx->size, rx_size - tx->size);\
trace_ipc("ipc: hdr 0x%x rx (%d) > tx (%d)", \
rx->cmd, rx_size, tx->size); \
} else if (tx->size > rx_size) { \
memcpy(rx, tx, rx_size); \
assert(!memcpy_s(rx, rx_size, tx, rx_size)); \
trace_ipc("ipc: hdr 0x%x tx (%d) > rx (%d)", \
rx->cmd, tx->size, rx_size); \
} else \
memcpy(rx, tx, rx_size); \
assert(!memcpy_s(rx, rx_size, tx, rx_size)); \
\
} while (0)

/* copies whole message from Tx to Rx, follows above ABI rules */
Expand All @@ -131,7 +132,7 @@ static inline struct sof_ipc_cmd_hdr *mailbox_validate(void)
struct sof_ipc_cmd_hdr *hdr = _ipc->comp_data;

/* read component values from the inbox */
mailbox_hostbox_read(hdr, 0, sizeof(*hdr));
mailbox_hostbox_read(hdr, SOF_IPC_MSG_MAX_SIZE, 0, sizeof(*hdr));

/* validate component header */
if (hdr->size > SOF_IPC_MSG_MAX_SIZE) {
Expand All @@ -140,7 +141,8 @@ static inline struct sof_ipc_cmd_hdr *mailbox_validate(void)
}

/* read rest of component data */
mailbox_hostbox_read(hdr + 1, sizeof(*hdr), hdr->size - sizeof(*hdr));
mailbox_hostbox_read(hdr + 1, SOF_IPC_MSG_MAX_SIZE,
sizeof(*hdr), hdr->size - sizeof(*hdr));

dcache_writeback_region(hdr, hdr->size);

Expand Down Expand Up @@ -1247,7 +1249,7 @@ int ipc_queue_host_message(struct ipc *ipc, uint32_t header, void *tx_data,

/* copy mailbox data to message */
if (tx_bytes > 0 && tx_bytes < SOF_IPC_MSG_MAX_SIZE)
rmemcpy(msg->tx_data, tx_data, tx_bytes);
assert(!memcpy_s(msg->tx_data, msg->tx_size, tx_data, tx_bytes));

if (!found) {
/* now queue the message */
Expand Down
17 changes: 10 additions & 7 deletions src/lib/panic.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void dump_panicinfo(void *addr, struct sof_ipc_panic_info *panic_info)
{
if (!panic_info)
return;
rmemcpy(addr, panic_info, sizeof(struct sof_ipc_panic_info));
memcpy(addr, panic_info, sizeof(struct sof_ipc_panic_info));
dcache_writeback_region(addr, sizeof(struct sof_ipc_panic_info));
}

Expand Down Expand Up @@ -95,18 +95,21 @@ void panic_rewind(uint32_t p, uint32_t stack_rewind_frames,

void __panic(uint32_t p, char *filename, uint32_t linenum)
{
struct sof_ipc_panic_info panicinfo;
struct sof_ipc_panic_info panicinfo = { .linenum = linenum };
int strlen;

strlen = rstrlen(filename);

if (strlen >= SOF_TRACE_FILENAME_SIZE) {
rmemcpy(panicinfo.filename, filename + strlen -
SOF_TRACE_FILENAME_SIZE, SOF_TRACE_FILENAME_SIZE);
rmemcpy(panicinfo.filename, "...", 3);
memcpy_s(panicinfo.filename, sizeof(panicinfo.filename),
filename + strlen - SOF_TRACE_FILENAME_SIZE,
SOF_TRACE_FILENAME_SIZE);
memcpy_s(panicinfo.filename, sizeof(panicinfo.filename),
"...", 3);
} else {
rmemcpy(panicinfo.filename, filename, strlen + 1);
memcpy_s(panicinfo.filename, sizeof(panicinfo.filename),
filename, strlen + 1);
}
panicinfo.linenum = linenum;

panic_rewind(p, 0, &panicinfo);
}
3 changes: 3 additions & 0 deletions src/library/include/platform/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@
#define SOF_STACK_SIZE 0x1000

#define MAILBOX_DSPBOX_BASE 0
#define MAILBOX_DSPBOX_SIZE 0x400
#define MAILBOX_HOSTBOX_BASE 0
#define MAILBOX_HOSTBOX_SIZE 0x400
#define MAILBOX_BASE 0
#define MAILBOX_BASE_SIZE 0x400

#endif