@@ -912,6 +912,48 @@ static int mtk_jpeg_set_dec_dst(struct mtk_jpeg_ctx *ctx,
return 0;
}
+void mtk_jpeg_put_buf(struct mtk_jpegenc_comp_dev *jpeg)
+{
+ struct mtk_jpeg_ctx *ctx;
+ struct vb2_v4l2_buffer *dst_buffer;
+ struct list_head *temp_entry;
+ struct list_head *pos = NULL;
+ struct mtk_jpeg_src_buf *dst_done_buf, *tmp_dst_done_buf;
+ unsigned long flags;
+
+ ctx = jpeg->hw_param.curr_ctx;
+ if (!ctx) {
+ dev_err(jpeg->dev, "comp_jpeg ctx fail !!!\n");
+ return;
+ }
+ dst_buffer = jpeg->hw_param.dst_buffer;
+ if (!dst_buffer) {
+ dev_err(jpeg->dev, "comp_jpeg dst_buffer fail !!!\n");
+ return;
+ }
+
+ dst_done_buf = mtk_jpeg_vb2_to_srcbuf(&dst_buffer->vb2_buf);
+ spin_lock_irqsave(&ctx->done_queue_lock, flags);
+ list_add_tail(&dst_done_buf->list, &ctx->dst_done_queue);
+
+ while (!list_empty(&ctx->dst_done_queue) &&
+ (pos != &ctx->dst_done_queue)) {
+ list_for_each_prev_safe(pos, temp_entry,
+ (&ctx->dst_done_queue)) {
+ tmp_dst_done_buf = list_entry(pos,
+ struct mtk_jpeg_src_buf, list);
+ if (tmp_dst_done_buf->frame_num ==
+ ctx->last_done_frame_num) {
+ list_del(&tmp_dst_done_buf->list);
+ v4l2_m2m_buf_done(&tmp_dst_done_buf->b,
+ VB2_BUF_STATE_DONE);
+ ctx->last_done_frame_num++;
+ }
+ }
+ }
+ spin_unlock_irqrestore(&ctx->done_queue_lock, flags);
+}
+
static int mtk_jpeg_select_hw(struct mtk_jpeg_ctx *ctx)
{
struct mtk_jpegenc_comp_dev *comp_jpeg;
@@ -1339,8 +1381,10 @@ static int mtk_jpeg_open(struct file *file)
goto free;
}
- if (jpeg->variant->is_encoder)
+ if (jpeg->variant->is_encoder) {
INIT_WORK(&ctx->jpeg_work, mtk_jpegenc_worker);
+ INIT_LIST_HEAD(&ctx->dst_done_queue);
+ }
v4l2_fh_init(&ctx->fh, vfd);
file->private_data = &ctx->fh;
@@ -233,8 +233,12 @@ struct mtk_jpeg_ctx {
struct work_struct jpeg_work;
u32 total_frame_num;
+ struct list_head dst_done_queue;
+ spinlock_t done_queue_lock;
+ u32 last_done_frame_num;
};
extern struct platform_driver mtk_jpegenc_hw_driver;
+void mtk_jpeg_put_buf(struct mtk_jpegenc_comp_dev *jpeg);
#endif /* _MTK_JPEG_CORE_H */
@@ -292,6 +292,7 @@ static void mtk_jpegenc_timeout_work(struct work_struct *work)
wake_up(&master_jpeg->hw_wq);
v4l2_m2m_buf_done(src_buf, buf_state);
+ mtk_jpeg_put_buf(cjpeg);
}
static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
@@ -329,8 +330,7 @@ static irqreturn_t mtk_jpegenc_hw_irq_handler(int irq, void *priv)
buf_state = VB2_BUF_STATE_DONE;
v4l2_m2m_buf_done(src_buf, buf_state);
- v4l2_m2m_buf_done(dst_buf, buf_state);
- v4l2_m2m_job_finish(master_jpeg->m2m_dev, ctx->fh.m2m_ctx);
+ mtk_jpeg_put_buf(jpeg);
clk_disable_unprepare(jpeg->pm.venc_clk.clk_info->jpegenc_clk);
pm_runtime_put(ctx->jpeg->dev);
if (ctx->fh.m2m_ctx &&
There are two HWs in mt8195. Since the two HWs run in parallel, it is necessary to reorder the output images to ensure that the order is consistent with the input images. Signed-off-by: kyrie.wu <kyrie.wu@mediatek.com> --- drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c | 46 ++++++++++++++++++++++- drivers/media/platform/mtk-jpeg/mtk_jpeg_core.h | 4 ++ drivers/media/platform/mtk-jpeg/mtk_jpeg_enc_hw.c | 4 +- 3 files changed, 51 insertions(+), 3 deletions(-)