OSDN Git Service

media: coda: Add a V4L2 user for control error macroblocks count
authorEzequiel Garcia <ezequiel@collabora.com>
Wed, 4 Nov 2020 17:43:11 +0000 (18:43 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 16 Nov 2020 09:31:16 +0000 (10:31 +0100)
To avoid potentially overflowing the kernel logs in the case
of corrupted streams, this commit replaces an error message with
a per-stream counter to be read through a driver-specific
control.

Applications can read the per-stream accumulated
error macroblocks count.

The old error message is replaced by a rate-limited debug message.

Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/coda/coda-bit.c
drivers/media/platform/coda/coda-common.c
drivers/media/platform/coda/coda.h
include/uapi/linux/v4l2-controls.h

index 919b36d..2f42808 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kernel.h>
 #include <linux/log2.h>
 #include <linux/platform_device.h>
+#include <linux/ratelimit.h>
 #include <linux/reset.h>
 #include <linux/slab.h>
 #include <linux/videodev2.h>
@@ -2369,9 +2370,12 @@ static void coda_finish_decode(struct coda_ctx *ctx)
        }
 
        err_mb = coda_read(dev, CODA_RET_DEC_PIC_ERR_MB);
-       if (err_mb > 0)
-               v4l2_err(&dev->v4l2_dev,
-                        "errors in %d macroblocks\n", err_mb);
+       if (err_mb > 0) {
+               if (__ratelimit(&dev->mb_err_rs))
+                       coda_dbg(1, ctx, "errors in %d macroblocks\n", err_mb);
+               v4l2_ctrl_s_ctrl(ctx->mb_err_cnt_ctrl,
+                                v4l2_ctrl_g_ctrl(ctx->mb_err_cnt_ctrl) + err_mb);
+       }
 
        if (dev->devtype->product == CODA_HX4 ||
            dev->devtype->product == CODA_7541) {
index f9e6624..d30eafe 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/videodev2.h>
 #include <linux/of.h>
 #include <linux/platform_data/media/coda.h>
+#include <linux/ratelimit.h>
 #include <linux/reset.h>
 
 #include <media/v4l2-ctrls.h>
@@ -2062,6 +2063,7 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
        if (q_data_dst->fourcc == V4L2_PIX_FMT_JPEG)
                ctx->params.gop_size = 1;
        ctx->gopcounter = ctx->params.gop_size - 1;
+       v4l2_ctrl_s_ctrl(ctx->mb_err_cnt_ctrl, 0);
 
        ret = ctx->ops->start_streaming(ctx);
        if (ctx->inst_type == CODA_INST_DECODER) {
@@ -2462,6 +2464,15 @@ static void coda_decode_ctrls(struct coda_ctx *ctx)
                ctx->mpeg4_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
 }
 
+static const struct v4l2_ctrl_config coda_mb_err_cnt_ctrl_config = {
+       .id     = V4L2_CID_CODA_MB_ERR_CNT,
+       .name   = "Macroblocks Error Count",
+       .type   = V4L2_CTRL_TYPE_INTEGER,
+       .min    = 0,
+       .max    = 0x7fffffff,
+       .step   = 1,
+};
+
 static int coda_ctrls_setup(struct coda_ctx *ctx)
 {
        v4l2_ctrl_handler_init(&ctx->ctrls, 2);
@@ -2484,6 +2495,12 @@ static int coda_ctrls_setup(struct coda_ctx *ctx)
                                  1, 1, 1, 1);
                if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_H264)
                        coda_decode_ctrls(ctx);
+
+               ctx->mb_err_cnt_ctrl = v4l2_ctrl_new_custom(&ctx->ctrls,
+                                               &coda_mb_err_cnt_ctrl_config,
+                                               NULL);
+               if (ctx->mb_err_cnt_ctrl)
+                       ctx->mb_err_cnt_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
        }
 
        if (ctx->ctrls.error) {
@@ -3202,6 +3219,7 @@ static int coda_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       ratelimit_default_init(&dev->mb_err_rs);
        mutex_init(&dev->dev_mutex);
        mutex_init(&dev->coda_mutex);
        ida_init(&dev->ida);
index e53f7a6..dcf3564 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/mutex.h>
 #include <linux/kfifo.h>
 #include <linux/videodev2.h>
+#include <linux/ratelimit.h>
 
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-device.h>
 #define CODA_MAX_FRAMEBUFFERS  19
 #define FMO_SLICE_SAVE_BUF_SIZE        (32)
 
+/*
+ * This control allows applications to read the per-stream
+ * (i.e. per-context) Macroblocks Error Count. This value
+ * is CODA specific.
+ */
+#define V4L2_CID_CODA_MB_ERR_CNT (V4L2_CID_USER_CODA_BASE + 0)
+
 enum {
        V4L2_M2M_SRC = 0,
        V4L2_M2M_DST = 1,
@@ -92,6 +100,7 @@ struct coda_dev {
        struct v4l2_m2m_dev     *m2m_dev;
        struct ida              ida;
        struct dentry           *debugfs_root;
+       struct ratelimit_state  mb_err_rs;
 };
 
 struct coda_codec {
@@ -242,6 +251,7 @@ struct coda_ctx {
        struct v4l2_ctrl                *mpeg2_level_ctrl;
        struct v4l2_ctrl                *mpeg4_profile_ctrl;
        struct v4l2_ctrl                *mpeg4_level_ctrl;
+       struct v4l2_ctrl                *mb_err_cnt_ctrl;
        struct v4l2_fh                  fh;
        int                             gopcounter;
        int                             runcounter;
index a184c49..7035f4f 100644 (file)
@@ -198,6 +198,12 @@ enum v4l2_colorfx {
  */
 #define V4L2_CID_USER_ATMEL_ISC_BASE           (V4L2_CID_USER_BASE + 0x10c0)
 
+/*
+ * The base for the CODA driver controls.
+ * We reserve 16 controls for this driver.
+ */
+#define V4L2_CID_USER_CODA_BASE                        (V4L2_CID_USER_BASE + 0x10e0)
+
 /* MPEG-class control IDs */
 /* The MPEG controls are applicable to all codec controls
  * and the 'MPEG' part of the define is historical */