Need to change kernel driver to open decode and encode debug log at current period,
it's very unreasonable. Adding debugfs common interface to support decode and encode,
using echo command to control debug log level and getting useful information for each
instance.
patch 1 add debugfs common interface.
patch 2~4 support decode.
patch 5~6 support encode
---
Yunfei Dong (6):
media: mediatek: vcodec: Add debugfs interface to get debug
information
media: mediatek: vcodec: Add debug params to control different log
level
media: mediatek: vcodec: Add a debugfs file to get different useful
information
media: mediatek: vcodec: Get get each instance format type
media: mediatek: vcodec: Change dbgfs interface to support encode
media: mediatek: vcodec: Add encode to support dbgfs
.../media/platform/mediatek/vcodec/Makefile | 6 +
.../mediatek/vcodec/mtk_vcodec_dbgfs.c | 157 ++++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_dbgfs.h | 48 ++++++
.../mediatek/vcodec/mtk_vcodec_dec_drv.c | 4 +
.../platform/mediatek/vcodec/mtk_vcodec_drv.h | 4 +
.../mediatek/vcodec/mtk_vcodec_enc_drv.c | 2 +
.../mediatek/vcodec/mtk_vcodec_util.c | 8 +
.../mediatek/vcodec/mtk_vcodec_util.h | 25 ++-
8 files changed, 251 insertions(+), 3 deletions(-)
create mode 100644 drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
create mode 100644 drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
--
2.25.1
This will be useful when debugging specific issues related to kernel
in running status.
Signed-off-by: Yunfei Dong <[email protected]>
---
.../media/platform/mediatek/vcodec/Makefile | 6 ++++
.../mediatek/vcodec/mtk_vcodec_dbgfs.c | 32 +++++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_dbgfs.h | 28 ++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_dec_drv.c | 2 ++
.../platform/mediatek/vcodec/mtk_vcodec_drv.h | 4 +++
5 files changed, 72 insertions(+)
create mode 100644 drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
create mode 100644 drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
diff --git a/drivers/media/platform/mediatek/vcodec/Makefile b/drivers/media/platform/mediatek/vcodec/Makefile
index 93e7a343b5b0..f6b750cf7077 100644
--- a/drivers/media/platform/mediatek/vcodec/Makefile
+++ b/drivers/media/platform/mediatek/vcodec/Makefile
@@ -44,3 +44,9 @@ endif
ifneq ($(CONFIG_VIDEO_MEDIATEK_VCODEC_SCP),)
mtk-vcodec-common-y += mtk_vcodec_fw_scp.o
endif
+
+ifneq ($(CONFIG_DEBUG_FS),)
+obj-$(CONFIG_VIDEO_MEDIATEK_VCODEC) += mtk-vcodec-dbgfs.o
+
+mtk-vcodec-dbgfs-y := mtk_vcodec_dbgfs.o
+endif
\ No newline at end of file
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
new file mode 100644
index 000000000000..adf3f9133b0c
--- /dev/null
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023 MediaTek Inc.
+ * Author: Yunfei Dong <[email protected]>
+ */
+
+#include <linux/debugfs.h>
+
+#include "mtk_vcodec_dbgfs.h"
+#include "mtk_vcodec_drv.h"
+#include "mtk_vcodec_util.h"
+
+void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
+{
+ struct dentry *vcodec_root;
+
+ vcodec_dev->dbgfs.vcodec_root = debugfs_create_dir("vcodec-dec", NULL);
+ if (IS_ERR(vcodec_dev->dbgfs.vcodec_root))
+ pr_info("create dir err:%d\n", IS_ERR(vcodec_dev->dbgfs.vcodec_root));
+
+ vcodec_root = vcodec_dev->dbgfs.vcodec_root;
+}
+EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_init);
+
+void mtk_vcodec_dbgfs_deinit(struct mtk_vcodec_dev *vcodec_dev)
+{
+ debugfs_remove_recursive(vcodec_dev->dbgfs.vcodec_root);
+}
+EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_deinit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("Mediatek video codec driver");
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
new file mode 100644
index 000000000000..74f130f868c8
--- /dev/null
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2023 MediaTek Inc.
+ * Author: Yunfei Dong <[email protected]>
+ */
+
+#ifndef __MTK_VCODEC_DBGFS_H__
+#define __MTK_VCODEC_DBGFS_H__
+
+struct mtk_vcodec_dev;
+
+struct mtk_vcodec_dbgfs {
+ struct dentry *vcodec_root;
+};
+
+#if defined(CONFIG_DEBUG_FS)
+void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev);
+void mtk_vcodec_dbgfs_deinit(struct mtk_vcodec_dev *vcodec_dev);
+#else
+static inline void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
+{
+}
+
+static inline void mtk_vcodec_dbgfs_deinit(struct mtk_vcodec_dev *vcodec_dev)
+{
+}
+#endif
+#endif
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
index 174a6eec2f54..de29b1fb0436 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
@@ -431,6 +431,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
mtk_v4l2_debug(0, "media registered as /dev/media%d", vfd_dec->minor);
}
+ mtk_vcodec_dbgfs_init(dev);
mtk_v4l2_debug(0, "decoder registered as /dev/video%d", vfd_dec->minor);
return 0;
@@ -505,6 +506,7 @@ static int mtk_vcodec_dec_remove(struct platform_device *pdev)
if (dev->vfd_dec)
video_unregister_device(dev->vfd_dec);
+ mtk_vcodec_dbgfs_deinit(dev);
v4l2_device_unregister(&dev->v4l2_dev);
if (!dev->vdec_pdata->is_subdev_supported)
pm_runtime_disable(dev->pm.dev);
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_drv.h
index 9acab54fd650..a7e8bb3608ac 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_drv.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_drv.h
@@ -16,6 +16,7 @@
#include <media/v4l2-mem2mem.h>
#include <media/videobuf2-core.h>
+#include "mtk_vcodec_dbgfs.h"
#include "mtk_vcodec_util.h"
#include "vdec_msg_queue.h"
@@ -470,6 +471,7 @@ struct mtk_vcodec_enc_pdata {
* @dec_active_cnt: used to mark whether need to record register value
* @vdec_racing_info: record register value
* @dec_racing_info_mutex: mutex lock used for inner racing mode
+ * @dbgfs: debug log related information
*/
struct mtk_vcodec_dev {
struct v4l2_device v4l2_dev;
@@ -520,6 +522,8 @@ struct mtk_vcodec_dev {
u32 vdec_racing_info[132];
/* Protects access to vdec_racing_info data */
struct mutex dec_racing_info_mutex;
+
+ struct mtk_vcodec_dbgfs dbgfs;
};
static inline struct mtk_vcodec_ctx *fh_to_ctx(struct v4l2_fh *fh)
--
2.25.1
Add encode to support dbgfs.
Signed-off-by: Yunfei Dong <[email protected]>
---
drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_drv.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_drv.c
index 9095186d5495..94703c66da74 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_drv.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_enc_drv.c
@@ -353,6 +353,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
goto err_enc_reg;
}
+ mtk_vcodec_dbgfs_init(dev, false);
mtk_v4l2_debug(0, "encoder %d registered as /dev/video%d",
dev->venc_pdata->core_id, vfd_enc->num);
@@ -463,6 +464,7 @@ static int mtk_vcodec_enc_remove(struct platform_device *pdev)
if (dev->vfd_enc)
video_unregister_device(dev->vfd_enc);
+ mtk_vcodec_dbgfs_deinit(dev);
v4l2_device_unregister(&dev->v4l2_dev);
pm_runtime_disable(dev->pm.dev);
mtk_vcodec_fw_release(dev->fw_handler);
--
2.25.1
Extern dbgfs init interface to support encode and create encode
dbgfs file.
Signed-off-by: Yunfei Dong <[email protected]>
---
drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c | 7 +++++--
drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h | 4 ++--
.../media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c | 2 +-
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
index 8a03f986a857..7d0021f34b3c 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
@@ -124,11 +124,14 @@ void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, int ctx_id)
}
EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_remove);
-void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
+void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev, bool is_decode)
{
struct dentry *vcodec_root;
- vcodec_dev->dbgfs.vcodec_root = debugfs_create_dir("vcodec-dec", NULL);
+ if (is_decode)
+ vcodec_dev->dbgfs.vcodec_root = debugfs_create_dir("vcodec-dec", NULL);
+ else
+ vcodec_dev->dbgfs.vcodec_root = debugfs_create_dir("vcodec-enc", NULL);
if (IS_ERR(vcodec_dev->dbgfs.vcodec_root))
pr_info("create dir err:%d\n", IS_ERR(vcodec_dev->dbgfs.vcodec_root));
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
index 2d0b617e762e..6adfc4f417ef 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
@@ -26,7 +26,7 @@ struct mtk_vcodec_dbgfs {
void mtk_vcodec_dbgfs_create(struct mtk_vcodec_ctx *ctx);
void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, int ctx_id);
-void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev);
+void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev, bool is_decode);
void mtk_vcodec_dbgfs_deinit(struct mtk_vcodec_dev *vcodec_dev);
#else
static inline void mtk_vcodec_dbgfs_create(struct mtk_vcodec_ctx *ctx)
@@ -37,7 +37,7 @@ static inline void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, in
{
}
-static inline void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
+static inline void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev, bool is_decode)
{
}
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
index 8c2443a18f5e..9260273f26cf 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
@@ -433,7 +433,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
mtk_v4l2_debug(0, "media registered as /dev/media%d", vfd_dec->minor);
}
- mtk_vcodec_dbgfs_init(dev);
+ mtk_vcodec_dbgfs_init(dev, true);
mtk_v4l2_debug(0, "decoder registered as /dev/video%d", vfd_dec->minor);
return 0;
--
2.25.1
In oder to get each instance information according to test command, adding
one file node "vdec".
Can use echo command to set different string value as 'echo -picinfo > vdec'
to get real and aligned resolution.
Signed-off-by: Yunfei Dong <[email protected]>
---
.../mediatek/vcodec/mtk_vcodec_dbgfs.c | 85 +++++++++++++++++++
.../mediatek/vcodec/mtk_vcodec_dbgfs.h | 20 +++++
.../mediatek/vcodec/mtk_vcodec_dec_drv.c | 2 +
3 files changed, 107 insertions(+)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
index bef78c028a75..9e7d57d21cea 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
@@ -10,6 +10,86 @@
#include "mtk_vcodec_drv.h"
#include "mtk_vcodec_util.h"
+static ssize_t mtk_vdec_dbgfs_write(struct file *filp, const char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ struct mtk_vcodec_dev *vcodec_dev = filp->private_data;
+ char buf[32] = { 0 };
+ int len, str_count = 0;
+ struct mtk_vcodec_dbgfs_inst *dbgfs_inst;
+ struct mtk_vcodec_ctx *ctx;
+
+ len = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
+ if (len <= 0)
+ return len;
+
+ list_for_each_entry(dbgfs_inst, &vcodec_dev->dbgfs.dbgfs_head, node) {
+ pr_info("dbgfs_inst id: %d\n", dbgfs_inst->inst_id);
+ ctx = dbgfs_inst->vcodec_ctx;
+
+ if (strstr(buf, "-picinfo")) {
+ str_count++;
+ pr_info("resolution: real(%dx%d)=>align(%dx%d)\n",
+ ctx->picinfo.pic_w, ctx->picinfo.pic_h,
+ ctx->picinfo.buf_w, ctx->picinfo.buf_h);
+ }
+ }
+
+ if (!str_count) {
+ pr_info("\t can not found useful cmd: %s\n", buf);
+ pr_info("\t -picinfo ex. echo -picinfo\n");
+ }
+
+ return count;
+}
+
+static const struct file_operations vdec_fops = {
+ .open = simple_open,
+ .write = mtk_vdec_dbgfs_write,
+};
+
+void mtk_vcodec_dbgfs_create(struct mtk_vcodec_ctx *ctx)
+{
+ struct mtk_vcodec_dbgfs_inst *dbgfs_inst;
+ struct mtk_vcodec_dev *vcodec_dev = ctx->dev;
+
+ dbgfs_inst = kzalloc(sizeof(*dbgfs_inst), GFP_KERNEL);
+ if (!dbgfs_inst)
+ return;
+
+ list_add_tail(&dbgfs_inst->node, &vcodec_dev->dbgfs.dbgfs_head);
+
+ vcodec_dev->dbgfs.inst_count++;
+
+ dbgfs_inst->inst_id = ctx->id;
+ dbgfs_inst->vcodec_ctx = ctx;
+
+ pr_info("dbgfs create: id(%d) total count: %d\n", dbgfs_inst->inst_id,
+ vcodec_dev->dbgfs.inst_count);
+}
+EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_create);
+
+void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, int ctx_id)
+{
+ struct mtk_vcodec_dbgfs_inst *dbgfs_inst;
+
+ list_for_each_entry(dbgfs_inst, &vcodec_dev->dbgfs.dbgfs_head, node) {
+ if (dbgfs_inst && dbgfs_inst->inst_id == ctx_id) {
+ vcodec_dev->dbgfs.inst_count--;
+ pr_info("dbgfs_inst remove id: %d total count: %d\n",
+ dbgfs_inst->inst_id,
+ vcodec_dev->dbgfs.inst_count);
+ break;
+ }
+ }
+
+ if (dbgfs_inst) {
+ list_del(&dbgfs_inst->node);
+ kfree(dbgfs_inst);
+ }
+}
+EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_remove);
+
void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
{
struct dentry *vcodec_root;
@@ -22,6 +102,11 @@ void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
debugfs_create_x32("mtk_v4l2_dbg_level", 0644, vcodec_root, &mtk_v4l2_dbg_level);
debugfs_create_x32("mtk_vcodec_dbg", 0644, vcodec_root, &mtk_vcodec_dbg);
+
+ INIT_LIST_HEAD(&vcodec_dev->dbgfs.dbgfs_head);
+ debugfs_create_file("vdec", 0200, vcodec_root, vcodec_dev, &vdec_fops);
+
+ vcodec_dev->dbgfs.inst_count = 0;
}
EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_init);
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
index 74f130f868c8..2d0b617e762e 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.h
@@ -8,15 +8,35 @@
#define __MTK_VCODEC_DBGFS_H__
struct mtk_vcodec_dev;
+struct mtk_vcodec_ctx;
+
+struct mtk_vcodec_dbgfs_inst {
+ struct list_head node;
+ int inst_id;
+ struct mtk_vcodec_ctx *vcodec_ctx;
+};
struct mtk_vcodec_dbgfs {
+ struct list_head dbgfs_head;
struct dentry *vcodec_root;
+ int inst_count;
};
#if defined(CONFIG_DEBUG_FS)
+void mtk_vcodec_dbgfs_create(struct mtk_vcodec_ctx *ctx);
+void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, int ctx_id);
+
void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev);
void mtk_vcodec_dbgfs_deinit(struct mtk_vcodec_dev *vcodec_dev);
#else
+static inline void mtk_vcodec_dbgfs_create(struct mtk_vcodec_ctx *ctx)
+{
+}
+
+static inline void mtk_vcodec_dbgfs_remove(struct mtk_vcodec_dev *vcodec_dev, int ctx_id)
+{
+}
+
static inline void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
{
}
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
index de29b1fb0436..8c2443a18f5e 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_drv.c
@@ -215,6 +215,7 @@ static int fops_vcodec_open(struct file *file)
ctx->dev->vdec_pdata->init_vdec_params(ctx);
list_add(&ctx->list, &dev->ctx_list);
+ mtk_vcodec_dbgfs_create(ctx);
mutex_unlock(&dev->dev_mutex);
mtk_v4l2_debug(0, "%s decoder [%d]", dev_name(&dev->plat_dev->dev),
@@ -256,6 +257,7 @@ static int fops_vcodec_release(struct file *file)
v4l2_fh_exit(&ctx->fh);
v4l2_ctrl_handler_free(&ctx->ctrl_hdl);
+ mtk_vcodec_dbgfs_remove(dev, ctx->id);
list_del_init(&ctx->list);
kfree(ctx);
mutex_unlock(&dev->dev_mutex);
--
2.25.1
Adding echo command to get capture and output queue format type:
'echo -format > vdec'
Signed-off-by: Yunfei Dong <[email protected]>
---
.../mediatek/vcodec/mtk_vcodec_dbgfs.c | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
index 9e7d57d21cea..8a03f986a857 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
@@ -10,6 +10,34 @@
#include "mtk_vcodec_drv.h"
#include "mtk_vcodec_util.h"
+static void mtk_vdec_dbgfs_get_format_type(int output, int capture)
+{
+ switch (output) {
+ case V4L2_PIX_FMT_H264_SLICE:
+ pr_info("output format: h264 slice\n");
+ break;
+ case V4L2_PIX_FMT_VP8_FRAME:
+ pr_info("output format: vp8 slice\n");
+ break;
+ case V4L2_PIX_FMT_VP9_FRAME:
+ pr_info("output format: vp9 slice\n");
+ break;
+ default:
+ pr_info("unsupported output format: 0x%x\n", output);
+ }
+
+ switch (capture) {
+ case V4L2_PIX_FMT_MM21:
+ pr_info("capture format MM21\n");
+ break;
+ case V4L2_PIX_FMT_MT21C:
+ pr_info("capture format MT21C\n");
+ break;
+ default:
+ pr_info("unsupported capture format: 0x%x\n", capture);
+ }
+}
+
static ssize_t mtk_vdec_dbgfs_write(struct file *filp, const char __user *ubuf,
size_t count, loff_t *ppos)
{
@@ -33,11 +61,17 @@ static ssize_t mtk_vdec_dbgfs_write(struct file *filp, const char __user *ubuf,
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
ctx->picinfo.buf_w, ctx->picinfo.buf_h);
}
+
+ if (strstr(buf, "-format")) {
+ str_count++;
+ mtk_vdec_dbgfs_get_format_type(ctx->current_codec, ctx->capture_fourcc);
+ }
}
if (!str_count) {
pr_info("\t can not found useful cmd: %s\n", buf);
pr_info("\t -picinfo ex. echo -picinfo\n");
+ pr_info("\t -format ex. echo -format\n");
}
return count;
--
2.25.1
Add parameter mtk_vcodec_dbg to open each codec log.
Add parameter mtk_v4l2_dbg_level to open each instance log according to
the parameter value.
Signed-off-by: Yunfei Dong <[email protected]>
---
.../mediatek/vcodec/mtk_vcodec_dbgfs.c | 3 +++
.../mediatek/vcodec/mtk_vcodec_util.c | 8 ++++++
.../mediatek/vcodec/mtk_vcodec_util.h | 25 ++++++++++++++++---
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
index adf3f9133b0c..bef78c028a75 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
@@ -19,6 +19,9 @@ void mtk_vcodec_dbgfs_init(struct mtk_vcodec_dev *vcodec_dev)
pr_info("create dir err:%d\n", IS_ERR(vcodec_dev->dbgfs.vcodec_root));
vcodec_root = vcodec_dev->dbgfs.vcodec_root;
+
+ debugfs_create_x32("mtk_v4l2_dbg_level", 0644, vcodec_root, &mtk_v4l2_dbg_level);
+ debugfs_create_x32("mtk_vcodec_dbg", 0644, vcodec_root, &mtk_vcodec_dbg);
}
EXPORT_SYMBOL_GPL(mtk_vcodec_dbgfs_init);
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.c
index ace78c4b5b9e..f214e6f67005 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.c
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.c
@@ -13,6 +13,14 @@
#include "mtk_vcodec_drv.h"
#include "mtk_vcodec_util.h"
+#if defined(CONFIG_DEBUG_FS)
+int mtk_vcodec_dbg;
+EXPORT_SYMBOL(mtk_vcodec_dbg);
+
+int mtk_v4l2_dbg_level;
+EXPORT_SYMBOL(mtk_v4l2_dbg_level);
+#endif
+
void __iomem *mtk_vcodec_get_reg_addr(struct mtk_vcodec_ctx *data,
unsigned int reg_idx)
{
diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.h b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.h
index 71956627a0e2..938f03cab3c9 100644
--- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.h
+++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_util.h
@@ -35,15 +35,34 @@ struct mtk_vcodec_dev;
pr_err("[MTK_VCODEC][ERROR][%d]: " fmt "\n", \
((struct mtk_vcodec_ctx *)(h)->ctx)->id, ##args)
+#if defined(CONFIG_DEBUG_FS)
+extern int mtk_v4l2_dbg_level;
+extern int mtk_vcodec_dbg;
-#define mtk_v4l2_debug(level, fmt, args...) pr_debug(fmt, ##args)
+#define mtk_v4l2_debug(level, fmt, args...) \
+ do { \
+ if (mtk_v4l2_dbg_level >= level) \
+ pr_info("[MTK_V4L2] level=%d %s(),%d: " fmt "\n", \
+ level, __func__, __LINE__, ##args); \
+ } while (0)
-#define mtk_v4l2_debug_enter() mtk_v4l2_debug(3, "+")
-#define mtk_v4l2_debug_leave() mtk_v4l2_debug(3, "-")
+#define mtk_vcodec_debug(h, fmt, args...) \
+ do { \
+ if (mtk_vcodec_dbg) \
+ pr_info("[MTK_VCODEC][%d]: %s() " fmt "\n", \
+ ((struct mtk_vcodec_ctx *)h->ctx)->id, \
+ __func__, ##args); \
+ } while (0)
+#else
+#define mtk_v4l2_debug(level, fmt, args...) pr_debug(fmt, ##args)
#define mtk_vcodec_debug(h, fmt, args...) \
pr_debug("[MTK_VCODEC][%d]: " fmt "\n", \
((struct mtk_vcodec_ctx *)(h)->ctx)->id, ##args)
+#endif
+
+#define mtk_v4l2_debug_enter() mtk_v4l2_debug(3, "+")
+#define mtk_v4l2_debug_leave() mtk_v4l2_debug(3, "-")
#define mtk_vcodec_debug_enter(h) mtk_vcodec_debug(h, "+")
#define mtk_vcodec_debug_leave(h) mtk_vcodec_debug(h, "-")
--
2.25.1
Il 20/03/23 11:28, Yunfei Dong ha scritto:
> In oder to get each instance information according to test command, adding
> one file node "vdec".
>
> Can use echo command to set different string value as 'echo -picinfo > vdec'
> to get real and aligned resolution.
>
> Signed-off-by: Yunfei Dong <[email protected]>
> ---
> .../mediatek/vcodec/mtk_vcodec_dbgfs.c | 85 +++++++++++++++++++
> .../mediatek/vcodec/mtk_vcodec_dbgfs.h | 20 +++++
> .../mediatek/vcodec/mtk_vcodec_dec_drv.c | 2 +
> 3 files changed, 107 insertions(+)
>
> diff --git a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> index bef78c028a75..9e7d57d21cea 100644
> --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> @@ -10,6 +10,86 @@
> #include "mtk_vcodec_drv.h"
> #include "mtk_vcodec_util.h"
>
> +static ssize_t mtk_vdec_dbgfs_write(struct file *filp, const char __user *ubuf,
> + size_t count, loff_t *ppos)
> +{
> + struct mtk_vcodec_dev *vcodec_dev = filp->private_data;
> + char buf[32] = { 0 };
> + int len, str_count = 0;
> + struct mtk_vcodec_dbgfs_inst *dbgfs_inst;
> + struct mtk_vcodec_ctx *ctx;
> +
> + len = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
> + if (len <= 0)
> + return len;
> +
> + list_for_each_entry(dbgfs_inst, &vcodec_dev->dbgfs.dbgfs_head, node) {
> + pr_info("dbgfs_inst id: %d\n", dbgfs_inst->inst_id);
> + ctx = dbgfs_inst->vcodec_ctx;
> +
> + if (strstr(buf, "-picinfo")) {
> + str_count++;
> + pr_info("resolution: real(%dx%d)=>align(%dx%d)\n",
> + ctx->picinfo.pic_w, ctx->picinfo.pic_h,
> + ctx->picinfo.buf_w, ctx->picinfo.buf_h);
If you want to use debugfs (which is a good choice!), you should use debugfs!
This means that you shouldn't print this kind of information to the kernel,
but rather to a debugfs entry.
Example:
$ echo "-picinfo" > vdec
$ cat vdec
resolution: real(1024x768)=>align(something)
This is the same for all of the commits of this series, so, please properly
use debugfs.
Regards,
Angelo
Hi AngeloGioacchino,
Thanks for your suggestion.
On Mon, 2023-03-20 at 15:49 +0100, AngeloGioacchino Del Regno wrote:
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> Il 20/03/23 11:28, Yunfei Dong ha scritto:
> > In oder to get each instance information according to test command,
> > adding
> > one file node "vdec".
> >
> > Can use echo command to set different string value as 'echo
> > -picinfo > vdec'
> > to get real and aligned resolution.
> >
> > Signed-off-by: Yunfei Dong <[email protected]>
> > ---
> > .../mediatek/vcodec/mtk_vcodec_dbgfs.c | 85
> > +++++++++++++++++++
> > .../mediatek/vcodec/mtk_vcodec_dbgfs.h | 20 +++++
> > .../mediatek/vcodec/mtk_vcodec_dec_drv.c | 2 +
> > 3 files changed, 107 insertions(+)
> >
> > diff --git
> > a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> > b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> > index bef78c028a75..9e7d57d21cea 100644
> > --- a/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> > +++ b/drivers/media/platform/mediatek/vcodec/mtk_vcodec_dbgfs.c
> > @@ -10,6 +10,86 @@
> > #include "mtk_vcodec_drv.h"
> > #include "mtk_vcodec_util.h"
> >
> > +static ssize_t mtk_vdec_dbgfs_write(struct file *filp, const char
> > __user *ubuf,
> > + size_t count, loff_t *ppos)
> > +{
> > + struct mtk_vcodec_dev *vcodec_dev = filp->private_data;
> > + char buf[32] = { 0 };
> > + int len, str_count = 0;
> > + struct mtk_vcodec_dbgfs_inst *dbgfs_inst;
> > + struct mtk_vcodec_ctx *ctx;
> > +
> > + len = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos,
> > ubuf, count);
> > + if (len <= 0)
> > + return len;
> > +
> > + list_for_each_entry(dbgfs_inst, &vcodec_dev-
> > >dbgfs.dbgfs_head, node) {
> > + pr_info("dbgfs_inst id: %d\n", dbgfs_inst->inst_id);
> > + ctx = dbgfs_inst->vcodec_ctx;
> > +
> > + if (strstr(buf, "-picinfo")) {
> > + str_count++;
> > + pr_info("resolution:
> > real(%dx%d)=>align(%dx%d)\n",
> > + ctx->picinfo.pic_w, ctx-
> > >picinfo.pic_h,
> > + ctx->picinfo.buf_w, ctx-
> > >picinfo.buf_h);
>
> If you want to use debugfs (which is a good choice!), you should use
> debugfs!
> This means that you shouldn't print this kind of information to the
> kernel,
> but rather to a debugfs entry.
>
> Example:
>
> $ echo "-picinfo" > vdec
> $ cat vdec
>
> resolution: real(1024x768)=>align(something)
>
> This is the same for all of the commits of this series, so, please
> properly
> use debugfs.
>
Add new file ops 'read' to get the debug information with cmd "cat
vdec" instead of pr_info.
>
> Regards,
> Angelo
>
Best Regards,
Yunfei Dong
>