Message ID | 20221210073218.17350-4-yunfei.dong@mediatek.com |
---|---|
State | New |
Headers | show |
Series | media: mediatek: vcodec: Fix power_VideoCall test fail | expand |
Il 10/12/22 08:32, Yunfei Dong ha scritto: > 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: 365e4ba01df4 ("media: mtk-vcodec: Add work queue for core hardware decode") > Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com> > --- > .../platform/mediatek/vcodec/vdec_msg_queue.c | 16 ++++++++++++++++ > .../platform/mediatek/vcodec/vdec_msg_queue.h | 2 ++ > 2 files changed, 18 insertions(+) > > diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > index 2b88065d4d2a..6275536d5063 100644 > --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > @@ -182,9 +182,24 @@ 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 vdec_msg_queue_ctx *core_ctx; > 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) { > + spin_lock(&msg_queue->lat_ctx.ready_lock); > + list_move(&buf->core_list, &core_ctx->ready_queue); > + spin_unlock(&msg_queue->lat_ctx.ready_lock); > + queue_work(buf->ctx->dev->core_workqueue, > + &buf->ctx->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, > msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT, > @@ -268,6 +283,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue, > vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0); > INIT_WORK(&msg_queue->core_work, vdec_msg_queue_core_work); > > + msg_queue->ctx = ctx; I'd move that at the beginning of this function, even before calling vdec_msg_queue_init_ctx(), as this assignment is not at all expensive. In any case, Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c index 2b88065d4d2a..6275536d5063 100644 --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c @@ -182,9 +182,24 @@ 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 vdec_msg_queue_ctx *core_ctx; 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) { + spin_lock(&msg_queue->lat_ctx.ready_lock); + list_move(&buf->core_list, &core_ctx->ready_queue); + spin_unlock(&msg_queue->lat_ctx.ready_lock); + queue_work(buf->ctx->dev->core_workqueue, + &buf->ctx->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, msg_queue->lat_ctx.ready_num == NUM_BUFFER_COUNT, @@ -268,6 +283,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue, vdec_msg_queue_init_ctx(&msg_queue->lat_ctx, MTK_VDEC_LAT0); INIT_WORK(&msg_queue->core_work, vdec_msg_queue_core_work); + msg_queue->ctx = ctx; atomic_set(&msg_queue->lat_list_cnt, 0); atomic_set(&msg_queue->core_list_cnt, 0); mutex_init(&msg_queue->list_cnt_mutex); diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h index 94e01a618c5a..53ad05396c8c 100644 --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h @@ -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 @@ -86,6 +87,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;
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: 365e4ba01df4 ("media: mtk-vcodec: Add work queue for core hardware decode") Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com> --- .../platform/mediatek/vcodec/vdec_msg_queue.c | 16 ++++++++++++++++ .../platform/mediatek/vcodec/vdec_msg_queue.h | 2 ++ 2 files changed, 18 insertions(+)