[PATCH 4/4] media: rkvdec: Switch to tracked dma allocations
From: Detlev Casanova
Date: Wed Sep 16 2026 - 10:36:40 EST
Use the newly introduced v4l2_dma_alloc_attrs and v4l2_dma_free_attrs
functions to track all dma allocations and have them exposed to
userspace for easier debug.
Signed-off-by: Detlev Casanova <detlev.casanova@xxxxxxxxxxxxx>
---
.../media/platform/rockchip/rkvdec/rkvdec-h264.c | 14 ++++++---
.../media/platform/rockchip/rkvdec/rkvdec-hevc.c | 14 ++++++---
.../media/platform/rockchip/rkvdec/rkvdec-rcb.c | 21 ++++++++------
.../platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c | 14 ++++++---
.../platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c | 14 ++++++---
.../platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c | 14 ++++++---
.../platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c | 14 ++++++---
.../media/platform/rockchip/rkvdec/rkvdec-vp9.c | 33 +++++++++++++++-------
drivers/media/platform/rockchip/rkvdec/rkvdec.c | 4 +++
9 files changed, 100 insertions(+), 42 deletions(-)
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c
index d3202cecb988..5b5bc091e792 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c
@@ -11,6 +11,7 @@
#include <media/v4l2-h264.h>
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-regs.h"
@@ -379,8 +380,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx)
if (!h264_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &h264_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &h264_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "h264-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -404,8 +408,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx)
struct rkvdec_h264_ctx *h264_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size,
- h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ h264_ctx->priv_tbl.size,
+ h264_ctx->priv_tbl.cpu,
+ h264_ctx->priv_tbl.dma, 0);
kfree(h264_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c
index ac8b825d080a..fef8bf6c7625 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c
@@ -13,6 +13,7 @@
*/
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-regs.h"
@@ -532,8 +533,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx)
if (!hevc_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &hevc_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &hevc_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "hevc-priv-tbl");
if (!priv_tbl) {
kfree(hevc_ctx);
return -ENOMEM;
@@ -553,8 +557,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx)
struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size,
- hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ hevc_ctx->priv_tbl.size,
+ hevc_ctx->priv_tbl.cpu,
+ hevc_ctx->priv_tbl.dma, 0);
kfree(hevc_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c
index fdcf1f177379..1d43793720c7 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-rcb.c
@@ -13,6 +13,7 @@
#include <linux/genalloc.h>
#include <linux/sizes.h>
#include <linux/types.h>
+#include <media/v4l2-allocator.h>
struct rkvdec_rcb_config {
struct rkvdec_aux_buf *rcb_bufs;
@@ -65,10 +66,10 @@ void rkvdec_free_rcb(struct rkvdec_ctx *ctx)
gen_pool_free(dev->sram_pool, virt_addr, rcb_size);
break;
case RKVDEC_ALLOC_DMA:
- dma_free_coherent(dev->dev,
- rcb_size,
- cfg->rcb_bufs[i].cpu,
- cfg->rcb_bufs[i].dma);
+ v4l2_dma_free_attrs(&dev->v4l2_dev, dev->dev,
+ rcb_size,
+ cfg->rcb_bufs[i].cpu,
+ cfg->rcb_bufs[i].dma, 0);
break;
}
}
@@ -150,10 +151,14 @@ int rkvdec_allocate_rcb(struct rkvdec_ctx *ctx,
ram_fallback:
/* Fallback to RAM */
if (!cpu) {
- cpu = dma_alloc_coherent(ctx->dev->dev,
- rcb_size,
- &dma,
- GFP_KERNEL);
+ char name[32];
+
+ snprintf(name, sizeof(name), "rcb-%d", i);
+ cpu = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, ctx->dev->dev,
+ rcb_size,
+ &dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ name);
alloc_type = RKVDEC_ALLOC_DMA;
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c
index b961fddc8583..b0cb6963c8e0 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-h264.c
@@ -8,6 +8,7 @@
#include <media/v4l2-h264.h>
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-cabac.h"
@@ -387,8 +388,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx)
if (!h264_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &h264_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &h264_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vdpu381-h264-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -412,8 +416,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx)
struct rkvdec_h264_ctx *h264_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size,
- h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ h264_ctx->priv_tbl.size,
+ h264_ctx->priv_tbl.cpu,
+ h264_ctx->priv_tbl.dma, 0);
kfree(h264_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c
index fe6414a17551..c1e16ba6f80f 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu381-hevc.c
@@ -7,6 +7,7 @@
*/
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-cabac.h"
@@ -555,8 +556,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx)
if (!hevc_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &hevc_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &hevc_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vdpu381-hevc-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -580,8 +584,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx)
struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size,
- hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ hevc_ctx->priv_tbl.size,
+ hevc_ctx->priv_tbl.cpu,
+ hevc_ctx->priv_tbl.dma, 0);
kfree(hevc_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c
index fb4f849d7366..3c1d3ca7cb6f 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c
@@ -8,6 +8,7 @@
#include <media/v4l2-h264.h>
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include <linux/iopoll.h>
@@ -455,8 +456,11 @@ static int rkvdec_h264_start(struct rkvdec_ctx *ctx)
if (!h264_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &h264_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &h264_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vdpu383-h264-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -481,8 +485,10 @@ static void rkvdec_h264_stop(struct rkvdec_ctx *ctx)
struct rkvdec_h264_ctx *h264_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, h264_ctx->priv_tbl.size,
- h264_ctx->priv_tbl.cpu, h264_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ h264_ctx->priv_tbl.size,
+ h264_ctx->priv_tbl.cpu,
+ h264_ctx->priv_tbl.dma, 0);
kfree(h264_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c
index 96d938ee70b0..b0ec46f482fa 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c
@@ -7,6 +7,7 @@
*/
#include <media/v4l2-mem2mem.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-cabac.h"
@@ -563,8 +564,11 @@ static int rkvdec_hevc_start(struct rkvdec_ctx *ctx)
if (!hevc_ctx)
return -ENOMEM;
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &hevc_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &hevc_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vdpu383-hevc-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -588,8 +592,10 @@ static void rkvdec_hevc_stop(struct rkvdec_ctx *ctx)
struct rkvdec_hevc_ctx *hevc_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, hevc_ctx->priv_tbl.size,
- hevc_ctx->priv_tbl.cpu, hevc_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ hevc_ctx->priv_tbl.size,
+ hevc_ctx->priv_tbl.cpu,
+ hevc_ctx->priv_tbl.dma, 0);
kfree(hevc_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
index 2751f5396ee8..9f41f6ca82d1 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
@@ -20,6 +20,7 @@
#include <linux/vmalloc.h>
#include <media/v4l2-mem2mem.h>
#include <media/v4l2-vp9.h>
+#include <media/v4l2-allocator.h>
#include "rkvdec.h"
#include "rkvdec-regs.h"
@@ -979,8 +980,11 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx)
ctx->priv = vp9_ctx;
BUILD_BUG_ON(sizeof(priv_tbl->probs) % 16); /* ensure probs size is 128-bit aligned */
- priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl),
- &vp9_ctx->priv_tbl.dma, GFP_KERNEL);
+ priv_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ sizeof(*priv_tbl),
+ &vp9_ctx->priv_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vp9-priv-tbl");
if (!priv_tbl) {
ret = -ENOMEM;
goto err_free_ctx;
@@ -989,8 +993,11 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx)
vp9_ctx->priv_tbl.size = sizeof(*priv_tbl);
vp9_ctx->priv_tbl.cpu = priv_tbl;
- count_tbl = dma_alloc_coherent(rkvdec->dev, RKVDEC_VP9_COUNT_SIZE,
- &vp9_ctx->count_tbl.dma, GFP_KERNEL);
+ count_tbl = v4l2_dma_alloc_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ RKVDEC_VP9_COUNT_SIZE,
+ &vp9_ctx->count_tbl.dma,
+ GFP_KERNEL, 0, &ctx->fh,
+ "vp9-count-tbl");
if (!count_tbl) {
ret = -ENOMEM;
goto err_free_priv_tbl;
@@ -1003,8 +1010,10 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx)
return 0;
err_free_priv_tbl:
- dma_free_coherent(rkvdec->dev, vp9_ctx->priv_tbl.size,
- vp9_ctx->priv_tbl.cpu, vp9_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ vp9_ctx->priv_tbl.size,
+ vp9_ctx->priv_tbl.cpu,
+ vp9_ctx->priv_tbl.dma, 0);
err_free_ctx:
kfree(vp9_ctx);
@@ -1016,10 +1025,14 @@ static void rkvdec_vp9_stop(struct rkvdec_ctx *ctx)
struct rkvdec_vp9_ctx *vp9_ctx = ctx->priv;
struct rkvdec_dev *rkvdec = ctx->dev;
- dma_free_coherent(rkvdec->dev, vp9_ctx->count_tbl.size,
- vp9_ctx->count_tbl.cpu, vp9_ctx->count_tbl.dma);
- dma_free_coherent(rkvdec->dev, vp9_ctx->priv_tbl.size,
- vp9_ctx->priv_tbl.cpu, vp9_ctx->priv_tbl.dma);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ vp9_ctx->count_tbl.size,
+ vp9_ctx->count_tbl.cpu,
+ vp9_ctx->count_tbl.dma, 0);
+ v4l2_dma_free_attrs(&rkvdec->v4l2_dev, rkvdec->dev,
+ vp9_ctx->priv_tbl.size,
+ vp9_ctx->priv_tbl.cpu,
+ vp9_ctx->priv_tbl.dma, 0);
kfree(vp9_ctx);
}
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec.c b/drivers/media/platform/rockchip/rkvdec/rkvdec.c
index 1d1e9bfef8e9..8770fdb5c919 100644
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec.c
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec.c
@@ -1208,6 +1208,8 @@ static int rkvdec_queue_init(void *priv,
src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
src_vq->lock = &rkvdec->vdev_lock;
src_vq->dev = rkvdec->v4l2_dev.dev;
+ src_vq->v4l2_dev = &rkvdec->v4l2_dev;
+ src_vq->v4l2_fh = &ctx->fh;
src_vq->supports_requests = true;
src_vq->requires_requests = true;
@@ -1227,6 +1229,8 @@ static int rkvdec_queue_init(void *priv,
dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
dst_vq->lock = &rkvdec->vdev_lock;
dst_vq->dev = rkvdec->v4l2_dev.dev;
+ dst_vq->v4l2_dev = &rkvdec->v4l2_dev;
+ dst_vq->v4l2_fh = &ctx->fh;
return vb2_queue_init(dst_vq);
}
--
2.55.0