mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
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: 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
f7a3780cf9
commit
2cfca6c1bf
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user