hantro: Move hantro_enc_buf_finish to JPEG codec_ops.done
authorEzequiel Garcia <ezequiel@collabora.com>
Wed, 1 Jul 2020 13:16:05 +0000 (15:16 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sun, 19 Jul 2020 11:25:22 +0000 (13:25 +0200)
hantro_enc_buf_finish is used only for JPEG, and so should
be moved to JPEG codec_ops.done.

This cleanup is also taking care of addressing
a subtle issue: checking the non-NULL bounce buffer
using ctx->jpeg_enc, which is a member of a union is
confusing and error-prone.

Note that the issue is currently innocuous because an
encoder context only supports JPEG.

The codec_ops.done has an argument that codec-specific code
shouldn't need, so drop that as well.

Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/hantro/hantro.h
drivers/staging/media/hantro/hantro_drv.c
drivers/staging/media/hantro/hantro_h1_jpeg_enc.c
drivers/staging/media/hantro/hantro_hw.h
drivers/staging/media/hantro/rk3288_vpu_hw.c

index 2284e23..65f9f7e 100644 (file)
@@ -212,9 +212,6 @@ struct hantro_dev {
  * @ctrl_handler:      Control handler used to register controls.
  * @jpeg_quality:      User-specified JPEG compression quality.
  *
- * @buf_finish:                Buffer finish. This depends on encoder or decoder
- *                     context, and it's called right before
- *                     calling v4l2_m2m_job_finish.
  * @codec_ops:         Set of operations related to codec mode.
  * @postproc:          Post-processing context.
  * @jpeg_enc:          JPEG-encoding context.
@@ -237,10 +234,6 @@ struct hantro_ctx {
        struct v4l2_ctrl_handler ctrl_handler;
        int jpeg_quality;
 
-       int (*buf_finish)(struct hantro_ctx *ctx,
-                         struct vb2_buffer *buf,
-                         unsigned int bytesused);
-
        const struct hantro_codec_ops *codec_ops;
        struct hantro_postproc_ctx postproc;
 
index 9145d02..88b5c59 100644 (file)
@@ -56,37 +56,12 @@ dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts)
        return hantro_get_dec_buf_addr(ctx, buf);
 }
 
-static int
-hantro_enc_buf_finish(struct hantro_ctx *ctx, struct vb2_buffer *buf,
-                     unsigned int bytesused)
-{
-       size_t avail_size;
-
-       avail_size = vb2_plane_size(buf, 0) - ctx->vpu_dst_fmt->header_size;
-       if (bytesused > avail_size)
-               return -EINVAL;
-       /*
-        * The bounce buffer is only for the JPEG encoder.
-        * TODO: Rework the JPEG encoder to eliminate the need
-        * for a bounce buffer.
-        */
-       if (ctx->jpeg_enc.bounce_buffer.cpu) {
-               memcpy(vb2_plane_vaddr(buf, 0) +
-                      ctx->vpu_dst_fmt->header_size,
-                      ctx->jpeg_enc.bounce_buffer.cpu, bytesused);
-       }
-       buf->planes[0].bytesused =
-               ctx->vpu_dst_fmt->header_size + bytesused;
-       return 0;
-}
-
 static void hantro_job_finish(struct hantro_dev *vpu,
                              struct hantro_ctx *ctx,
                              unsigned int bytesused,
                              enum vb2_buffer_state result)
 {
        struct vb2_v4l2_buffer *src, *dst;
-       int ret;
 
        pm_runtime_mark_last_busy(vpu->dev);
        pm_runtime_put_autosuspend(vpu->dev);
@@ -103,12 +78,6 @@ static void hantro_job_finish(struct hantro_dev *vpu,
        src->sequence = ctx->sequence_out++;
        dst->sequence = ctx->sequence_cap++;
 
-       if (ctx->buf_finish) {
-               ret = ctx->buf_finish(ctx, &dst->vb2_buf, bytesused);
-               if (ret)
-                       result = VB2_BUF_STATE_ERROR;
-       }
-
        v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx,
                                         result);
 }
@@ -124,8 +93,11 @@ void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,
         * the timeout expired. The watchdog is running,
         * and will take care of finishing the job.
         */
-       if (cancel_delayed_work(&vpu->watchdog_work))
+       if (cancel_delayed_work(&vpu->watchdog_work)) {
+               if (result == VB2_BUF_STATE_DONE && ctx->codec_ops->done)
+                       ctx->codec_ops->done(ctx);
                hantro_job_finish(vpu, ctx, bytesused, result);
+       }
 }
 
 void hantro_watchdog(struct work_struct *work)
@@ -414,7 +386,6 @@ static int hantro_open(struct file *filp)
        ctx->dev = vpu;
        if (func->id == MEDIA_ENT_F_PROC_VIDEO_ENCODER) {
                allowed_codecs = vpu->variant->codec & HANTRO_ENCODERS;
-               ctx->buf_finish = hantro_enc_buf_finish;
                ctx->is_encoder = true;
        } else if (func->id == MEDIA_ENT_F_PROC_VIDEO_DECODER) {
                allowed_codecs = vpu->variant->codec & HANTRO_DECODERS;
index b224184..b88dc4e 100644 (file)
@@ -137,3 +137,20 @@ void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx)
 
        vepu_write(vpu, reg, H1_REG_ENC_CTRL);
 }
+
+void hantro_jpeg_enc_done(struct hantro_ctx *ctx)
+{
+       struct hantro_dev *vpu = ctx->dev;
+       u32 bytesused = vepu_read(vpu, H1_REG_STR_BUF_LIMIT) / 8;
+       struct vb2_v4l2_buffer *dst_buf = hantro_get_dst_buf(ctx);
+
+       /*
+        * TODO: Rework the JPEG encoder to eliminate the need
+        * for a bounce buffer.
+        */
+       memcpy(vb2_plane_vaddr(&dst_buf->vb2_buf, 0) +
+              ctx->vpu_dst_fmt->header_size,
+              ctx->jpeg_enc.bounce_buffer.cpu, bytesused);
+       vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
+                             ctx->vpu_dst_fmt->header_size + bytesused);
+}
index 4053d87..2d6323c 100644 (file)
@@ -138,7 +138,7 @@ struct hantro_codec_ops {
        int (*init)(struct hantro_ctx *ctx);
        void (*exit)(struct hantro_ctx *ctx);
        void (*run)(struct hantro_ctx *ctx);
-       void (*done)(struct hantro_ctx *ctx, enum vb2_buffer_state);
+       void (*done)(struct hantro_ctx *ctx);
        void (*reset)(struct hantro_ctx *ctx);
 };
 
@@ -172,6 +172,7 @@ void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx);
 void rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx);
 int hantro_jpeg_enc_init(struct hantro_ctx *ctx);
 void hantro_jpeg_enc_exit(struct hantro_ctx *ctx);
+void hantro_jpeg_enc_done(struct hantro_ctx *ctx);
 
 dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx,
                                   unsigned int dpb_idx);
index 2f914b3..b1cf2ab 100644 (file)
@@ -180,6 +180,7 @@ static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = {
                .run = hantro_h1_jpeg_enc_run,
                .reset = rk3288_vpu_enc_reset,
                .init = hantro_jpeg_enc_init,
+               .done = hantro_jpeg_enc_done,
                .exit = hantro_jpeg_enc_exit,
        },
        [HANTRO_MODE_H264_DEC] = {