[PATCH v2 4/5] media: hantro: add per-context fdinfo usage stats
Detlev Casanova
detlev.casanova at collabora.com
Wed Jun 17 11:10:59 PDT 2026
From: Christopher Healy <healych at amazon.com>
Add per-file-descriptor hardware utilization tracking to the Hantro
VPU stateless codec driver, exposed via v4l2_stats.
Update the v4l2_stats instance each time a job completes with the
time it took in ns.
This enables userspace monitoring tools to compute per-process decoder
and encoder utilization. The current and max frequency keys report the
same value today since the driver lacks devfreq support, but will
diverge once DVFS is added, allowing userspace to approximate true
capacity utilization without any fdinfo code changes. A future series
can add hardware cycle counter support (via media-cycles) to v4l2_stats
for exact utilization under DVFS, with no changes to the existing uAPI.
Signed-off-by: Christopher Healy <healych at amazon.com>
Signed-off-by: Detlev Casanova <detlev.casanova at collabora.com>
---
drivers/media/platform/verisilicon/hantro.h | 3 +++
drivers/media/platform/verisilicon/hantro_drv.c | 19 +++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/drivers/media/platform/verisilicon/hantro.h b/drivers/media/platform/verisilicon/hantro.h
index 0353de154a1e..37fd13cc7afa 100644
--- a/drivers/media/platform/verisilicon/hantro.h
+++ b/drivers/media/platform/verisilicon/hantro.h
@@ -16,6 +16,7 @@
#include <linux/videodev2.h>
#include <linux/wait.h>
#include <linux/clk.h>
+#include <linux/ktime.h>
#include <linux/reset.h>
#include <media/v4l2-ctrls.h>
@@ -268,6 +269,8 @@ struct hantro_ctx {
struct hantro_postproc_ctx postproc;
bool need_postproc;
+ ktime_t start_time;
+
/* Specific for particular codec modes. */
union {
struct hantro_h264_dec_hw_ctx h264_dec;
diff --git a/drivers/media/platform/verisilicon/hantro_drv.c b/drivers/media/platform/verisilicon/hantro_drv.c
index 2e81877f640f..3b837ef0f3bc 100644
--- a/drivers/media/platform/verisilicon/hantro_drv.c
+++ b/drivers/media/platform/verisilicon/hantro_drv.c
@@ -21,6 +21,7 @@
#include <linux/videodev2.h>
#include <linux/workqueue.h>
#include <media/v4l2-event.h>
+#include <media/v4l2-stats.h>
#include <media/v4l2-mem2mem.h>
#include <media/videobuf2-core.h>
#include <media/videobuf2-vmalloc.h>
@@ -90,6 +91,9 @@ static void hantro_job_finish(struct hantro_dev *vpu,
struct hantro_ctx *ctx,
enum vb2_buffer_state result)
{
+ v4l2_stats_update_hw_usage(&ctx->fh.stats,
+ ktime_to_ns(ktime_sub(ktime_get(), ctx->start_time)));
+
pm_runtime_put_autosuspend(vpu->dev);
clk_bulk_disable(vpu->variant->num_clocks, vpu->clocks);
@@ -186,6 +190,8 @@ static void device_run(void *priv)
v4l2_m2m_buf_copy_metadata(src, dst);
+ ctx->start_time = ktime_get();
+
if (ctx->codec_ops->run(ctx))
goto err_cancel_job;
@@ -664,6 +670,9 @@ static int hantro_open(struct file *filp)
v4l2_fh_init(&ctx->fh, vdev);
v4l2_fh_add(&ctx->fh, filp);
+ v4l2_stats_set_media_dev_type(&ctx->fh.stats,
+ ctx->is_encoder ? MEDIA_DEV_TYPE_V4L2_STATELESS_ENCODER
+ : MEDIA_DEV_TYPE_V4L2_STATELESS_DECODER);
hantro_reset_fmts(ctx);
@@ -701,10 +710,20 @@ static int hantro_release(struct file *filp)
return 0;
}
+static void hantro_show_fdinfo(struct seq_file *m, struct file *f)
+{
+ struct hantro_ctx *ctx = file_to_ctx(f);
+ struct hantro_dev *vpu = ctx->dev;
+
+ v4l2_stats_show(&ctx->fh.stats, m);
+ v4l2_stats_show_clock(m, vpu->clocks[0].clk);
+}
+
static const struct v4l2_file_operations hantro_fops = {
.owner = THIS_MODULE,
.open = hantro_open,
.release = hantro_release,
+ .show_fdinfo = hantro_show_fdinfo,
.poll = v4l2_m2m_fop_poll,
.unlocked_ioctl = video_ioctl2,
.mmap = v4l2_m2m_fop_mmap,
--
2.54.0
More information about the Linux-rockchip
mailing list