static void IpcTask (void * pvParameters) { unsigned int msg, *local_vq_buf; int ret; struct virtqueue_buf virtq_buf; virtqueue_init(); nvic_enable_irq(MAILBOX_IRQ); enable_mailbox_irq(); for (;;) { xQueueReceive(MboxQueue, &msg, portMAX_DELAY); trace_printf("msg from mailbox : "); trace_value(msg); switch(msg) { case RP_MBOX_ECHO_REQUEST : mailbox_send(M3_TO_HOST_MBX, RP_MBOX_ECHO_REPLY); break; case HOST_TO_M3_VRING : ret = virtqueue_get_avail_buf(&virtqueue_list[msg], &virtq_buf); /* make a local copy of the buffer */ local_vq_buf = pvPortMalloc(RP_MSG_BUF_SIZE); memcpy(local_vq_buf, virtq_buf.buf_ptr, RP_MSG_BUF_SIZE); virtqueue_add_used_buf(&virtqueue_list[msg], virtq_buf.head); /* dispatch to the service queue */ rpmsg_dispatch_msg(local_vq_buf); break; case M3_TO_HOST_VRING : trace_printf("kick on vq0, dropping it \n"); xSemaphoreGive(InitDoneSemaphore); break; } } vTaskDelete(NULL); }
static int test_keyword_get_config(struct comp_dev *dev, struct sof_ipc_ctrl_data *cdata, int size) { struct comp_data *cd = comp_get_drvdata(dev); size_t bs; int ret = 0; trace_keyword("test_keyword_get_config()"); /* Copy back to user space */ bs = cd->config.size; trace_value(bs); if (bs == 0 || bs > size) return -EINVAL; assert(!memcpy_s(cdata->data->data, size, &cd->config, bs)); cdata->data->abi = SOF_ABI_VERSION; cdata->data->size = bs; return ret; }