mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
145 lines
4.5 KiB
Diff
145 lines
4.5 KiB
Diff
From 0f399549d6ad29ca704b040df3876442a5a1e339 Mon Sep 17 00:00:00 2001
|
|
From: Alex Bee <knaerzche@gmail.com>
|
|
Date: Fri, 5 Sep 2025 16:19:20 +0000
|
|
Subject: [PATCH 046/113] FROMLIST(v3): media: rkvdec: Add variants support
|
|
|
|
Different versions of the Rockchip VDEC IP exists and one way they can
|
|
differ is what decoding formats are supported.
|
|
|
|
Add a variant implementation in order to support flagging different
|
|
capabilities.
|
|
|
|
Signed-off-by: Alex Bee <knaerzche@gmail.com>
|
|
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
|
|
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
|
---
|
|
.../media/platform/rockchip/rkvdec/rkvdec.c | 22 ++++++++++++++++++-
|
|
.../media/platform/rockchip/rkvdec/rkvdec.h | 11 ++++++++++
|
|
2 files changed, 32 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec.c b/drivers/media/platform/rockchip/rkvdec/rkvdec.c
|
|
index f26e4a1150c9..9406805675d8 100644
|
|
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec.c
|
|
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec.c
|
|
@@ -14,6 +14,7 @@
|
|
#include <linux/iommu.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of.h>
|
|
+#include <linux/of_device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/pm.h>
|
|
#include <linux/pm_runtime.h>
|
|
@@ -327,6 +328,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|
.ops = &rkvdec_hevc_fmt_ops,
|
|
.num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts),
|
|
.decoded_fmts = rkvdec_hevc_decoded_fmts,
|
|
+ .capability = RKVDEC_CAPABILITY_HEVC,
|
|
},
|
|
{
|
|
.fourcc = V4L2_PIX_FMT_H264_SLICE,
|
|
@@ -343,6 +345,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|
.num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_decoded_fmts),
|
|
.decoded_fmts = rkvdec_h264_decoded_fmts,
|
|
.subsystem_flags = VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF,
|
|
+ .capability = RKVDEC_CAPABILITY_H264,
|
|
},
|
|
{
|
|
.fourcc = V4L2_PIX_FMT_VP9_FRAME,
|
|
@@ -358,6 +361,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|
.ops = &rkvdec_vp9_fmt_ops,
|
|
.num_decoded_fmts = ARRAY_SIZE(rkvdec_vp9_decoded_fmts),
|
|
.decoded_fmts = rkvdec_vp9_decoded_fmts,
|
|
+ .capability = RKVDEC_CAPABILITY_VP9,
|
|
}
|
|
};
|
|
|
|
@@ -1186,8 +1190,18 @@ static void rkvdec_watchdog_func(struct work_struct *work)
|
|
}
|
|
}
|
|
|
|
+static const struct rkvdec_variant rk3399_rkvdec_variant = {
|
|
+ .num_regs = 78,
|
|
+ .capabilities = RKVDEC_CAPABILITY_HEVC |
|
|
+ RKVDEC_CAPABILITY_H264 |
|
|
+ RKVDEC_CAPABILITY_VP9,
|
|
+};
|
|
+
|
|
static const struct of_device_id of_rkvdec_match[] = {
|
|
- { .compatible = "rockchip,rk3399-vdec" },
|
|
+ {
|
|
+ .compatible = "rockchip,rk3399-vdec",
|
|
+ .data = &rk3399_rkvdec_variant,
|
|
+ },
|
|
{ /* sentinel */ }
|
|
};
|
|
MODULE_DEVICE_TABLE(of, of_rkvdec_match);
|
|
@@ -1198,16 +1212,22 @@ static const char * const rkvdec_clk_names[] = {
|
|
|
|
static int rkvdec_probe(struct platform_device *pdev)
|
|
{
|
|
+ const struct rkvdec_variant *variant;
|
|
struct rkvdec_dev *rkvdec;
|
|
unsigned int i;
|
|
int ret, irq;
|
|
|
|
+ variant = of_device_get_match_data(&pdev->dev);
|
|
+ if (!variant)
|
|
+ return -EINVAL;
|
|
+
|
|
rkvdec = devm_kzalloc(&pdev->dev, sizeof(*rkvdec), GFP_KERNEL);
|
|
if (!rkvdec)
|
|
return -ENOMEM;
|
|
|
|
platform_set_drvdata(pdev, rkvdec);
|
|
rkvdec->dev = &pdev->dev;
|
|
+ rkvdec->variant = variant;
|
|
mutex_init(&rkvdec->vdev_lock);
|
|
INIT_DELAYED_WORK(&rkvdec->watchdog_work, rkvdec_watchdog_func);
|
|
|
|
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec.h b/drivers/media/platform/rockchip/rkvdec/rkvdec.h
|
|
index c062c5c5bbb2..d2e17eb2cca6 100644
|
|
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec.h
|
|
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec.h
|
|
@@ -22,6 +22,10 @@
|
|
#include <media/videobuf2-core.h>
|
|
#include <media/videobuf2-dma-contig.h>
|
|
|
|
+#define RKVDEC_CAPABILITY_HEVC BIT(0)
|
|
+#define RKVDEC_CAPABILITY_H264 BIT(1)
|
|
+#define RKVDEC_CAPABILITY_VP9 BIT(2)
|
|
+
|
|
struct rkvdec_ctx;
|
|
|
|
struct rkvdec_ctrl_desc {
|
|
@@ -63,6 +67,11 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf)
|
|
base.vb.vb2_buf);
|
|
}
|
|
|
|
+struct rkvdec_variant {
|
|
+ unsigned int num_regs;
|
|
+ unsigned int capabilities;
|
|
+};
|
|
+
|
|
struct rkvdec_coded_fmt_ops {
|
|
int (*adjust_fmt)(struct rkvdec_ctx *ctx,
|
|
struct v4l2_format *f);
|
|
@@ -98,6 +107,7 @@ struct rkvdec_coded_fmt_desc {
|
|
unsigned int num_decoded_fmts;
|
|
const struct rkvdec_decoded_fmt_desc *decoded_fmts;
|
|
u32 subsystem_flags;
|
|
+ unsigned int capability;
|
|
};
|
|
|
|
struct rkvdec_dev {
|
|
@@ -111,6 +121,7 @@ struct rkvdec_dev {
|
|
struct mutex vdev_lock; /* serializes ioctls */
|
|
struct delayed_work watchdog_work;
|
|
struct iommu_domain *empty_domain;
|
|
+ const struct rkvdec_variant *variant;
|
|
};
|
|
|
|
struct rkvdec_ctx {
|
|
--
|
|
2.34.1
|
|
|