Commit b2d3bef1 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mauro Carvalho Chehab

media: coda: Add a V4L2 user for control error macroblocks count

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: default avatarEzequiel Garcia <ezequiel@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 8297ae5c
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/ratelimit.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
...@@ -2369,9 +2370,12 @@ static void coda_finish_decode(struct coda_ctx *ctx) ...@@ -2369,9 +2370,12 @@ static void coda_finish_decode(struct coda_ctx *ctx)
} }
err_mb = coda_read(dev, CODA_RET_DEC_PIC_ERR_MB); err_mb = coda_read(dev, CODA_RET_DEC_PIC_ERR_MB);
if (err_mb > 0) if (err_mb > 0) {
v4l2_err(&dev->v4l2_dev, if (__ratelimit(&dev->mb_err_rs))
"errors in %d macroblocks\n", err_mb); 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 || if (dev->devtype->product == CODA_HX4 ||
dev->devtype->product == CODA_7541) { dev->devtype->product == CODA_7541) {
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/platform_data/media/coda.h> #include <linux/platform_data/media/coda.h>
#include <linux/ratelimit.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
...@@ -2062,6 +2063,7 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count) ...@@ -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) if (q_data_dst->fourcc == V4L2_PIX_FMT_JPEG)
ctx->params.gop_size = 1; ctx->params.gop_size = 1;
ctx->gopcounter = 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); ret = ctx->ops->start_streaming(ctx);
if (ctx->inst_type == CODA_INST_DECODER) { if (ctx->inst_type == CODA_INST_DECODER) {
...@@ -2462,6 +2464,15 @@ static void coda_decode_ctrls(struct coda_ctx *ctx) ...@@ -2462,6 +2464,15 @@ static void coda_decode_ctrls(struct coda_ctx *ctx)
ctx->mpeg4_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; 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) static int coda_ctrls_setup(struct coda_ctx *ctx)
{ {
v4l2_ctrl_handler_init(&ctx->ctrls, 2); v4l2_ctrl_handler_init(&ctx->ctrls, 2);
...@@ -2484,6 +2495,12 @@ static int coda_ctrls_setup(struct coda_ctx *ctx) ...@@ -2484,6 +2495,12 @@ static int coda_ctrls_setup(struct coda_ctx *ctx)
1, 1, 1, 1); 1, 1, 1, 1);
if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_H264) if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_H264)
coda_decode_ctrls(ctx); 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) { if (ctx->ctrls.error) {
...@@ -3202,6 +3219,7 @@ static int coda_probe(struct platform_device *pdev) ...@@ -3202,6 +3219,7 @@ static int coda_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
ratelimit_default_init(&dev->mb_err_rs);
mutex_init(&dev->dev_mutex); mutex_init(&dev->dev_mutex);
mutex_init(&dev->coda_mutex); mutex_init(&dev->coda_mutex);
ida_init(&dev->ida); ida_init(&dev->ida);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/kfifo.h> #include <linux/kfifo.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/ratelimit.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
...@@ -28,6 +29,13 @@ ...@@ -28,6 +29,13 @@
#define CODA_MAX_FRAMEBUFFERS 19 #define CODA_MAX_FRAMEBUFFERS 19
#define FMO_SLICE_SAVE_BUF_SIZE (32) #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 { enum {
V4L2_M2M_SRC = 0, V4L2_M2M_SRC = 0,
V4L2_M2M_DST = 1, V4L2_M2M_DST = 1,
...@@ -92,6 +100,7 @@ struct coda_dev { ...@@ -92,6 +100,7 @@ struct coda_dev {
struct v4l2_m2m_dev *m2m_dev; struct v4l2_m2m_dev *m2m_dev;
struct ida ida; struct ida ida;
struct dentry *debugfs_root; struct dentry *debugfs_root;
struct ratelimit_state mb_err_rs;
}; };
struct coda_codec { struct coda_codec {
...@@ -242,6 +251,7 @@ struct coda_ctx { ...@@ -242,6 +251,7 @@ struct coda_ctx {
struct v4l2_ctrl *mpeg2_level_ctrl; struct v4l2_ctrl *mpeg2_level_ctrl;
struct v4l2_ctrl *mpeg4_profile_ctrl; struct v4l2_ctrl *mpeg4_profile_ctrl;
struct v4l2_ctrl *mpeg4_level_ctrl; struct v4l2_ctrl *mpeg4_level_ctrl;
struct v4l2_ctrl *mb_err_cnt_ctrl;
struct v4l2_fh fh; struct v4l2_fh fh;
int gopcounter; int gopcounter;
int runcounter; int runcounter;
......
...@@ -198,6 +198,12 @@ enum v4l2_colorfx { ...@@ -198,6 +198,12 @@ enum v4l2_colorfx {
*/ */
#define V4L2_CID_USER_ATMEL_ISC_BASE (V4L2_CID_USER_BASE + 0x10c0) #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 */ /* MPEG-class control IDs */
/* The MPEG controls are applicable to all codec controls /* The MPEG controls are applicable to all codec controls
* and the 'MPEG' part of the define is historical */ * and the 'MPEG' part of the define is historical */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment