Message ID | 20221210073218.17350-2-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: > Using lat_buf to share decoder information between lat and core work > queue, adding params to record the buf count. > > 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 | 32 ++++++++++++++++++- > .../platform/mediatek/vcodec/vdec_msg_queue.h | 9 ++++++ > 2 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > index dc2004790a47..af7ddba1923a 100644 > --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > @@ -52,6 +52,30 @@ static struct list_head *vdec_get_buf_list(int hardware_index, struct vdec_lat_b > } > } > > +static void vdec_msg_queue_inc(struct vdec_msg_queue *msg_queue, int hardware_index) > +{ > + mutex_lock(&msg_queue->list_cnt_mutex); I doubt that you need to use this mutex, as you're using atomics... > + > + if (hardware_index == MTK_VDEC_CORE) > + atomic_inc(&msg_queue->core_list_cnt); > + else > + atomic_inc(&msg_queue->lat_list_cnt); > + This branch (with the relevant appropriate changes) can be simplified as atomic_inc(&msg_queue->list_cnt[hardware_index]); ...where list_cnt is an array, and hardware_index is an enumeration. > + mutex_unlock(&msg_queue->list_cnt_mutex); > +} > + > +static void vdec_msg_queue_dec(struct vdec_msg_queue *msg_queue, int hardware_index) > +{ > + mutex_lock(&msg_queue->list_cnt_mutex); > + > + if (hardware_index == MTK_VDEC_CORE) > + atomic_dec(&msg_queue->core_list_cnt); > + else > + atomic_dec(&msg_queue->lat_list_cnt); Same here. > + > + mutex_unlock(&msg_queue->list_cnt_mutex); > +} > + Regards, Angelo
Hi Angelo, Thanks for your suggestion. On Tue, 2022-12-13 at 10:09 +0100, AngeloGioacchino Del Regno wrote: > Il 10/12/22 08:32, Yunfei Dong ha scritto: > > Using lat_buf to share decoder information between lat and core > > work > > queue, adding params to record the buf count. > > > > 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 | 32 > > ++++++++++++++++++- > > .../platform/mediatek/vcodec/vdec_msg_queue.h | 9 ++++++ > > 2 files changed, 40 insertions(+), 1 deletion(-) > > > > diff --git > > a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > > b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > > index dc2004790a47..af7ddba1923a 100644 > > --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > > +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c > > @@ -52,6 +52,30 @@ static struct list_head *vdec_get_buf_list(int > > hardware_index, struct vdec_lat_b > > } > > } > > > > +static void vdec_msg_queue_inc(struct vdec_msg_queue *msg_queue, > > int hardware_index) > > +{ > > + mutex_lock(&msg_queue->list_cnt_mutex); > > I doubt that you need to use this mutex, as you're using atomics... > Can be removed. > > + > > + if (hardware_index == MTK_VDEC_CORE) > > + atomic_inc(&msg_queue->core_list_cnt); > > + else > > + atomic_inc(&msg_queue->lat_list_cnt); > > + > > This branch (with the relevant appropriate changes) can be simplified > as > > atomic_inc(&msg_queue->list_cnt[hardware_index]); > > ...where list_cnt is an array, and hardware_index is an enumeration. > Only use lat and core, no need to using a array for every hardware. Best Regards, Yunfei Dong > > + mutex_unlock(&msg_queue->list_cnt_mutex); > > +} > > + > > +static void vdec_msg_queue_dec(struct vdec_msg_queue *msg_queue, > > int hardware_index) > > +{ > > + mutex_lock(&msg_queue->list_cnt_mutex); > > + > > + if (hardware_index == MTK_VDEC_CORE) > > + atomic_dec(&msg_queue->core_list_cnt); > > + else > > + atomic_dec(&msg_queue->lat_list_cnt); > > Same here. > > > + > > + mutex_unlock(&msg_queue->list_cnt_mutex); > > +} > > + > > Regards, > Angelo >
diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c index dc2004790a47..af7ddba1923a 100644 --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c @@ -52,6 +52,30 @@ static struct list_head *vdec_get_buf_list(int hardware_index, struct vdec_lat_b } } +static void vdec_msg_queue_inc(struct vdec_msg_queue *msg_queue, int hardware_index) +{ + mutex_lock(&msg_queue->list_cnt_mutex); + + if (hardware_index == MTK_VDEC_CORE) + atomic_inc(&msg_queue->core_list_cnt); + else + atomic_inc(&msg_queue->lat_list_cnt); + + mutex_unlock(&msg_queue->list_cnt_mutex); +} + +static void vdec_msg_queue_dec(struct vdec_msg_queue *msg_queue, int hardware_index) +{ + mutex_lock(&msg_queue->list_cnt_mutex); + + if (hardware_index == MTK_VDEC_CORE) + atomic_dec(&msg_queue->core_list_cnt); + else + atomic_dec(&msg_queue->lat_list_cnt); + + mutex_unlock(&msg_queue->list_cnt_mutex); +} + int vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, struct vdec_lat_buf *buf) { struct list_head *head; @@ -72,6 +96,7 @@ int vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, struct vdec_lat_buf queue_work(buf->ctx->dev->core_workqueue, &buf->ctx->msg_queue.core_work); + vdec_msg_queue_inc(&buf->ctx->msg_queue, msg_ctx->hardware_index); mtk_v4l2_debug(3, "enqueue buf type: %d addr: 0x%p num: %d", msg_ctx->hardware_index, buf, msg_ctx->ready_num); spin_unlock(&msg_ctx->ready_lock); @@ -127,6 +152,7 @@ struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct vdec_msg_queue_ctx *msg_ctx) return NULL; } list_del(head); + vdec_msg_queue_dec(&buf->ctx->msg_queue, msg_ctx->hardware_index); msg_ctx->ready_num--; mtk_v4l2_debug(3, "dqueue buf type:%d addr: 0x%p num: %d", @@ -241,10 +267,14 @@ 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); + + atomic_set(&msg_queue->lat_list_cnt, 0); + atomic_set(&msg_queue->core_list_cnt, 0); + mutex_init(&msg_queue->list_cnt_mutex); + msg_queue->wdma_addr.size = vde_msg_queue_get_trans_size(ctx->picinfo.buf_w, ctx->picinfo.buf_h); - err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr); if (err) { mtk_v4l2_err("failed to allocate wdma_addr buf"); diff --git a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h index c43d427f5f54..94e01a618c5a 100644 --- a/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h +++ b/drivers/media/platform/mediatek/vcodec/vdec_msg_queue.h @@ -72,6 +72,10 @@ struct vdec_lat_buf { * @wdma_wptr_addr: ube write point * @core_work: core hardware work * @lat_ctx: used to store lat buffer list + * + * @lat_list_cnt: used to record each instance lat list count + * @core_list_cnt: used to record each instance core list count + * @list_cnt_mutex: used to protect list count */ struct vdec_msg_queue { struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT]; @@ -82,6 +86,11 @@ struct vdec_msg_queue { struct work_struct core_work; struct vdec_msg_queue_ctx lat_ctx; + + atomic_t lat_list_cnt; + atomic_t core_list_cnt; + /* Protects access to lat and core list cnt */ + struct mutex list_cnt_mutex; }; /**
Using lat_buf to share decoder information between lat and core work queue, adding params to record the buf count. 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 | 32 ++++++++++++++++++- .../platform/mediatek/vcodec/vdec_msg_queue.h | 9 ++++++ 2 files changed, 40 insertions(+), 1 deletion(-)