Skip to content

Commit

Permalink
media: mediatek: vcodec: move lat_buf to the top of core list
Browse files Browse the repository at this point in the history
Current instance will decode done when begin to wait lat buf full,
move the lat_buf of current instance to the top of core list to make
sure current instance's lat_buf will be used firstly.

Fixes: 365e4ba ("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>
  • Loading branch information
yunfei-mtk authored and mchehab committed Apr 10, 2023
1 parent f7a3780 commit 2cfca6c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
21 changes: 20 additions & 1 deletion drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,26 @@ void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue *msg_queue, uint64_t u

bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
{
struct vdec_lat_buf *buf, *tmp;
struct list_head *list_core[3];
struct vdec_msg_queue_ctx *core_ctx;
int ret, i, in_core_count = 0;
long timeout_jiff;
int ret;

core_ctx = &msg_queue->ctx->dev->msg_queue_core_ctx;
spin_lock(&core_ctx->ready_lock);
list_for_each_entry_safe(buf, tmp, &core_ctx->ready_queue, core_list) {
if (buf && buf->ctx == msg_queue->ctx) {
list_core[in_core_count++] = &buf->core_list;
list_del(&buf->core_list);
}
}

for (i = 0; i < in_core_count; i++) {
list_add(list_core[in_core_count - (1 + i)], &core_ctx->ready_queue);
queue_work(msg_queue->ctx->dev->core_workqueue, &msg_queue->core_work);
}
spin_unlock(&core_ctx->ready_lock);

timeout_jiff = msecs_to_jiffies(1000 * (NUM_BUFFER_COUNT + 2));
ret = wait_event_timeout(msg_queue->lat_ctx.ready_to_use,
Expand Down Expand Up @@ -257,6 +275,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
if (msg_queue->wdma_addr.size)
return 0;

msg_queue->ctx = ctx;
vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0);
INIT_WORK(&msg_queue->core_work, vdec_msg_queue_core_work);

Expand Down
2 changes: 2 additions & 0 deletions drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ struct vdec_lat_buf {
* @wdma_wptr_addr: ube write point
* @core_work: core hardware work
* @lat_ctx: used to store lat buffer list
* @ctx: point to mtk_vcodec_ctx
*
* @lat_list_cnt: used to record each instance lat list count
* @core_list_cnt: used to record each instance core list count
Expand All @@ -85,6 +86,7 @@ struct vdec_msg_queue {

struct work_struct core_work;
struct vdec_msg_queue_ctx lat_ctx;
struct mtk_vcodec_ctx *ctx;

atomic_t lat_list_cnt;
atomic_t core_list_cnt;
Expand Down

0 comments on commit 2cfca6c

Please sign in to comment.