Commit 2cfca6c1 authored by Yunfei Dong's avatar Yunfei Dong Committed by Mauro Carvalho Chehab
Browse files

media: mediatek: vcodec: move lat_buf to the top of core list



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: 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 f7a3780c
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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);

+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -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;