msg_queue
struct i2c_msg *msg_queue;
this_msg = idev->msg_queue++;
struct i2c_msg *next_msg = idev->msg_queue;
idev->msg_queue = msgs;
idev->msg_queue++;
struct vdec_msg_queue msg_queue;
vsi->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
vsi->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
vsi->trans.dma_addr = lat_buf->ctx->msg_queue.wdma_wptr_addr;
vsi->trans.dma_addr_end = lat_buf->ctx->msg_queue.wdma_rptr_addr;
vdec_msg_queue_deinit(&instance->ctx->msg_queue, instance->ctx);
vdec_msg_queue_wait_lat_buf_full(&instance->ctx->msg_queue);
if (vdec_msg_queue_init(&ctx->msg_queue, ctx,
lat_buf = vdec_msg_queue_dqbuf(&ctx->msg_queue.lat_ctx);
vdec_msg_queue_qbuf(&ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
vsi->trans.dma_addr_end += ctx->msg_queue.wdma_addr.dma_addr;
vdec_msg_queue_update_ube_wptr(&ctx->msg_queue, vsi->trans.dma_addr_end);
vdec_msg_queue_qbuf(&ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
vdec_msg_queue_update_ube_rptr(&ctx->msg_queue, instance->core_vsi->trans.dma_addr_end);
vdec_msg_queue_update_ube_rptr(&ctx->msg_queue, pfc->vsi.trans.dma_addr_end);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
vdec_msg_queue_deinit(&inst->ctx->msg_queue, inst->ctx);
inst->vsi_ext->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
inst->vsi_ext->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
inst->vsi_ext->trans.dma_addr_end = inst->ctx->msg_queue.wdma_rptr_addr;
inst->vsi_ext->trans.dma_addr = inst->ctx->msg_queue.wdma_wptr_addr;
inst->vsi_core_ext->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
inst->vsi_core_ext->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
lat_buf->ctx->msg_queue.wdma_addr.size;
vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
vdec_msg_queue_wait_lat_buf_full(&inst->ctx->msg_queue);
lat_buf = vdec_msg_queue_dqbuf(&inst->ctx->msg_queue.lat_ctx);
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
vdec_msg_queue_wait_lat_buf_full(&inst->ctx->msg_queue);
lat_buf = vdec_msg_queue_dqbuf(&inst->ctx->msg_queue.lat_ctx);
inst->vsi->wdma_start_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
inst->vsi->wdma_end_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
lat_buf->ctx->msg_queue.wdma_addr.size;
inst->vsi->trans_end = inst->ctx->msg_queue.wdma_rptr_addr;
inst->vsi->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
share_info->trans.dma_addr_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans.dma_addr_end);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
inst->vsi->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
inst->vsi->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
inst->vsi->trans.dma_addr_end = inst->ctx->msg_queue.wdma_rptr_addr;
inst->vsi->trans.dma_addr = inst->ctx->msg_queue.wdma_wptr_addr;
inst->vsi_core->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
inst->vsi_core->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
vdec_msg_queue_deinit(&inst->ctx->msg_queue, inst->ctx);
vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, share_info->trans.dma_addr_end);
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
vdec_msg_queue_wait_lat_buf_full(&inst->ctx->msg_queue);
lat_buf = vdec_msg_queue_dqbuf(&inst->ctx->msg_queue.lat_ctx);
vsi->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
vsi->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
vsi->trans.dma_addr = lat_buf->ctx->msg_queue.wdma_wptr_addr;
vsi->trans.dma_addr_end = lat_buf->ctx->msg_queue.wdma_rptr_addr;
vdec_msg_queue_deinit(&instance->ctx->msg_queue, instance->ctx);
vdec_msg_queue_wait_lat_buf_full(&instance->ctx->msg_queue);
if (vdec_msg_queue_init(&ctx->msg_queue, ctx,
lat_buf = vdec_msg_queue_dqbuf(&instance->ctx->msg_queue.lat_ctx);
vdec_msg_queue_update_ube_wptr(&ctx->msg_queue,
ctx->msg_queue.wdma_addr.dma_addr);
vdec_msg_queue_qbuf(&ctx->msg_queue.core_ctx, lat_buf);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
pfc->vsi.trans.dma_addr_end += ctx->msg_queue.wdma_addr.dma_addr;
vdec_msg_queue_update_ube_rptr(&ctx->msg_queue, pfc->vsi.trans.dma_addr_end);
vdec_msg_queue_update_ube_rptr(&ctx->msg_queue, pfc->vsi.trans.dma_addr_end);
vdec_msg_queue_dec(&buf->ctx->msg_queue, msg_ctx->hardware_index);
void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue *msg_queue, uint64_t ube_rptr)
spin_lock(&msg_queue->lat_ctx.ready_lock);
msg_queue->wdma_rptr_addr = ube_rptr;
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "update ube rprt (0x%llx)", ube_rptr);
spin_unlock(&msg_queue->lat_ctx.ready_lock);
void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue *msg_queue, uint64_t ube_wptr)
spin_lock(&msg_queue->lat_ctx.ready_lock);
msg_queue->wdma_wptr_addr = ube_wptr;
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "update ube wprt: (0x%llx 0x%llx) offset: 0x%llx",
msg_queue->wdma_rptr_addr, msg_queue->wdma_wptr_addr,
spin_unlock(&msg_queue->lat_ctx.ready_lock);
bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
if (atomic_read(&msg_queue->lat_list_cnt) == NUM_BUFFER_COUNT) {
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "wait buf full: (%d %d) ready:%d status:%d",
atomic_read(&msg_queue->lat_list_cnt),
atomic_read(&msg_queue->core_list_cnt),
msg_queue->lat_ctx.ready_num, msg_queue->status);
msg_queue->flush_done = false;
vdec_msg_queue_qbuf(&msg_queue->core_ctx, &msg_queue->empty_lat_buf);
wait_event(msg_queue->core_dec_done, msg_queue->flush_done);
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "flush done => ready_num:%d status:%d list(%d %d)",
msg_queue->lat_ctx.ready_num, msg_queue->status,
atomic_read(&msg_queue->lat_list_cnt),
atomic_read(&msg_queue->core_list_cnt));
void vdec_msg_queue_deinit(struct vdec_msg_queue *msg_queue,
mem = &msg_queue->wdma_addr;
lat_buf = &msg_queue->lat_buf[i];
if (msg_queue->wdma_addr.size)
cancel_work_sync(&msg_queue->core_work);
struct vdec_msg_queue *msg_queue =
container_of(msg_queue, struct mtk_vcodec_dec_ctx, msg_queue);
spin_lock(&msg_queue->core_ctx.ready_lock);
ctx->msg_queue.status &= ~CONTEXT_LIST_QUEUED;
spin_unlock(&msg_queue->core_ctx.ready_lock);
lat_buf = vdec_msg_queue_dqbuf(&msg_queue->core_ctx);
ctx->msg_queue.status = CONTEXT_LIST_DEC_DONE;
msg_queue->flush_done = true;
wake_up(&ctx->msg_queue.core_dec_done);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
if (!(ctx->msg_queue.status & CONTEXT_LIST_QUEUED) &&
atomic_read(&msg_queue->core_list_cnt)) {
spin_lock(&msg_queue->core_ctx.ready_lock);
ctx->msg_queue.status |= CONTEXT_LIST_QUEUED;
spin_unlock(&msg_queue->core_ctx.ready_lock);
queue_work(ctx->dev->core_workqueue, &msg_queue->core_work);
int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
if (msg_queue->wdma_addr.size)
vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0);
vdec_msg_queue_init_ctx(&msg_queue->core_ctx, MTK_VDEC_CORE);
INIT_WORK(&msg_queue->core_work, vdec_msg_queue_core_work);
atomic_set(&msg_queue->lat_list_cnt, 0);
atomic_set(&msg_queue->core_list_cnt, 0);
init_waitqueue_head(&msg_queue->core_dec_done);
msg_queue->status = CONTEXT_LIST_EMPTY;
msg_queue->wdma_addr.size =
err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr);
msg_queue->wdma_addr.size = 0;
msg_queue->wdma_rptr_addr = msg_queue->wdma_addr.dma_addr;
msg_queue->wdma_wptr_addr = msg_queue->wdma_addr.dma_addr;
msg_queue->empty_lat_buf.ctx = ctx;
msg_queue->empty_lat_buf.core_decode = NULL;
msg_queue->empty_lat_buf.is_last_frame = true;
msg_queue->ctx = ctx;
lat_buf = &msg_queue->lat_buf[i];
err = vdec_msg_queue_qbuf(&msg_queue->lat_ctx, lat_buf);
vdec_msg_queue_deinit(msg_queue, ctx);
static void vdec_msg_queue_inc(struct vdec_msg_queue *msg_queue, int hardware_index)
atomic_inc(&msg_queue->core_list_cnt);
atomic_inc(&msg_queue->lat_list_cnt);
static void vdec_msg_queue_dec(struct vdec_msg_queue *msg_queue, int hardware_index)
atomic_dec(&msg_queue->core_list_cnt);
atomic_dec(&msg_queue->lat_list_cnt);
vdec_msg_queue_inc(&buf->ctx->msg_queue, msg_ctx->hardware_index);
if (!(buf->ctx->msg_queue.status & CONTEXT_LIST_QUEUED)) {
queue_work(buf->ctx->dev->core_workqueue, &buf->ctx->msg_queue.core_work);
buf->ctx->msg_queue.status |= CONTEXT_LIST_QUEUED;
int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue *msg_queue, uint64_t ube_rptr);
void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue *msg_queue, uint64_t ube_wptr);
bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue);
void vdec_msg_queue_deinit(struct vdec_msg_queue *msg_queue,
user_service->msg_queue[user_service->msg_insert &
service->msg_queue[pos] = header;
header = service->msg_queue[pos];
header = user_service->msg_queue[m];
header = user_service->msg_queue[user_service->msg_remove &
struct vchiq_header *msg_queue[MSG_QUEUE_SIZE];
struct vchiq_header *msg_queue[VCHIQ_MAX_SLOTS];
static inline struct msg_queue *msq_obtain_object(struct ipc_namespace *ns, int id)
static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
return container_of(ipcp, struct msg_queue, q_perm);
struct msg_queue *msq;
static inline struct msg_queue *msq_obtain_object_check(struct ipc_namespace *ns,
return container_of(ipcp, struct msg_queue, q_perm);
static inline void msg_rmid(struct ipc_namespace *ns, struct msg_queue *s)
struct msg_queue *msq = container_of(p, struct msg_queue, q_perm);
struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
struct msg_queue *msq;
static inline bool msg_fits_inqueue(struct msg_queue *msq, size_t msgsz)
static inline void ss_add(struct msg_queue *msq,
static void ss_wakeup(struct msg_queue *msq,
static void expunge_all(struct msg_queue *msq, int res,
struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm);
struct msg_queue *msq;
msq = container_of(ipcp, struct msg_queue, q_perm);
struct msg_queue *msq;
static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg,
struct msg_queue *msq;