patches/driver/media: import Sarma's VP9-VDPU381 series (out-of-tree, v8)
Three patches from D.V.A.B. Sarma adding VP9 decode support to the VDPU381 variant of rkvdec (RK3588 generation). Combined ~1500 LOC, 5 new files in drivers/media/platform/rockchip/rkvdec/. Provenance: github.com/dvab-sarma/android_kernel_rk_opi branch add-rkvdec-vdpu381-vp9-v8. Collabora's blog cites the work but it hasn't reached linux-media patchwork yet (Collabora: "v1 series needs to be sent for review soon"). Casanova's underlying VDPU381/VDPU383 H.264+HEVC base IS in mainline 7.0 release. Tested by author on Orange Pi 5 Pro (RK3588) with AOSP 16 + FFMPEG, Profile 0 + Profile 2. Tested in our fleet 2026-05-18: cherry-picks cleanly on top of ampere-minimal-devices, full kernel build (KERNELRELEASE 7.0.0-rc3-vp9-test+) succeeds clean with GCC 16.1.1. Image + DTB + modules + initramfs installed under -vp9-test+ suffix on ampere without touching the running -devices+ kernel; new extlinux label arch_vp9_test added (default unchanged at arch_devices). End-to-end VP9 decode verification pending operator reboot into the new label. Patches NOT yet referenced from fleet/ampere.yaml — that bump is the operator's call (manifest preamble currently scopes VP9 out per issue #6). Once verified, ampere.yaml can add these three under the scope-tagged patch list in apply order 0001→0002→0003. Cross-reference: marfrit/kernel-agent#12.
This commit is contained in:
@@ -0,0 +1,387 @@
|
||||
From c5063d93e0e6011abe91418a98ed7c7550f0391b Mon Sep 17 00:00:00 2001
|
||||
From: Venkata Atchuta Bheemeswara Sarma Darbha <vdarbha0473@gmail.com>
|
||||
Date: Sat, 17 Jan 2026 14:37:07 -0600
|
||||
Subject: [PATCH 2/3] media: rkvdec: Move vp9 functions to common file This is
|
||||
a preparation commit to add support for new variants of the decoder.
|
||||
|
||||
The functions will later be shared with vdpu381 (rk3588).
|
||||
|
||||
Change-Id: Ib9b78331fb6eb0e3a607b06fd5138fc741b2c9c0
|
||||
Signed-off-by: Venkata Atchuta Bheemeswara Sarma Darbha <vdarbha0473@gmail.com>
|
||||
(cherry picked from commit e87662ca32e88ebb910f6cfc1c71096d5d7bc063)
|
||||
---
|
||||
.../media/platform/rockchip/rkvdec/Makefile | 1 +
|
||||
.../rockchip/rkvdec/rkvdec-vp9-common.c | 77 +++++++++++
|
||||
.../rockchip/rkvdec/rkvdec-vp9-common.h | 95 +++++++++++++
|
||||
.../platform/rockchip/rkvdec/rkvdec-vp9.c | 125 +-----------------
|
||||
4 files changed, 174 insertions(+), 124 deletions(-)
|
||||
create mode 100644 drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.c
|
||||
create mode 100644 drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.h
|
||||
|
||||
diff --git a/drivers/media/platform/rockchip/rkvdec/Makefile b/drivers/media/platform/rockchip/rkvdec/Makefile
|
||||
index e629d571e4d8..2bbd67b2db11 100644
|
||||
--- a/drivers/media/platform/rockchip/rkvdec/Makefile
|
||||
+++ b/drivers/media/platform/rockchip/rkvdec/Makefile
|
||||
@@ -12,4 +12,5 @@ rockchip-vdec-y += \
|
||||
rkvdec-vdpu381-hevc.o \
|
||||
rkvdec-vdpu383-h264.o \
|
||||
rkvdec-vdpu383-hevc.o \
|
||||
+ rkvdec-vp9-common.o \
|
||||
rkvdec-vp9.o
|
||||
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.c
|
||||
new file mode 100644
|
||||
index 000000000000..93023737c1ed
|
||||
--- /dev/null
|
||||
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.c
|
||||
@@ -0,0 +1,77 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Rockchip video decoder VP9 common functions
|
||||
+ *
|
||||
+ * Copyright (C) 2019 Collabora, Ltd.
|
||||
+ * Boris Brezillon <boris.brezillon@collabora.com>
|
||||
+ * Copyright (C) 2021 Collabora, Ltd.
|
||||
+ * Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
|
||||
+ * Alpha Lin <Alpha.Lin@rock-chips.com>
|
||||
+ */
|
||||
+#include <linux/v4l2-common.h>
|
||||
+#include <media/v4l2-h264.h>
|
||||
+#include <media/v4l2-mem2mem.h>
|
||||
+
|
||||
+#include "rkvdec.h"
|
||||
+#include "rkvdec-vp9-common.h"
|
||||
+
|
||||
+void write_coeff_plane(const u8 coef[6][6][3], u8 *coeff_plane)
|
||||
+{
|
||||
+ unsigned int idx = 0, byte_count = 0;
|
||||
+ int k, m, n;
|
||||
+ u8 p;
|
||||
+
|
||||
+ for (k = 0; k < 6; k++) {
|
||||
+ for (m = 0; m < 6; m++) {
|
||||
+ for (n = 0; n < 3; n++) {
|
||||
+ p = coef[k][m][n];
|
||||
+ coeff_plane[idx++] = p;
|
||||
+ byte_count++;
|
||||
+ if (byte_count == 27) {
|
||||
+ idx += 5;
|
||||
+ byte_count = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+struct rkvdec_decoded_buffer *
|
||||
+get_ref_buf_vp9(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *dst, u64 timestamp)
|
||||
+{
|
||||
+ struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
|
||||
+ struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q;
|
||||
+ struct vb2_buffer *buf;
|
||||
+
|
||||
+ /*
|
||||
+ * If a ref is unused or invalid, address of current destination
|
||||
+ * buffer is returned.
|
||||
+ */
|
||||
+ buf = vb2_find_buffer(cap_q, timestamp);
|
||||
+ if (!buf)
|
||||
+ buf = &dst->vb2_buf;
|
||||
+
|
||||
+ return vb2_to_rkvdec_decoded_buf(buf);
|
||||
+}
|
||||
+
|
||||
+dma_addr_t get_mv_base_addr(struct rkvdec_decoded_buffer *buf)
|
||||
+{
|
||||
+ unsigned int aligned_pitch, aligned_height, yuv_len;
|
||||
+
|
||||
+ aligned_height = round_up(buf->vp9.height, 64);
|
||||
+ aligned_pitch = round_up(buf->vp9.width * buf->vp9.bit_depth, 512) / 8;
|
||||
+ yuv_len = (aligned_height * aligned_pitch * 3) / 2;
|
||||
+
|
||||
+ return vb2_dma_contig_plane_dma_addr(&buf->base.vb.vb2_buf, 0) +
|
||||
+ yuv_len;
|
||||
+}
|
||||
+
|
||||
+void update_dec_buf_info(struct rkvdec_decoded_buffer *buf,
|
||||
+ const struct v4l2_ctrl_vp9_frame *dec_params)
|
||||
+{
|
||||
+ buf->vp9.width = dec_params->frame_width_minus_1 + 1;
|
||||
+ buf->vp9.height = dec_params->frame_height_minus_1 + 1;
|
||||
+ buf->vp9.bit_depth = dec_params->bit_depth;
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.h b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.h
|
||||
new file mode 100644
|
||||
index 000000000000..056842cf1bba
|
||||
--- /dev/null
|
||||
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9-common.h
|
||||
@@ -0,0 +1,95 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Rockchip video decoder VP9 common functions
|
||||
+ *
|
||||
+ * Copyright (C) 2019 Collabora, Ltd.
|
||||
+ * Boris Brezillon <boris.brezillon@collabora.com>
|
||||
+ * Copyright (C) 2021 Collabora, Ltd.
|
||||
+ * Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
+ *
|
||||
+ * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
|
||||
+ * Alpha Lin <Alpha.Lin@rock-chips.com>
|
||||
+ */
|
||||
+
|
||||
+#include <media/v4l2-h264.h>
|
||||
+#include <media/v4l2-mem2mem.h>
|
||||
+#include <media/v4l2-vp9.h>
|
||||
+
|
||||
+#include "rkvdec.h"
|
||||
+
|
||||
+struct rkvdec_vp9_run {
|
||||
+ struct rkvdec_run base;
|
||||
+ const struct v4l2_ctrl_vp9_frame *decode_params;
|
||||
+};
|
||||
+
|
||||
+struct rkvdec_vp9_intra_mode_probs {
|
||||
+ u8 y_mode[105];
|
||||
+ u8 uv_mode[23];
|
||||
+};
|
||||
+
|
||||
+struct rkvdec_vp9_intra_only_frame_probs {
|
||||
+ u8 coef_intra[4][2][128];
|
||||
+ struct rkvdec_vp9_intra_mode_probs intra_mode[10];
|
||||
+};
|
||||
+
|
||||
+struct rkvdec_vp9_inter_frame_probs {
|
||||
+ u8 y_mode[4][9];
|
||||
+ u8 comp_mode[5];
|
||||
+ u8 comp_ref[5];
|
||||
+ u8 single_ref[5][2];
|
||||
+ u8 inter_mode[7][3];
|
||||
+ u8 interp_filter[4][2];
|
||||
+ u8 padding0[11];
|
||||
+ u8 coef[2][4][2][128];
|
||||
+ u8 uv_mode_0_2[3][9];
|
||||
+ u8 padding1[5];
|
||||
+ u8 uv_mode_3_5[3][9];
|
||||
+ u8 padding2[5];
|
||||
+ u8 uv_mode_6_8[3][9];
|
||||
+ u8 padding3[5];
|
||||
+ u8 uv_mode_9[9];
|
||||
+ u8 padding4[7];
|
||||
+ u8 padding5[16];
|
||||
+ struct {
|
||||
+ u8 joint[3];
|
||||
+ u8 sign[2];
|
||||
+ u8 classes[2][10];
|
||||
+ u8 class0_bit[2];
|
||||
+ u8 bits[2][10];
|
||||
+ u8 class0_fr[2][2][3];
|
||||
+ u8 fr[2][3];
|
||||
+ u8 class0_hp[2];
|
||||
+ u8 hp[2];
|
||||
+ u8 padding6[3];
|
||||
+ } mv;
|
||||
+};
|
||||
+
|
||||
+struct rkvdec_vp9_probs {
|
||||
+ u8 partition[16][3];
|
||||
+ u8 pred[3];
|
||||
+ u8 tree[7];
|
||||
+ u8 skip[3];
|
||||
+ u8 tx32[2][3];
|
||||
+ u8 tx16[2][2];
|
||||
+ u8 tx8[2][1];
|
||||
+ u8 is_inter[4];
|
||||
+ /* 128 bit alignment */
|
||||
+ u8 padding0[3];
|
||||
+ union {
|
||||
+ struct rkvdec_vp9_inter_frame_probs inter;
|
||||
+ struct rkvdec_vp9_intra_only_frame_probs intra_only;
|
||||
+ };
|
||||
+ /* 128 bit alignment */
|
||||
+ u8 padding1[8];
|
||||
+};
|
||||
+
|
||||
+
|
||||
+void write_coeff_plane(const u8 coef[6][6][3], u8 *coeff_plane);
|
||||
+
|
||||
+struct rkvdec_decoded_buffer *
|
||||
+get_ref_buf_vp9(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *dst, u64 timestamp);
|
||||
+
|
||||
+dma_addr_t get_mv_base_addr(struct rkvdec_decoded_buffer *buf);
|
||||
+
|
||||
+void update_dec_buf_info(struct rkvdec_decoded_buffer *buf,
|
||||
+ const struct v4l2_ctrl_vp9_frame *dec_params);
|
||||
diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
|
||||
index bab2e9c83d06..2b368d7b61e0 100644
|
||||
--- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
|
||||
+++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vp9.c
|
||||
@@ -23,71 +23,12 @@
|
||||
|
||||
#include "rkvdec.h"
|
||||
#include "rkvdec-regs.h"
|
||||
+#include "rkvdec-vp9-common.h"
|
||||
|
||||
#define RKVDEC_VP9_PROBE_SIZE 4864
|
||||
#define RKVDEC_VP9_COUNT_SIZE 13232
|
||||
#define RKVDEC_VP9_MAX_SEGMAP_SIZE 73728
|
||||
|
||||
-struct rkvdec_vp9_intra_mode_probs {
|
||||
- u8 y_mode[105];
|
||||
- u8 uv_mode[23];
|
||||
-};
|
||||
-
|
||||
-struct rkvdec_vp9_intra_only_frame_probs {
|
||||
- u8 coef_intra[4][2][128];
|
||||
- struct rkvdec_vp9_intra_mode_probs intra_mode[10];
|
||||
-};
|
||||
-
|
||||
-struct rkvdec_vp9_inter_frame_probs {
|
||||
- u8 y_mode[4][9];
|
||||
- u8 comp_mode[5];
|
||||
- u8 comp_ref[5];
|
||||
- u8 single_ref[5][2];
|
||||
- u8 inter_mode[7][3];
|
||||
- u8 interp_filter[4][2];
|
||||
- u8 padding0[11];
|
||||
- u8 coef[2][4][2][128];
|
||||
- u8 uv_mode_0_2[3][9];
|
||||
- u8 padding1[5];
|
||||
- u8 uv_mode_3_5[3][9];
|
||||
- u8 padding2[5];
|
||||
- u8 uv_mode_6_8[3][9];
|
||||
- u8 padding3[5];
|
||||
- u8 uv_mode_9[9];
|
||||
- u8 padding4[7];
|
||||
- u8 padding5[16];
|
||||
- struct {
|
||||
- u8 joint[3];
|
||||
- u8 sign[2];
|
||||
- u8 classes[2][10];
|
||||
- u8 class0_bit[2];
|
||||
- u8 bits[2][10];
|
||||
- u8 class0_fr[2][2][3];
|
||||
- u8 fr[2][3];
|
||||
- u8 class0_hp[2];
|
||||
- u8 hp[2];
|
||||
- } mv;
|
||||
-};
|
||||
-
|
||||
-struct rkvdec_vp9_probs {
|
||||
- u8 partition[16][3];
|
||||
- u8 pred[3];
|
||||
- u8 tree[7];
|
||||
- u8 skip[3];
|
||||
- u8 tx32[2][3];
|
||||
- u8 tx16[2][2];
|
||||
- u8 tx8[2][1];
|
||||
- u8 is_inter[4];
|
||||
- /* 128 bit alignment */
|
||||
- u8 padding0[3];
|
||||
- union {
|
||||
- struct rkvdec_vp9_inter_frame_probs inter;
|
||||
- struct rkvdec_vp9_intra_only_frame_probs intra_only;
|
||||
- };
|
||||
- /* 128 bit alignment */
|
||||
- u8 padding1[11];
|
||||
-};
|
||||
-
|
||||
/* Data structure describing auxiliary buffer format. */
|
||||
struct rkvdec_vp9_priv_tbl {
|
||||
struct rkvdec_vp9_probs probs;
|
||||
@@ -136,11 +77,6 @@ struct rkvdec_vp9_intra_frame_symbol_counts {
|
||||
struct rkvdec_vp9_refs_counts ref_cnt[2][4][2][6][6];
|
||||
};
|
||||
|
||||
-struct rkvdec_vp9_run {
|
||||
- struct rkvdec_run base;
|
||||
- const struct v4l2_ctrl_vp9_frame *decode_params;
|
||||
-};
|
||||
-
|
||||
struct rkvdec_vp9_frame_info {
|
||||
u32 valid : 1;
|
||||
u32 segmapid : 1;
|
||||
@@ -166,27 +102,6 @@ struct rkvdec_vp9_ctx {
|
||||
struct rkvdec_regs regs;
|
||||
};
|
||||
|
||||
-static void write_coeff_plane(const u8 coef[6][6][3], u8 *coeff_plane)
|
||||
-{
|
||||
- unsigned int idx = 0, byte_count = 0;
|
||||
- int k, m, n;
|
||||
- u8 p;
|
||||
-
|
||||
- for (k = 0; k < 6; k++) {
|
||||
- for (m = 0; m < 6; m++) {
|
||||
- for (n = 0; n < 3; n++) {
|
||||
- p = coef[k][m][n];
|
||||
- coeff_plane[idx++] = p;
|
||||
- byte_count++;
|
||||
- if (byte_count == 27) {
|
||||
- idx += 5;
|
||||
- byte_count = 0;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static void init_intra_only_probs(struct rkvdec_ctx *ctx,
|
||||
const struct rkvdec_vp9_run *run)
|
||||
{
|
||||
@@ -348,36 +263,6 @@ static void init_probs(struct rkvdec_ctx *ctx,
|
||||
init_inter_probs(ctx, run);
|
||||
}
|
||||
|
||||
-static struct rkvdec_decoded_buffer *
|
||||
-get_ref_buf_vp9(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *dst, u64 timestamp)
|
||||
-{
|
||||
- struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx;
|
||||
- struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q;
|
||||
- struct vb2_buffer *buf;
|
||||
-
|
||||
- /*
|
||||
- * If a ref is unused or invalid, address of current destination
|
||||
- * buffer is returned.
|
||||
- */
|
||||
- buf = vb2_find_buffer(cap_q, timestamp);
|
||||
- if (!buf)
|
||||
- buf = &dst->vb2_buf;
|
||||
-
|
||||
- return vb2_to_rkvdec_decoded_buf(buf);
|
||||
-}
|
||||
-
|
||||
-static dma_addr_t get_mv_base_addr(struct rkvdec_decoded_buffer *buf)
|
||||
-{
|
||||
- unsigned int aligned_pitch, aligned_height, yuv_len;
|
||||
-
|
||||
- aligned_height = round_up(buf->vp9.height, 64);
|
||||
- aligned_pitch = round_up(buf->vp9.width * buf->vp9.bit_depth, 512) / 8;
|
||||
- yuv_len = (aligned_height * aligned_pitch * 3) / 2;
|
||||
-
|
||||
- return vb2_dma_contig_plane_dma_addr(&buf->base.vb.vb2_buf, 0) +
|
||||
- yuv_len;
|
||||
-}
|
||||
-
|
||||
static void config_ref_registers(struct rkvdec_ctx *ctx,
|
||||
const struct rkvdec_vp9_run *run,
|
||||
struct rkvdec_decoded_buffer *ref_buf,
|
||||
@@ -446,14 +331,6 @@ static void config_seg_registers(struct rkvdec_ctx *ctx, unsigned int segid)
|
||||
(seg->flags & V4L2_VP9_SEGMENTATION_FLAG_ABS_OR_DELTA_UPDATE);
|
||||
}
|
||||
|
||||
-static void update_dec_buf_info(struct rkvdec_decoded_buffer *buf,
|
||||
- const struct v4l2_ctrl_vp9_frame *dec_params)
|
||||
-{
|
||||
- buf->vp9.width = dec_params->frame_width_minus_1 + 1;
|
||||
- buf->vp9.height = dec_params->frame_height_minus_1 + 1;
|
||||
- buf->vp9.bit_depth = dec_params->bit_depth;
|
||||
-}
|
||||
-
|
||||
static void update_ctx_cur_info(struct rkvdec_vp9_ctx *vp9_ctx,
|
||||
struct rkvdec_decoded_buffer *buf,
|
||||
const struct v4l2_ctrl_vp9_frame *dec_params)
|
||||
--
|
||||
2.54.0
|
||||
|
||||
Reference in New Issue
Block a user