From c5063d93e0e6011abe91418a98ed7c7550f0391b Mon Sep 17 00:00:00 2001 From: Venkata Atchuta Bheemeswara Sarma Darbha 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 (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 + * Copyright (C) 2021 Collabora, Ltd. + * Andrzej Pietrasiewicz + * + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Alpha Lin + */ +#include +#include +#include + +#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 + * Copyright (C) 2021 Collabora, Ltd. + * Andrzej Pietrasiewicz + * + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Alpha Lin + */ + +#include +#include +#include + +#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