media: hantro: move postproc enablement for old cores
authorJernej Skrabec <jernej.skrabec@gmail.com>
Mon, 29 Nov 2021 18:26:29 +0000 (19:26 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Thu, 16 Dec 2021 19:54:54 +0000 (20:54 +0100)
Older G2 cores, like that in Allwinner H6, seem to have issue with
latching postproc register values if this is first thing done in job.
Moving that to the end solves the issue.

Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
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

index 83ed25d9657b8422ab964a36cb0c0219a3dfbd4c..06d0f3597694a675e730a668b25f2b02158ddb34 100644 (file)
@@ -75,6 +75,7 @@ struct hantro_irq {
  * @num_regs:                  number of register range names in the array
  * @double_buffer:             core needs double buffering
  * @legacy_regs:               core uses legacy register set
+ * @late_postproc:             postproc must be set up at the end of the job
  */
 struct hantro_variant {
        unsigned int enc_offset;
@@ -98,6 +99,7 @@ struct hantro_variant {
        int num_regs;
        unsigned int double_buffer : 1;
        unsigned int legacy_regs : 1;
+       unsigned int late_postproc : 1;
 };
 
 /**
index 770f4ce71d295142b5446625bf718a0c1aa06fa2..33bf78be145b5f2238d6fd67b6407c2cc6e44892 100644 (file)
@@ -130,7 +130,7 @@ void hantro_start_prepare_run(struct hantro_ctx *ctx)
        v4l2_ctrl_request_setup(src_buf->vb2_buf.req_obj.req,
                                &ctx->ctrl_handler);
 
-       if (!ctx->is_encoder) {
+       if (!ctx->is_encoder && !ctx->dev->variant->late_postproc) {
                if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt))
                        hantro_postproc_enable(ctx);
                else
@@ -142,6 +142,13 @@ void hantro_end_prepare_run(struct hantro_ctx *ctx)
 {
        struct vb2_v4l2_buffer *src_buf;
 
+       if (!ctx->is_encoder && ctx->dev->variant->late_postproc) {
+               if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt))
+                       hantro_postproc_enable(ctx);
+               else
+                       hantro_postproc_disable(ctx);
+       }
+
        src_buf = hantro_get_src_buf(ctx);
        v4l2_ctrl_request_complete(src_buf->vb2_buf.req_obj.req,
                                   &ctx->ctrl_handler);