From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B8092C433E2 for ; Mon, 29 Mar 2021 19:29:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7AA0C61935 for ; Mon, 29 Mar 2021 19:29:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231742AbhC2T23 (ORCPT ); Mon, 29 Mar 2021 15:28:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53666 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230287AbhC2T2M (ORCPT ); Mon, 29 Mar 2021 15:28:12 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B6B6C061574; Mon, 29 Mar 2021 12:28:12 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id C9A5A1F454DE Message-ID: <88580a6167df412c272e0af34078dcbebb66ab6c.camel@collabora.com> Subject: Re: [PATCH v7 06/13] media: hantro: change hantro_codec_ops run prototype to return errors From: Ezequiel Garcia To: Benjamin Gaignard , p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, lee.jones@linaro.org, gregkh@linuxfoundation.org, mripard@kernel.org, paul.kocialkowski@bootlin.com, wens@csie.org, jernej.skrabec@siol.net, hverkuil-cisco@xs4all.nl, emil.l.velikov@gmail.com Cc: kernel@pengutronix.de, linux-imx@nxp.com, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org, kernel@collabora.com Date: Mon, 29 Mar 2021 16:27:59 -0300 In-Reply-To: <20210329065743.11961-7-benjamin.gaignard@collabora.com> References: <20210329065743.11961-1-benjamin.gaignard@collabora.com> <20210329065743.11961-7-benjamin.gaignard@collabora.com> Organization: Collabora Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.2-1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org On Mon, 2021-03-29 at 08:57 +0200, Benjamin Gaignard wrote: > Change hantro_codec_ops run prototype from 'void' to 'int'. > This allow to cancel the job if an error occur while configuring > the hardware. > > Signed-off-by: Benjamin Gaignard Reviewed-by: Ezequiel Garcia > --- > version 5: >  - forward hantro_h264_dec_prepare_run() return value in case >    of error > >  drivers/staging/media/hantro/hantro_drv.c     |  4 +++- >  .../staging/media/hantro/hantro_g1_h264_dec.c | 10 +++++++--- >  .../media/hantro/hantro_g1_mpeg2_dec.c        |  4 +++- >  .../staging/media/hantro/hantro_g1_vp8_dec.c  |  6 ++++-- >  .../staging/media/hantro/hantro_h1_jpeg_enc.c |  4 +++- >  drivers/staging/media/hantro/hantro_hw.h      | 19 ++++++++++--------- >  .../media/hantro/rk3399_vpu_hw_jpeg_enc.c     |  4 +++- >  .../media/hantro/rk3399_vpu_hw_mpeg2_dec.c    |  4 +++- >  .../media/hantro/rk3399_vpu_hw_vp8_dec.c      |  6 ++++-- >  9 files changed, 40 insertions(+), 21 deletions(-) > > diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c > index 595e82a82728..02c5c2f1a88b 100644 > --- a/drivers/staging/media/hantro/hantro_drv.c > +++ b/drivers/staging/media/hantro/hantro_drv.c > @@ -161,7 +161,9 @@ static void device_run(void *priv) >   >         v4l2_m2m_buf_copy_metadata(src, dst, true); >   > -       ctx->codec_ops->run(ctx); > +       if (ctx->codec_ops->run(ctx)) > +               goto err_cancel_job; > + >         return; >   >  err_cancel_job: > diff --git a/drivers/staging/media/hantro/hantro_g1_h264_dec.c b/drivers/staging/media/hantro/hantro_g1_h264_dec.c > index 845bef73d218..5c792b7bcb79 100644 > --- a/drivers/staging/media/hantro/hantro_g1_h264_dec.c > +++ b/drivers/staging/media/hantro/hantro_g1_h264_dec.c > @@ -273,13 +273,15 @@ static void set_buffers(struct hantro_ctx *ctx) >         vdpu_write_relaxed(vpu, ctx->h264_dec.priv.dma, G1_REG_ADDR_QTABLE); >  } >   > -void hantro_g1_h264_dec_run(struct hantro_ctx *ctx) > +int hantro_g1_h264_dec_run(struct hantro_ctx *ctx) >  { >         struct hantro_dev *vpu = ctx->dev; > +       int ret; >   >         /* Prepare the H264 decoder context. */ > -       if (hantro_h264_dec_prepare_run(ctx)) > -               return; > +       ret = hantro_h264_dec_prepare_run(ctx); > +       if (ret) > +               return ret; >   >         /* Configure hardware registers. */ >         set_params(ctx); > @@ -301,4 +303,6 @@ void hantro_g1_h264_dec_run(struct hantro_ctx *ctx) >                            G1_REG_CONFIG_DEC_CLK_GATE_E, >                            G1_REG_CONFIG); >         vdpu_write(vpu, G1_REG_INTERRUPT_DEC_E, G1_REG_INTERRUPT); > + > +       return 0; >  } > diff --git a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c > index 6386a3989bfe..5e8943d31dc5 100644 > --- a/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c > +++ b/drivers/staging/media/hantro/hantro_g1_mpeg2_dec.c > @@ -155,7 +155,7 @@ hantro_g1_mpeg2_dec_set_buffers(struct hantro_dev *vpu, struct hantro_ctx *ctx, >         vdpu_write_relaxed(vpu, backward_addr, G1_REG_REFER3_BASE); >  } >   > -void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx) > +int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx) >  { >         struct hantro_dev *vpu = ctx->dev; >         struct vb2_v4l2_buffer *src_buf, *dst_buf; > @@ -248,4 +248,6 @@ void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx) >   >         reg = G1_REG_DEC_E(1); >         vdpu_write(vpu, reg, G1_SWREG(1)); > + > +       return 0; >  } > diff --git a/drivers/staging/media/hantro/hantro_g1_vp8_dec.c b/drivers/staging/media/hantro/hantro_g1_vp8_dec.c > index 57002ba70176..96622a7f8279 100644 > --- a/drivers/staging/media/hantro/hantro_g1_vp8_dec.c > +++ b/drivers/staging/media/hantro/hantro_g1_vp8_dec.c > @@ -425,7 +425,7 @@ static void cfg_buffers(struct hantro_ctx *ctx, >         vdpu_write_relaxed(vpu, dst_dma, G1_REG_ADDR_DST); >  } >   > -void hantro_g1_vp8_dec_run(struct hantro_ctx *ctx) > +int hantro_g1_vp8_dec_run(struct hantro_ctx *ctx) >  { >         const struct v4l2_ctrl_vp8_frame *hdr; >         struct hantro_dev *vpu = ctx->dev; > @@ -438,7 +438,7 @@ void hantro_g1_vp8_dec_run(struct hantro_ctx *ctx) >   >         hdr = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_VP8_FRAME); >         if (WARN_ON(!hdr)) > -               return; > +               return -EINVAL; >   >         /* Reset segment_map buffer in keyframe */ >         if (V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) && ctx->vp8_dec.segment_map.cpu) > @@ -498,4 +498,6 @@ void hantro_g1_vp8_dec_run(struct hantro_ctx *ctx) >         hantro_end_prepare_run(ctx); >   >         vdpu_write(vpu, G1_REG_INTERRUPT_DEC_E, G1_REG_INTERRUPT); > + > +       return 0; >  } > diff --git a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c b/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c > index b88dc4ed06db..56cf261a8e95 100644 > --- a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c > +++ b/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c > @@ -88,7 +88,7 @@ hantro_h1_jpeg_enc_set_qtable(struct hantro_dev *vpu, >         } >  } >   > -void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx) > +int hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx) >  { >         struct hantro_dev *vpu = ctx->dev; >         struct vb2_v4l2_buffer *src_buf, *dst_buf; > @@ -136,6 +136,8 @@ void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx) >         hantro_end_prepare_run(ctx); >   >         vepu_write(vpu, reg, H1_REG_ENC_CTRL); > + > +       return 0; >  } >   >  void hantro_jpeg_enc_done(struct hantro_ctx *ctx) > diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h > index 13a6e7113001..a76852966578 100644 > --- a/drivers/staging/media/hantro/hantro_hw.h > +++ b/drivers/staging/media/hantro/hantro_hw.h > @@ -126,14 +126,15 @@ struct hantro_postproc_ctx { >   *             Optional and called from process context. >   * @run:       Start single {en,de)coding job. Called from atomic context >   *             to indicate that a pair of buffers is ready and the hardware > - *             should be programmed and started. > + *             should be programmed and started. Returns zero if OK, a > + *             negative value in error cases. >   * @done:      Read back processing results and additional data from hardware. >   * @reset:     Reset the hardware in case of a timeout. >   */ >  struct hantro_codec_ops { >         int (*init)(struct hantro_ctx *ctx); >         void (*exit)(struct hantro_ctx *ctx); > -       void (*run)(struct hantro_ctx *ctx); > +       int (*run)(struct hantro_ctx *ctx); >         void (*done)(struct hantro_ctx *ctx); >         void (*reset)(struct hantro_ctx *ctx); >  }; > @@ -164,8 +165,8 @@ void hantro_irq_done(struct hantro_dev *vpu, >  void hantro_start_prepare_run(struct hantro_ctx *ctx); >  void hantro_end_prepare_run(struct hantro_ctx *ctx); >   > -void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx); > -void rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx); > +int hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx); > +int 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); > @@ -173,7 +174,7 @@ 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); >  int hantro_h264_dec_prepare_run(struct hantro_ctx *ctx); > -void hantro_g1_h264_dec_run(struct hantro_ctx *ctx); > +int hantro_g1_h264_dec_run(struct hantro_ctx *ctx); >  int hantro_h264_dec_init(struct hantro_ctx *ctx); >  void hantro_h264_dec_exit(struct hantro_ctx *ctx); >   > @@ -204,15 +205,15 @@ hantro_h264_mv_size(unsigned int width, unsigned int height) >         return 64 * MB_WIDTH(width) * MB_WIDTH(height) + 32; >  } >   > -void hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx); > -void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx); > +int hantro_g1_mpeg2_dec_run(struct hantro_ctx *ctx); > +int rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx); >  void hantro_mpeg2_dec_copy_qtable(u8 *qtable, >         const struct v4l2_ctrl_mpeg2_quantization *ctrl); >  int hantro_mpeg2_dec_init(struct hantro_ctx *ctx); >  void hantro_mpeg2_dec_exit(struct hantro_ctx *ctx); >   > -void hantro_g1_vp8_dec_run(struct hantro_ctx *ctx); > -void rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx); > +int hantro_g1_vp8_dec_run(struct hantro_ctx *ctx); > +int rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx); >  int hantro_vp8_dec_init(struct hantro_ctx *ctx); >  void hantro_vp8_dec_exit(struct hantro_ctx *ctx); >  void hantro_vp8_prob_update(struct hantro_ctx *ctx, > diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_jpeg_enc.c b/drivers/staging/media/hantro/rk3399_vpu_hw_jpeg_enc.c > index 3498e6124acd..3a27ebef4f38 100644 > --- a/drivers/staging/media/hantro/rk3399_vpu_hw_jpeg_enc.c > +++ b/drivers/staging/media/hantro/rk3399_vpu_hw_jpeg_enc.c > @@ -118,7 +118,7 @@ rk3399_vpu_jpeg_enc_set_qtable(struct hantro_dev *vpu, >         } >  } >   > -void rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx) > +int rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx) >  { >         struct hantro_dev *vpu = ctx->dev; >         struct vb2_v4l2_buffer *src_buf, *dst_buf; > @@ -168,4 +168,6 @@ void rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx) >         /* Kick the watchdog and start encoding */ >         hantro_end_prepare_run(ctx); >         vepu_write(vpu, reg, VEPU_REG_ENCODE_START); > + > +       return 0; >  } > diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c > index f610fa5b4335..4bd3080abbc1 100644 > --- a/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c > +++ b/drivers/staging/media/hantro/rk3399_vpu_hw_mpeg2_dec.c > @@ -157,7 +157,7 @@ rk3399_vpu_mpeg2_dec_set_buffers(struct hantro_dev *vpu, >         vdpu_write_relaxed(vpu, backward_addr, VDPU_REG_REFER3_BASE); >  } >   > -void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx) > +int rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx) >  { >         struct hantro_dev *vpu = ctx->dev; >         struct vb2_v4l2_buffer *src_buf, *dst_buf; > @@ -254,4 +254,6 @@ void rk3399_vpu_mpeg2_dec_run(struct hantro_ctx *ctx) >   >         reg = vdpu_read(vpu, VDPU_SWREG(57)) | VDPU_REG_DEC_E(1); >         vdpu_write(vpu, reg, VDPU_SWREG(57)); > + > +       return 0; >  } > diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw_vp8_dec.c b/drivers/staging/media/hantro/rk3399_vpu_hw_vp8_dec.c > index 8661a3cc1e6b..e5d20fe5b007 100644 > --- a/drivers/staging/media/hantro/rk3399_vpu_hw_vp8_dec.c > +++ b/drivers/staging/media/hantro/rk3399_vpu_hw_vp8_dec.c > @@ -503,7 +503,7 @@ static void cfg_buffers(struct hantro_ctx *ctx, >         vdpu_write_relaxed(vpu, dst_dma, VDPU_REG_ADDR_DST); >  } >   > -void rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx) > +int rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx) >  { >         const struct v4l2_ctrl_vp8_frame *hdr; >         struct hantro_dev *vpu = ctx->dev; > @@ -516,7 +516,7 @@ void rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx) >   >         hdr = hantro_get_ctrl(ctx, V4L2_CID_STATELESS_VP8_FRAME); >         if (WARN_ON(!hdr)) > -               return; > +               return -EINVAL; >   >         /* Reset segment_map buffer in keyframe */ >         if (V4L2_VP8_FRAME_IS_KEY_FRAME(hdr) && ctx->vp8_dec.segment_map.cpu) > @@ -589,4 +589,6 @@ void rk3399_vpu_vp8_dec_run(struct hantro_ctx *ctx) >         hantro_end_prepare_run(ctx); >   >         hantro_reg_write(vpu, &vp8_dec_start_dec, 1); > + > +       return 0; >  }