mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-02 16:44:59 +00:00
media: mediatek: vcodec: add core decode done event
Need to make sure core decode done before current instance is free.
Fixes: 365e4ba01d
("media: mtk-vcodec: Add work queue for core hardware decode")
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
2cfca6c1bf
commit
d227af847a
@ -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)
|
|||||||
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,
|
|||||||
|
|
||||||
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 {
|
|||||||
*
|
*
|
||||||
* @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 {
|
|||||||
|
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user