Commit d227af84 authored by Yunfei Dong's avatar Yunfei Dong Committed by Mauro Carvalho Chehab

media: mediatek: vcodec: add core decode done event

Need to make sure core decode done before current instance is free.

Fixes: 365e4ba0 ("media: mtk-vcodec: Add work queue for core hardware decode")
Signed-off-by: default avatarYunfei Dong <yunfei.dong@mediatek.com>
Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 2cfca6c1
...@@ -196,7 +196,7 @@ bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue) ...@@ -196,7 +196,7 @@ bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
spin_unlock(&core_ctx->ready_lock); spin_unlock(&core_ctx->ready_lock);
timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2)); timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2));
ret = wait_event_timeout(msg_queue->lat_ctx.ready_to_use, ret = wait_event_timeout(msg_queue->ctx->msg_queue.core_dec_done,
msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT, msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT,
timeout_jiff); timeout_jiff);
if (ret) { if (ret) {
...@@ -257,6 +257,7 @@ static void vdec_msg_queue_core_work(struct work_struct *work) ...@@ -257,6 +257,7 @@ static void vdec_msg_queue_core_work(struct work_struct *work)
mtk_vcodec_dec_disable_hardware(ctx, MTK_VDEC_CORE); mtk_vcodec_dec_disable_hardware(ctx, MTK_VDEC_CORE);
vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf); vdec_msg_queue_qbuf(&ctx->msg_queue.lat_ctx, lat_buf);
wake_up_all(&ctx->msg_queue.core_dec_done);
if (atomic_read(&lat_buf->ctx->msg_queue.core_list_cnt)) { if (atomic_read(&lat_buf->ctx->msg_queue.core_list_cnt)) {
mtk_v4l2_debug(3, "re-schedule to decode for core: %d", mtk_v4l2_debug(3, "re-schedule to decode for core: %d",
dev->msg_queue_core_ctx.ready_num); dev->msg_queue_core_ctx.ready_num);
...@@ -281,6 +282,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue, ...@@ -281,6 +282,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
atomic_set(&msg_queue->lat_list_cnt, 0); atomic_set(&msg_queue->lat_list_cnt, 0);
atomic_set(&msg_queue->core_list_cnt, 0); atomic_set(&msg_queue->core_list_cnt, 0);
init_waitqueue_head(&msg_queue->core_dec_done);
msg_queue->wdma_addr.size = msg_queue->wdma_addr.size =
vde_msg_queue_get_trans_size(ctx->picinfo.buf_w, vde_msg_queue_get_trans_size(ctx->picinfo.buf_w,
......
...@@ -76,6 +76,7 @@ struct vdec_lat_buf { ...@@ -76,6 +76,7 @@ struct vdec_lat_buf {
* *
* @lat_list_cnt: used to record each instance lat list count * @lat_list_cnt: used to record each instance lat list count
* @core_list_cnt: used to record each instance core list count * @core_list_cnt: used to record each instance core list count
* @core_dec_done: core work queue decode done event
*/ */
struct vdec_msg_queue { struct vdec_msg_queue {
struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT]; struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT];
...@@ -90,6 +91,7 @@ struct vdec_msg_queue { ...@@ -90,6 +91,7 @@ struct vdec_msg_queue {
atomic_t lat_list_cnt; atomic_t lat_list_cnt;
atomic_t core_list_cnt; atomic_t core_list_cnt;
wait_queue_head_t core_dec_done;
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment