fuzzer: cleanup mailbox platform abstraction

Pass mailbox as parameter and add convenience helper for platform ops.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
This commit is contained in:
Liam Girdwood 2019-09-14 14:48:30 +01:00 committed by Liam Girdwood
parent 29a9b9d529
commit bf72bf7a7b
3 changed files with 45 additions and 18 deletions

View File

@ -113,13 +113,14 @@ struct fuzz {
};
/* called by platform when it receives IPC message */
void fuzzer_ipc_msg_rx(struct fuzz *fuzzer);
void fuzzer_ipc_msg_rx(struct fuzz *fuzzer, struct mailbox *mailbox);
/* called by platform when it receives IPC message reply */
void fuzzer_ipc_msg_reply(struct fuzz *fuzzer);
void fuzzer_ipc_msg_reply(struct fuzz *fuzzer, struct mailbox *mailbox);
/* called by platform when FW crashses */
void fuzzer_ipc_crash(struct fuzz *fuzzer, unsigned int offset);
void fuzzer_ipc_crash(struct fuzz *fuzzer, struct mailbox *mailbox,
unsigned int offset);
/* called by platforms to allocate memory/register regions */
void *fuzzer_create_memory_region(struct fuzz *fuzzer, int id, int idx);
@ -132,6 +133,29 @@ int fuzzer_send_msg(struct fuzz *fuzzer);
/* topology */
int parse_tplg(struct fuzz *fuzzer, char *tplg_filename);
/* Convenience platform ops */
static inline void fuzzer_mailbox_read(struct fuzz *fuzzer,
struct mailbox *mailbox, int offset,
void *dest, size_t bytes)
{
fuzzer->platform->mailbox_read(fuzzer, mailbox->offset + offset,
dest, bytes);
}
static inline void fuzzer_mailbox_write(struct fuzz *fuzzer,
struct mailbox *mailbox, int offset,
void *src, size_t bytes)
{
fuzzer->platform->mailbox_write(fuzzer, mailbox->offset + offset,
src, bytes);
}
static inline void fuzzer_fw_ready(struct fuzz *fuzzer)
{
fuzzer->platform->fw_ready(fuzzer);
}
extern struct fuzz_platform byt_platform;
extern struct fuzz_platform cht_platform;

View File

@ -158,14 +158,14 @@ void fuzzer_free_regions(struct fuzz *fuzzer)
}
/* called by platform when it receives IPC message */
void fuzzer_ipc_msg_rx(struct fuzz *fuzzer)
void fuzzer_ipc_msg_rx(struct fuzz *fuzzer, struct mailbox *mailbox)
{
struct sof_ipc_comp_reply r;
struct sof_ipc_cmd_hdr hdr;
uint32_t cmd;
/* read mailbox */
fuzzer->platform->mailbox_read(fuzzer, 0, &hdr, sizeof(hdr));
fuzzer_mailbox_read(fuzzer, mailbox, 0, &hdr, sizeof(hdr));
cmd = hdr.cmd & SOF_GLB_TYPE_MASK;
/* check message type */
@ -174,7 +174,7 @@ void fuzzer_ipc_msg_rx(struct fuzz *fuzzer)
fprintf(stderr, "error: ipc reply unknown\n");
break;
case SOF_IPC_FW_READY:
fuzzer->platform->fw_ready(fuzzer);
fuzzer_fw_ready(fuzzer);
fuzzer->boot_complete = 1;
break;
case SOF_IPC_GLB_COMPOUND:
@ -183,16 +183,17 @@ void fuzzer_ipc_msg_rx(struct fuzz *fuzzer)
case SOF_IPC_GLB_COMP_MSG:
case SOF_IPC_GLB_STREAM_MSG:
case SOF_IPC_GLB_TRACE_MSG:
fuzzer->platform->mailbox_read(fuzzer, 0, &r, sizeof(r));
fuzzer_mailbox_read(fuzzer, mailbox, 0, &r, sizeof(r));
break;
default:
fprintf(stderr, "error: unknown DSP message 0x%x\n", cmd);
break;
}
}
/* called by platform when it receives IPC message reply */
void fuzzer_ipc_msg_reply(struct fuzz *fuzzer)
void fuzzer_ipc_msg_reply(struct fuzz *fuzzer, struct mailbox *mailbox)
{
int ret;
@ -209,7 +210,8 @@ void fuzzer_ipc_msg_reply(struct fuzz *fuzzer)
}
/* called by platform when FW crashses */
void fuzzer_ipc_crash(struct fuzz *fuzzer, unsigned int offset)
void fuzzer_ipc_crash(struct fuzz *fuzzer, struct mailbox *mailbox,
unsigned int offset)
{
/* TODO: DSP FW has crashed. dump stack, regs, last IPC, log etc */
fprintf(stderr, "error: DSP FW crash\n");

View File

@ -287,7 +287,7 @@ static int byt_irq_thread(int irq, void *context)
* because the done bit can't be set in cmd_done function
* which is triggered by msg
*/
fuzzer_ipc_msg_reply(fuzzer);
fuzzer_ipc_msg_reply(fuzzer, &data->host_box);
byt_cmd_done(fuzzer, SOF_IPC_DSP_REPLY);
return IRQ_HANDLED;
}
@ -304,10 +304,10 @@ static int byt_irq_thread(int irq, void *context)
/* read mailbox */
if ((ipcd & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
fuzzer_ipc_crash(fuzzer, BYT_PANIC_OFFSET(ipcd) +
MBOX_OFFSET);
fuzzer_ipc_crash(fuzzer, &data->dsp_box,
BYT_PANIC_OFFSET(ipcd) + MBOX_OFFSET);
} else {
fuzzer_ipc_msg_rx(fuzzer);
fuzzer_ipc_msg_rx(fuzzer, &data->dsp_box);
}
if (!data->boot_complete && fuzzer->boot_complete) {
@ -329,7 +329,7 @@ static int byt_send_msg(struct fuzz *fuzzer, struct ipc_msg *msg)
uint64_t cmd = msg->header;
/* send the message */
mailbox_write(fuzzer, data->host_box.offset, msg->msg_data,
fuzzer_mailbox_write(fuzzer, &data->host_box, 0, msg->msg_data,
msg->msg_size);
dsp_write64(fuzzer, BYT_DSP_BAR, SHIM_IPCX,
cmd | SHIM_BYT_IPCX_BUSY);
@ -346,7 +346,7 @@ static int byt_get_reply(struct fuzz *fuzzer, struct ipc_msg *msg)
uint32_t size;
/* get reply */
mailbox_read(fuzzer, data->host_box.offset, &reply, sizeof(reply));
fuzzer_mailbox_read(fuzzer, &data->host_box, 0, &reply, sizeof(reply));
if (reply.error < 0) {
size = sizeof(reply);
@ -366,8 +366,8 @@ static int byt_get_reply(struct fuzz *fuzzer, struct ipc_msg *msg)
/* read the message */
if (msg->msg_data && size > 0)
mailbox_read(fuzzer, data->host_box.offset, msg->reply_data,
size);
fuzzer_mailbox_read(fuzzer, &data->host_box, 0,
msg->reply_data, size);
return ret;
}
@ -468,7 +468,8 @@ static void byt_fw_ready(struct fuzz *fuzzer)
uint32_t offset = MBOX_OFFSET;
/* read fw_ready data from mailbox */
mailbox_read(fuzzer, 0, &fw_ready, sizeof(fw_ready));
fuzzer_mailbox_read(fuzzer, &data->dsp_box, 0,
&fw_ready, sizeof(fw_ready));
/*
* Hardcode offsets.