[3/6,RESEND] media: mediatek: vcodec: Add a debugfs file to get different useful information
Commit Message
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 <yunfei.dong@mediatek.com>
---
.../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(+)
Comments
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 <yunfei.dong@mediatek.com>
> ---
> .../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 <yunfei.dong@mediatek.com>
> > ---
> > .../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
>
@@ -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);
@@ -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)
{
}
@@ -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);