From nobody Thu Apr 2 17:17:19 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AEFB3E4C77; Thu, 2 Apr 2026 14:06:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138815; cv=none; b=UAVAMru2rTPeEzqfysiqP812bRfMvmcB9goPYfmFVIytLdqHuROvNOcjUtpNRaEyL85xlGuyFR6FaWH4a6GNle1jY4LiIF4VFVEhWz13bZTVzQB7Hy5C2FJSrgjaIU0xccrNM4+ka3mANHlZeBwzHnC+WLkQ0Ytr7VWWwsTd1lo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138815; c=relaxed/simple; bh=As7/gVu1sJ+y6ys4Y3SKwdd1ZSGMxwdpofSGLrL/FaY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aIKoOsMX+F8wktMT2txmFHtueK0n/OJIwLC00Gl7QeJWgU1NBZOaiDG0QBgBx2tXLOQMoucqu//a2oTuSosv9hkGH8QF4OHapteNvJcpt727KQihq45k48xKcpeyGqQ/B+QJ+anjJfJ382rZIFxFwuTOKWBpdMcVaJSvTzSSOaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=LX3jvb0p; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="LX3jvb0p" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1775138812; bh=As7/gVu1sJ+y6ys4Y3SKwdd1ZSGMxwdpofSGLrL/FaY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LX3jvb0p6JCmd2NTfa2tsvkqCOq71dyjBav4oMr73Ki45+G8rhNIosQGZ9b2pZoi2 H8w+Th1PaIauWvjegWhSU+3LtO+FTbIG5y5ARFQESdDeY6o+fk7eufG6E9xQo3y/Zt cAM/dfkoRW/ZQb9lB1B1wdSSZC9EYNE2ea4D1yZucdW9SK+527M7BJdUlpC4DRT5UZ OICnWDB43EgnCW3OqVD6L0guSfkU7FsNbV7ygiUfAdDOMWnGl75Nd/fCXs8jdJrm0K L6vkhEmxY6TlQOcmuEcIeOARNgfiyqIeELEA7sgKoBgsyWR/Yrkcstp7aOFUj9x9U9 jFkTE4jPOqoLA== Received: from [192.168.0.15] (modemcable014.2-22-96.mc.videotron.ca [96.22.2.14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id A1AAE17E7828; Thu, 2 Apr 2026 16:06:50 +0200 (CEST) From: Detlev Casanova Date: Thu, 02 Apr 2026 10:06:36 -0400 Subject: [PATCH v3 1/4] media: rkvdec: Introduce a global bitwriter helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260402-rkvdec-use-bitwriter-v3-1-2072474ceaf4@collabora.com> References: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> In-Reply-To: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> To: Ezequiel Garcia , Mauro Carvalho Chehab , Heiko Stuebner , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Jonas Karlman , Nicolas Dufresne Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, llvm@lists.linux.dev, kernel@collabora.com, Detlev Casanova X-Mailer: b4 0.15.0 The use of structures with bitfields is good when the values are somewhat aligned. More mis-alignement means that compilers need to do more gymanstics to edit the fields values. Some cases have been reported with CLang on specific architectures like armhf and hexagon, where the compiler would allocate a bigger local stack than needed or even completely freeze during compilation. Some fixes have been provided to ease the issues, but the real fix here is to use a bitwriter instead of heavily unaligned bitfields. This is a preparation commit to provide a global bitwriter interface for the whole driver. Signed-off-by: Detlev Casanova --- .../platform/rockchip/rkvdec/rkvdec-bitwriter.h | 39 ++++++++++++++++++= ++++ 1 file changed, 39 insertions(+) diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-bitwriter.h b/dr= ivers/media/platform/rockchip/rkvdec/rkvdec-bitwriter.h new file mode 100644 index 000000000000..2a5c271ade91 --- /dev/null +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-bitwriter.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Rockchip Video Decoder bit writer + * + * Copyright (C) 2026 Collabora, Ltd. + * Detlev Casanova + * Copyright (C) 2019 Collabora, Ltd. + * Boris Brezillon + */ + +#ifndef RKVDEC_BIT_WRITER_H_ +#define RKVDEC_BIT_WRITER_H_ + +#include +#include + +struct rkvdec_bw_field { + u16 offset; + u8 len; +}; + +#define BW_FIELD(_offset, _len) ((struct rkvdec_bw_field){ _offset, _len }) + +static inline void rkvdec_set_bw_field(u32 *buf, struct rkvdec_bw_field fi= eld, u32 value) +{ + u8 bit =3D field.offset % 32; + u16 word =3D field.offset / 32; + u64 mask =3D GENMASK_ULL(bit + field.len - 1, bit); + u64 val =3D ((u64)value << bit) & mask; + + buf[word] &=3D ~mask; + buf[word] |=3D val; + if (bit + field.len > 32) { + buf[word + 1] &=3D ~(mask >> 32); + buf[word + 1] |=3D val >> 32; + } +} + +#endif /* RKVDEC_BIT_WRITER_H_ */ --=20 2.53.0 From nobody Thu Apr 2 17:17:19 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 721133E95A4; Thu, 2 Apr 2026 14:06:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138818; cv=none; b=UsW48GML6j/9CLcYxRS+4155jBiQqF+NhsZ0HMVKfDcmAeG3K75SMundvH8gaf2t5ZTnKeNYiq0hK3A7kZhrVANDq5gtQTY38FHpDf7B1Ish66qQoY/jWQq2K2qGVSgicyJ9J50HwYC1dXHhU0cpUkQ+XF1DBK+0oBNLRsZ1J/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138818; c=relaxed/simple; bh=ztdOpe1+N7AYJi9ZYllZm3LlSnBDs1ybZtX80GDvQQA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A8Od5z/Hk9SnDuiWUQkCCPk2Pk+SpiWoXFfFsMk9bDOZvfr6k4mLzbeanttqrhrFV+u/jMcBQ7WuILnB/hG5OPevkR/3zVJYD9lVPLAVUamiQXDWlC7Nkn6Sf9tTqGWhfGBJUA6H1GpfwRvPG4JPawtLzoxuTqZ6kmfyHG0YgmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=nrebVlyd; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="nrebVlyd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1775138814; bh=ztdOpe1+N7AYJi9ZYllZm3LlSnBDs1ybZtX80GDvQQA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nrebVlydtOn5w60RvAt5xUxxpwn1bEmiKyPMNB90/mHLTJPACi3SNte1OWAjykx/B hB9EPUWve6RmsTIdl7pQWziQGqswdEAeQGjPQlMhIj27Y0bp0cQTsU/9lzG/z4LEkj fyDcg+oWdKFbamWkOu9joUJfmjHEzdDW+XwreMu+7IRKtyEcA1sRZZWKFrdqaJKugf kOWz8cExo8LeWMQC56/VP+MTPAk4DweulUYxCS5x62l+qWSdbWbHmnaKXRCNIHxVlm 9Zjzj92aD2PkfOF3LAu3TugtCWhPjeVWFFt9lz42PPCHiOYdm7HoY5R94KgCgiUBLL ed6aE63jLy8wg== Received: from [192.168.0.15] (modemcable014.2-22-96.mc.videotron.ca [96.22.2.14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id DDA0717E79E8; Thu, 2 Apr 2026 16:06:52 +0200 (CEST) From: Detlev Casanova Date: Thu, 02 Apr 2026 10:06:37 -0400 Subject: [PATCH v3 2/4] media: rkvdec: Use the global bitwriter instead of local one Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260402-rkvdec-use-bitwriter-v3-2-2072474ceaf4@collabora.com> References: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> In-Reply-To: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> To: Ezequiel Garcia , Mauro Carvalho Chehab , Heiko Stuebner , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Jonas Karlman , Nicolas Dufresne Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, llvm@lists.linux.dev, kernel@collabora.com, Detlev Casanova X-Mailer: b4 0.15.0 Both rkvdec-h264.c and rkvdec-hevc.c use their own bitwriter function and macros. Move to using the global one introduced before. Signed-off-by: Detlev Casanova --- .../media/platform/rockchip/rkvdec/rkvdec-h264.c | 109 ++++++------- .../media/platform/rockchip/rkvdec/rkvdec-hevc.c | 171 +++++++++--------= ---- 2 files changed, 119 insertions(+), 161 deletions(-) diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c b/drivers= /media/platform/rockchip/rkvdec/rkvdec-h264.c index d3202cecb988..ffa606038192 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264.c @@ -16,6 +16,7 @@ #include "rkvdec-regs.h" #include "rkvdec-cabac.h" #include "rkvdec-h264-common.h" +#include "rkvdec-bitwriter.h" =20 /* Size with u32 units. */ #define RKV_CABAC_INIT_BUFFER_SIZE (3680 + 128) @@ -25,56 +26,48 @@ struct rkvdec_sps_pps_packet { u32 info[8]; }; =20 -struct rkvdec_ps_field { - u16 offset; - u8 len; -}; - -#define PS_FIELD(_offset, _len) \ - ((struct rkvdec_ps_field){ _offset, _len }) - -#define SEQ_PARAMETER_SET_ID PS_FIELD(0, 4) -#define PROFILE_IDC PS_FIELD(4, 8) -#define CONSTRAINT_SET3_FLAG PS_FIELD(12, 1) -#define CHROMA_FORMAT_IDC PS_FIELD(13, 2) -#define BIT_DEPTH_LUMA PS_FIELD(15, 3) -#define BIT_DEPTH_CHROMA PS_FIELD(18, 3) -#define QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG PS_FIELD(21, 1) -#define LOG2_MAX_FRAME_NUM_MINUS4 PS_FIELD(22, 4) -#define MAX_NUM_REF_FRAMES PS_FIELD(26, 5) -#define PIC_ORDER_CNT_TYPE PS_FIELD(31, 2) -#define LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4 PS_FIELD(33, 4) -#define DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG PS_FIELD(37, 1) -#define PIC_WIDTH_IN_MBS PS_FIELD(38, 9) -#define PIC_HEIGHT_IN_MBS PS_FIELD(47, 9) -#define FRAME_MBS_ONLY_FLAG PS_FIELD(56, 1) -#define MB_ADAPTIVE_FRAME_FIELD_FLAG PS_FIELD(57, 1) -#define DIRECT_8X8_INFERENCE_FLAG PS_FIELD(58, 1) -#define MVC_EXTENSION_ENABLE PS_FIELD(59, 1) -#define NUM_VIEWS PS_FIELD(60, 2) -#define VIEW_ID(i) PS_FIELD(62 + ((i) * 10), 10) -#define NUM_ANCHOR_REFS_L(i) PS_FIELD(82 + ((i) * 11), 1) -#define ANCHOR_REF_L(i) PS_FIELD(83 + ((i) * 11), 10) -#define NUM_NON_ANCHOR_REFS_L(i) PS_FIELD(104 + ((i) * 11), 1) -#define NON_ANCHOR_REFS_L(i) PS_FIELD(105 + ((i) * 11), 10) -#define PIC_PARAMETER_SET_ID PS_FIELD(128, 8) -#define PPS_SEQ_PARAMETER_SET_ID PS_FIELD(136, 5) -#define ENTROPY_CODING_MODE_FLAG PS_FIELD(141, 1) -#define BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT_FLAG PS_FIELD(142, 1) -#define NUM_REF_IDX_L_DEFAULT_ACTIVE_MINUS1(i) PS_FIELD(143 + ((i) * 5), = 5) -#define WEIGHTED_PRED_FLAG PS_FIELD(153, 1) -#define WEIGHTED_BIPRED_IDC PS_FIELD(154, 2) -#define PIC_INIT_QP_MINUS26 PS_FIELD(156, 7) -#define PIC_INIT_QS_MINUS26 PS_FIELD(163, 6) -#define CHROMA_QP_INDEX_OFFSET PS_FIELD(169, 5) -#define DEBLOCKING_FILTER_CONTROL_PRESENT_FLAG PS_FIELD(174, 1) -#define CONSTRAINED_INTRA_PRED_FLAG PS_FIELD(175, 1) -#define REDUNDANT_PIC_CNT_PRESENT PS_FIELD(176, 1) -#define TRANSFORM_8X8_MODE_FLAG PS_FIELD(177, 1) -#define SECOND_CHROMA_QP_INDEX_OFFSET PS_FIELD(178, 5) -#define SCALING_LIST_ENABLE_FLAG PS_FIELD(183, 1) -#define SCALING_LIST_ADDRESS PS_FIELD(184, 32) -#define IS_LONG_TERM(i) PS_FIELD(216 + (i), 1) +#define SEQ_PARAMETER_SET_ID BW_FIELD(0, 4) +#define PROFILE_IDC BW_FIELD(4, 8) +#define CONSTRAINT_SET3_FLAG BW_FIELD(12, 1) +#define CHROMA_FORMAT_IDC BW_FIELD(13, 2) +#define BIT_DEPTH_LUMA BW_FIELD(15, 3) +#define BIT_DEPTH_CHROMA BW_FIELD(18, 3) +#define QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG BW_FIELD(21, 1) +#define LOG2_MAX_FRAME_NUM_MINUS4 BW_FIELD(22, 4) +#define MAX_NUM_REF_FRAMES BW_FIELD(26, 5) +#define PIC_ORDER_CNT_TYPE BW_FIELD(31, 2) +#define LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4 BW_FIELD(33, 4) +#define DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG BW_FIELD(37, 1) +#define PIC_WIDTH_IN_MBS BW_FIELD(38, 9) +#define PIC_HEIGHT_IN_MBS BW_FIELD(47, 9) +#define FRAME_MBS_ONLY_FLAG BW_FIELD(56, 1) +#define MB_ADAPTIVE_FRAME_FIELD_FLAG BW_FIELD(57, 1) +#define DIRECT_8X8_INFERENCE_FLAG BW_FIELD(58, 1) +#define MVC_EXTENSION_ENABLE BW_FIELD(59, 1) +#define NUM_VIEWS BW_FIELD(60, 2) +#define VIEW_ID(i) BW_FIELD(62 + ((i) * 10), 10) +#define NUM_ANCHOR_REFS_L(i) BW_FIELD(82 + ((i) * 11), 1) +#define ANCHOR_REF_L(i) BW_FIELD(83 + ((i) * 11), 10) +#define NUM_NON_ANCHOR_REFS_L(i) BW_FIELD(104 + ((i) * 11), 1) +#define NON_ANCHOR_REFS_L(i) BW_FIELD(105 + ((i) * 11), 10) +#define PIC_PARAMETER_SET_ID BW_FIELD(128, 8) +#define PPS_SEQ_PARAMETER_SET_ID BW_FIELD(136, 5) +#define ENTROPY_CODING_MODE_FLAG BW_FIELD(141, 1) +#define BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT_FLAG BW_FIELD(142, 1) +#define NUM_REF_IDX_L_DEFAULT_ACTIVE_MINUS1(i) BW_FIELD(143 + ((i) * 5), = 5) +#define WEIGHTED_PRED_FLAG BW_FIELD(153, 1) +#define WEIGHTED_BIPRED_IDC BW_FIELD(154, 2) +#define PIC_INIT_QP_MINUS26 BW_FIELD(156, 7) +#define PIC_INIT_QS_MINUS26 BW_FIELD(163, 6) +#define CHROMA_QP_INDEX_OFFSET BW_FIELD(169, 5) +#define DEBLOCKING_FILTER_CONTROL_PRESENT_FLAG BW_FIELD(174, 1) +#define CONSTRAINED_INTRA_PRED_FLAG BW_FIELD(175, 1) +#define REDUNDANT_PIC_CNT_PRESENT BW_FIELD(176, 1) +#define TRANSFORM_8X8_MODE_FLAG BW_FIELD(177, 1) +#define SECOND_CHROMA_QP_INDEX_OFFSET BW_FIELD(178, 5) +#define SCALING_LIST_ENABLE_FLAG BW_FIELD(183, 1) +#define SCALING_LIST_ADDRESS BW_FIELD(184, 32) +#define IS_LONG_TERM(i) BW_FIELD(216 + (i), 1) =20 /* Data structure describing auxiliary buffer format. */ struct rkvdec_h264_priv_tbl { @@ -91,20 +84,6 @@ struct rkvdec_h264_ctx { struct rkvdec_regs regs; }; =20 -static void set_ps_field(u32 *buf, struct rkvdec_ps_field field, u32 value) -{ - u8 bit =3D field.offset % 32, word =3D field.offset / 32; - u64 mask =3D GENMASK_ULL(bit + field.len - 1, bit); - u64 val =3D ((u64)value << bit) & mask; - - buf[word] &=3D ~mask; - buf[word] |=3D val; - if (bit + field.len > 32) { - buf[word + 1] &=3D ~(mask >> 32); - buf[word + 1] |=3D val >> 32; - } -} - static void assemble_hw_pps(struct rkvdec_ctx *ctx, struct rkvdec_h264_run *run) { @@ -128,7 +107,7 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, hw_ps =3D &priv_tbl->param_set[pps->pic_parameter_set_id]; memset(hw_ps, 0, sizeof(*hw_ps)); =20 -#define WRITE_PPS(value, field) set_ps_field(hw_ps->info, field, value) +#define WRITE_PPS(value, field) rkvdec_set_bw_field(hw_ps->info, field, va= lue) /* write sps */ WRITE_PPS(sps->seq_parameter_set_id, SEQ_PARAMETER_SET_ID); WRITE_PPS(sps->profile_idc, PROFILE_IDC); diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c b/drivers= /media/platform/rockchip/rkvdec/rkvdec-hevc.c index ac8b825d080a..87abf93dfd5e 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc.c @@ -18,6 +18,7 @@ #include "rkvdec-regs.h" #include "rkvdec-cabac.h" #include "rkvdec-hevc-common.h" +#include "rkvdec-bitwriter.h" =20 /* Size in u8/u32 units. */ #define RKV_SCALING_LIST_SIZE 1360 @@ -34,80 +35,72 @@ struct rkvdec_rps_packet { u32 info[RKV_RPS_SIZE]; }; =20 -struct rkvdec_ps_field { - u16 offset; - u8 len; -}; - -#define PS_FIELD(_offset, _len) \ - ((struct rkvdec_ps_field){ _offset, _len }) - /* SPS */ -#define VIDEO_PARAMETER_SET_ID PS_FIELD(0, 4) -#define SEQ_PARAMETER_SET_ID PS_FIELD(4, 4) -#define CHROMA_FORMAT_IDC PS_FIELD(8, 2) -#define PIC_WIDTH_IN_LUMA_SAMPLES PS_FIELD(10, 13) -#define PIC_HEIGHT_IN_LUMA_SAMPLES PS_FIELD(23, 13) -#define BIT_DEPTH_LUMA PS_FIELD(36, 4) -#define BIT_DEPTH_CHROMA PS_FIELD(40, 4) -#define LOG2_MAX_PIC_ORDER_CNT_LSB PS_FIELD(44, 5) -#define LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE PS_FIELD(49, 2) -#define LOG2_MIN_LUMA_CODING_BLOCK_SIZE PS_FIELD(51, 3) -#define LOG2_MIN_TRANSFORM_BLOCK_SIZE PS_FIELD(54, 3) -#define LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_SIZE PS_FIELD(57, 2) -#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTER PS_FIELD(59, 3) -#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA PS_FIELD(62, 3) -#define SCALING_LIST_ENABLED_FLAG PS_FIELD(65, 1) -#define AMP_ENABLED_FLAG PS_FIELD(66, 1) -#define SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG PS_FIELD(67, 1) -#define PCM_ENABLED_FLAG PS_FIELD(68, 1) -#define PCM_SAMPLE_BIT_DEPTH_LUMA PS_FIELD(69, 4) -#define PCM_SAMPLE_BIT_DEPTH_CHROMA PS_FIELD(73, 4) -#define PCM_LOOP_FILTER_DISABLED_FLAG PS_FIELD(77, 1) -#define LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE PS_FIELD(78, 3) -#define LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE PS_FIELD(81, 3) -#define NUM_SHORT_TERM_REF_PIC_SETS PS_FIELD(84, 7) -#define LONG_TERM_REF_PICS_PRESENT_FLAG PS_FIELD(91, 1) -#define NUM_LONG_TERM_REF_PICS_SPS PS_FIELD(92, 6) -#define SPS_TEMPORAL_MVP_ENABLED_FLAG PS_FIELD(98, 1) -#define STRONG_INTRA_SMOOTHING_ENABLED_FLAG PS_FIELD(99, 1) +#define VIDEO_PARAMETER_SET_ID BW_FIELD(0, 4) +#define SEQ_PARAMETER_SET_ID BW_FIELD(4, 4) +#define CHROMA_FORMAT_IDC BW_FIELD(8, 2) +#define PIC_WIDTH_IN_LUMA_SAMPLES BW_FIELD(10, 13) +#define PIC_HEIGHT_IN_LUMA_SAMPLES BW_FIELD(23, 13) +#define BIT_DEPTH_LUMA BW_FIELD(36, 4) +#define BIT_DEPTH_CHROMA BW_FIELD(40, 4) +#define LOG2_MAX_PIC_ORDER_CNT_LSB BW_FIELD(44, 5) +#define LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE BW_FIELD(49, 2) +#define LOG2_MIN_LUMA_CODING_BLOCK_SIZE BW_FIELD(51, 3) +#define LOG2_MIN_TRANSFORM_BLOCK_SIZE BW_FIELD(54, 3) +#define LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_SIZE BW_FIELD(57, 2) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTER BW_FIELD(59, 3) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA BW_FIELD(62, 3) +#define SCALING_LIST_ENABLED_FLAG BW_FIELD(65, 1) +#define AMP_ENABLED_FLAG BW_FIELD(66, 1) +#define SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG BW_FIELD(67, 1) +#define PCM_ENABLED_FLAG BW_FIELD(68, 1) +#define PCM_SAMPLE_BIT_DEPTH_LUMA BW_FIELD(69, 4) +#define PCM_SAMPLE_BIT_DEPTH_CHROMA BW_FIELD(73, 4) +#define PCM_LOOP_FILTER_DISABLED_FLAG BW_FIELD(77, 1) +#define LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE BW_FIELD(78, 3) +#define LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE BW_FIELD(81, 3) +#define NUM_SHORT_TERM_REF_PIC_SETS BW_FIELD(84, 7) +#define LONG_TERM_REF_PICS_PRESENT_FLAG BW_FIELD(91, 1) +#define NUM_LONG_TERM_REF_PICS_SPS BW_FIELD(92, 6) +#define SPS_TEMPORAL_MVP_ENABLED_FLAG BW_FIELD(98, 1) +#define STRONG_INTRA_SMOOTHING_ENABLED_FLAG BW_FIELD(99, 1) /* PPS */ -#define PIC_PARAMETER_SET_ID PS_FIELD(128, 6) -#define PPS_SEQ_PARAMETER_SET_ID PS_FIELD(134, 4) -#define DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG PS_FIELD(138, 1) -#define OUTPUT_FLAG_PRESENT_FLAG PS_FIELD(139, 1) -#define NUM_EXTRA_SLICE_HEADER_BITS PS_FIELD(140, 13) -#define SIGN_DATA_HIDING_ENABLED_FLAG PS_FIELD(153, 1) -#define CABAC_INIT_PRESENT_FLAG PS_FIELD(154, 1) -#define NUM_REF_IDX_L0_DEFAULT_ACTIVE PS_FIELD(155, 4) -#define NUM_REF_IDX_L1_DEFAULT_ACTIVE PS_FIELD(159, 4) -#define INIT_QP_MINUS26 PS_FIELD(163, 7) -#define CONSTRAINED_INTRA_PRED_FLAG PS_FIELD(170, 1) -#define TRANSFORM_SKIP_ENABLED_FLAG PS_FIELD(171, 1) -#define CU_QP_DELTA_ENABLED_FLAG PS_FIELD(172, 1) -#define LOG2_MIN_CU_QP_DELTA_SIZE PS_FIELD(173, 3) -#define PPS_CB_QP_OFFSET PS_FIELD(176, 5) -#define PPS_CR_QP_OFFSET PS_FIELD(181, 5) -#define PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG PS_FIELD(186, 1) -#define WEIGHTED_PRED_FLAG PS_FIELD(187, 1) -#define WEIGHTED_BIPRED_FLAG PS_FIELD(188, 1) -#define TRANSQUANT_BYPASS_ENABLED_FLAG PS_FIELD(189, 1) -#define TILES_ENABLED_FLAG PS_FIELD(190, 1) -#define ENTROPY_CODING_SYNC_ENABLED_FLAG PS_FIELD(191, 1) -#define PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG PS_FIELD(192, 1) -#define LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG PS_FIELD(193, 1) -#define DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG PS_FIELD(194, 1) -#define PPS_DEBLOCKING_FILTER_DISABLED_FLAG PS_FIELD(195, 1) -#define PPS_BETA_OFFSET_DIV2 PS_FIELD(196, 4) -#define PPS_TC_OFFSET_DIV2 PS_FIELD(200, 4) -#define LISTS_MODIFICATION_PRESENT_FLAG PS_FIELD(204, 1) -#define LOG2_PARALLEL_MERGE_LEVEL PS_FIELD(205, 3) -#define SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_FLAG PS_FIELD(208, 1) -#define NUM_TILE_COLUMNS PS_FIELD(212, 5) -#define NUM_TILE_ROWS PS_FIELD(217, 5) -#define COLUMN_WIDTH(i) PS_FIELD(256 + ((i) * 8), 8) -#define ROW_HEIGHT(i) PS_FIELD(416 + ((i) * 8), 8) -#define SCALING_LIST_ADDRESS PS_FIELD(592, 32) +#define PIC_PARAMETER_SET_ID BW_FIELD(128, 6) +#define PPS_SEQ_PARAMETER_SET_ID BW_FIELD(134, 4) +#define DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG BW_FIELD(138, 1) +#define OUTPUT_FLAG_PRESENT_FLAG BW_FIELD(139, 1) +#define NUM_EXTRA_SLICE_HEADER_BITS BW_FIELD(140, 13) +#define SIGN_DATA_HIDING_ENABLED_FLAG BW_FIELD(153, 1) +#define CABAC_INIT_PRESENT_FLAG BW_FIELD(154, 1) +#define NUM_REF_IDX_L0_DEFAULT_ACTIVE BW_FIELD(155, 4) +#define NUM_REF_IDX_L1_DEFAULT_ACTIVE BW_FIELD(159, 4) +#define INIT_QP_MINUS26 BW_FIELD(163, 7) +#define CONSTRAINED_INTRA_PRED_FLAG BW_FIELD(170, 1) +#define TRANSFORM_SKIP_ENABLED_FLAG BW_FIELD(171, 1) +#define CU_QP_DELTA_ENABLED_FLAG BW_FIELD(172, 1) +#define LOG2_MIN_CU_QP_DELTA_SIZE BW_FIELD(173, 3) +#define PPS_CB_QP_OFFSET BW_FIELD(176, 5) +#define PPS_CR_QP_OFFSET BW_FIELD(181, 5) +#define PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG BW_FIELD(186, 1) +#define WEIGHTED_PRED_FLAG BW_FIELD(187, 1) +#define WEIGHTED_BIPRED_FLAG BW_FIELD(188, 1) +#define TRANSQUANT_BYPASS_ENABLED_FLAG BW_FIELD(189, 1) +#define TILES_ENABLED_FLAG BW_FIELD(190, 1) +#define ENTROPY_CODING_SYNC_ENABLED_FLAG BW_FIELD(191, 1) +#define PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG BW_FIELD(192, 1) +#define LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG BW_FIELD(193, 1) +#define DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG BW_FIELD(194, 1) +#define PPS_DEBLOCKING_FILTER_DISABLED_FLAG BW_FIELD(195, 1) +#define PPS_BETA_OFFSET_DIV2 BW_FIELD(196, 4) +#define PPS_TC_OFFSET_DIV2 BW_FIELD(200, 4) +#define LISTS_MODIFICATION_PRESENT_FLAG BW_FIELD(204, 1) +#define LOG2_PARALLEL_MERGE_LEVEL BW_FIELD(205, 3) +#define SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_FLAG BW_FIELD(208, 1) +#define NUM_TILE_COLUMNS BW_FIELD(212, 5) +#define NUM_TILE_ROWS BW_FIELD(217, 5) +#define COLUMN_WIDTH(i) BW_FIELD(256 + ((i) * 8), 8) +#define ROW_HEIGHT(i) BW_FIELD(416 + ((i) * 8), 8) +#define SCALING_LIST_ADDRESS BW_FIELD(592, 32) =20 /* Data structure describing auxiliary buffer format. */ struct rkvdec_hevc_priv_tbl { @@ -123,20 +116,6 @@ struct rkvdec_hevc_ctx { struct rkvdec_regs regs; }; =20 -static void set_ps_field(u32 *buf, struct rkvdec_ps_field field, u32 value) -{ - u8 bit =3D field.offset % 32, word =3D field.offset / 32; - u64 mask =3D GENMASK_ULL(bit + field.len - 1, bit); - u64 val =3D ((u64)value << bit) & mask; - - buf[word] &=3D ~mask; - buf[word] |=3D val; - if (bit + field.len > 32) { - buf[word + 1] &=3D ~(mask >> 32); - buf[word + 1] |=3D val >> 32; - } -} - static void assemble_hw_pps(struct rkvdec_ctx *ctx, struct rkvdec_hevc_run *run) { @@ -159,7 +138,7 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, hw_ps =3D &priv_tbl->param_set[pps->pic_parameter_set_id]; memset(hw_ps, 0, sizeof(*hw_ps)); =20 -#define WRITE_PPS(value, field) set_ps_field(hw_ps->info, field, value) +#define WRITE_PPS(value, field) rkvdec_set_bw_field(hw_ps->info, field, va= lue) /* write sps */ WRITE_PPS(sps->video_parameter_set_id, VIDEO_PARAMETER_SET_ID); WRITE_PPS(sps->seq_parameter_set_id, SEQ_PARAMETER_SET_ID); @@ -321,17 +300,17 @@ static void assemble_sw_rps(struct rkvdec_ctx *ctx, int i, j; unsigned int lowdelay; =20 -#define WRITE_RPS(value, field) set_ps_field(hw_ps->info, field, value) +#define WRITE_RPS(value, field) rkvdec_set_bw_field(hw_ps->info, field, va= lue) =20 -#define REF_PIC_LONG_TERM_L0(i) PS_FIELD((i) * 5, 1) -#define REF_PIC_IDX_L0(i) PS_FIELD(1 + ((i) * 5), 4) -#define REF_PIC_LONG_TERM_L1(i) PS_FIELD(((i) < 5 ? 75 : 132) + ((i) * 5= ), 1) -#define REF_PIC_IDX_L1(i) PS_FIELD(((i) < 4 ? 76 : 128) + ((i) * 5), 4) +#define REF_PIC_LONG_TERM_L0(n) BW_FIELD((n) * 5, 1) +#define REF_PIC_IDX_L0(n) BW_FIELD(1 + ((n) * 5), 4) +#define REF_PIC_LONG_TERM_L1(n) BW_FIELD(((n) < 5 ? 75 : 132) + ((n) * 5= ), 1) +#define REF_PIC_IDX_L1(n) BW_FIELD(((n) < 4 ? 76 : 128) + ((n) * 5), 4) =20 -#define LOWDELAY PS_FIELD(182, 1) -#define LONG_TERM_RPS_BIT_OFFSET PS_FIELD(183, 10) -#define SHORT_TERM_RPS_BIT_OFFSET PS_FIELD(193, 9) -#define NUM_RPS_POC PS_FIELD(202, 4) +#define LOWDELAY BW_FIELD(182, 1) +#define LONG_TERM_RPS_BIT_OFFSET BW_FIELD(183, 10) +#define SHORT_TERM_RPS_BIT_OFFSET BW_FIELD(193, 9) +#define NUM_RPS_POC BW_FIELD(202, 4) =20 for (j =3D 0; j < run->num_slices; j++) { uint st_bit_offset =3D 0; --=20 2.53.0 From nobody Thu Apr 2 17:17:19 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCEC53E639B; Thu, 2 Apr 2026 14:06:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138820; cv=none; b=IUMIbegh7JHkUgvfqt3lBcA2Rwol9Tq/gVelUXai3xNZY+eCvxfrnwBuBtV800L9bnH+LN92jinrNnGZN3J380X6IpBjZ6oebgEWUaD7I5lHFCs7lxdrvltNRLUNQ5LBc5UMyW9ymVZ6RLVvTCz5i3kmbJfnyyQ4H1tdosC4Pb8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138820; c=relaxed/simple; bh=1bCmci5H5uMJuWgbAcy3VTpK0uUU+5f2o4OPEXKPHzw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZkiSMK6Ak43N4XXpGO9y1JrHL/L9Ag7KGzE0IQVE88CBgcIZP6cckFA2UnOCVrp47lUzDsF0wPt3axrfAYzms/Dyv1cpUMvXPFoQzhb9bmqTtIEUHJmQWacl1XwFLS0/KeA3SWfMOGVaWn98p2EKIcujs4OWTDWNOlQ+p0ywFio= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=nPk1HADP; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="nPk1HADP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1775138817; bh=1bCmci5H5uMJuWgbAcy3VTpK0uUU+5f2o4OPEXKPHzw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nPk1HADPXxsQWU5IA31iBJ97119SByMblD3x3B3fHH2QGdY9vMxpPUc7OLp03loy/ 5K23q4SfN56EHVOZaapT0iDyuRam1FXZvZxVgaYDSWGj94Nyr9hPW+/pSi6U2S5Hdo jmgO7sP5HD9gDfZDifQAQoJM2jN3jDOVjJhgG4I6xc0vpRJVlWH+EGgq0E5K7v0+2E ovgiV5i6LRlbX6q6HcljzU5swG+Ws8NMmdXHHM+vqz470NzOEjttT2WL3VT7j05A6f /W3f1sXagJKrggDpKeQjOAYC8LUW8QYHP3yfNWXwY5yAkT1faBREIA3AbcO+P1HMn+ BBrd2Bo3yM7NA== Received: from [192.168.0.15] (modemcable014.2-22-96.mc.videotron.ca [96.22.2.14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4DC3017E7D83; Thu, 2 Apr 2026 16:06:55 +0200 (CEST) From: Detlev Casanova Date: Thu, 02 Apr 2026 10:06:38 -0400 Subject: [PATCH v3 3/4] media: rkvdec: common: Drop bitfields for the bitwriter Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260402-rkvdec-use-bitwriter-v3-3-2072474ceaf4@collabora.com> References: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> In-Reply-To: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> To: Ezequiel Garcia , Mauro Carvalho Chehab , Heiko Stuebner , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Jonas Karlman , Nicolas Dufresne Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, llvm@lists.linux.dev, kernel@collabora.com, Detlev Casanova X-Mailer: b4 0.15.0 Currently, the common code files for hevc and h264 use structs with bitfields to represent the HW RPS buffer. Because the bitfields are mostly unaligned and numerous, it brings compiler issues, especially with clang. To prevent that, switch to using the global bitwriter previously introduced instead. Signed-off-by: Detlev Casanova --- .../platform/rockchip/rkvdec/rkvdec-h264-common.c | 51 +----------- .../platform/rockchip/rkvdec/rkvdec-h264-common.h | 40 +++------- .../platform/rockchip/rkvdec/rkvdec-hevc-common.c | 93 ++++--------------= ---- .../platform/rockchip/rkvdec/rkvdec-hevc-common.h | 57 ++++--------- 4 files changed, 44 insertions(+), 197 deletions(-) diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.c b/= drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.c index e28f06394470..54639512e456 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.c @@ -21,51 +21,6 @@ =20 #define RKVDEC_NUM_REFLIST 3 =20 -static void set_dpb_info(struct rkvdec_rps_entry *entries, - u8 reflist, - u8 refnum, - u8 info, - bool bottom) -{ - struct rkvdec_rps_entry *entry =3D &entries[(reflist * 4) + refnum / 8]; - u8 idx =3D refnum % 8; - - switch (idx) { - case 0: - entry->dpb_info0 =3D info; - entry->bottom_flag0 =3D bottom; - break; - case 1: - entry->dpb_info1 =3D info; - entry->bottom_flag1 =3D bottom; - break; - case 2: - entry->dpb_info2 =3D info; - entry->bottom_flag2 =3D bottom; - break; - case 3: - entry->dpb_info3 =3D info; - entry->bottom_flag3 =3D bottom; - break; - case 4: - entry->dpb_info4 =3D info; - entry->bottom_flag4 =3D bottom; - break; - case 5: - entry->dpb_info5 =3D info; - entry->bottom_flag5 =3D bottom; - break; - case 6: - entry->dpb_info6 =3D info; - entry->bottom_flag6 =3D bottom; - break; - case 7: - entry->dpb_info7 =3D info; - entry->bottom_flag7 =3D bottom; - break; - } -} - void lookup_ref_buf_idx(struct rkvdec_ctx *ctx, struct rkvdec_h264_run *run) { @@ -111,7 +66,7 @@ void assemble_hw_rps(struct v4l2_h264_reflist_builder *b= uilder, if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) continue; =20 - hw_rps->frame_num[i] =3D builder->refs[i].frame_num; + rkvdec_set_bw_field(hw_rps->info, RPS_FRAME_NUM(i), builder->refs[i].fra= me_num); } =20 for (j =3D 0; j < RKVDEC_NUM_REFLIST; j++) { @@ -138,7 +93,9 @@ void assemble_hw_rps(struct v4l2_h264_reflist_builder *b= uilder, dpb_valid =3D !!(run->ref_buf[ref->index]); bottom =3D ref->fields =3D=3D V4L2_H264_BOTTOM_FIELD_REF; =20 - set_dpb_info(hw_rps->entries, j, i, ref->index | (dpb_valid << 4), bott= om); + rkvdec_set_bw_field(hw_rps->info, RPS_ENTRY_DPB_INFO(j, i), + ref->index | (dpb_valid << 4)); + rkvdec_set_bw_field(hw_rps->info, RPS_ENTRY_BOTTOM_FLAG(j, i), bottom); } } } diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.h b/= drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.h index 5336370507d6..f04b700b863c 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.h +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-h264-common.h @@ -16,6 +16,7 @@ #include =20 #include "rkvdec.h" +#include "rkvdec-bitwriter.h" =20 struct rkvdec_h264_scaling_list { u8 scaling_list_4x4[6][16]; @@ -38,39 +39,16 @@ struct rkvdec_h264_run { struct vb2_buffer *ref_buf[V4L2_H264_NUM_DPB_ENTRIES]; }; =20 -struct rkvdec_rps_entry { - u32 dpb_info0: 5; - u32 bottom_flag0: 1; - u32 view_index_off0: 1; - u32 dpb_info1: 5; - u32 bottom_flag1: 1; - u32 view_index_off1: 1; - u32 dpb_info2: 5; - u32 bottom_flag2: 1; - u32 view_index_off2: 1; - u32 dpb_info3: 5; - u32 bottom_flag3: 1; - u32 view_index_off3: 1; - u32 dpb_info4: 5; - u32 bottom_flag4: 1; - u32 view_index_off4: 1; - u32 dpb_info5: 5; - u32 bottom_flag5: 1; - u32 view_index_off5: 1; - u32 dpb_info6: 5; - u32 bottom_flag6: 1; - u32 view_index_off6: 1; - u32 dpb_info7: 5; - u32 bottom_flag7: 1; - u32 view_index_off7: 1; -} __packed; +#define RPS_FRAME_NUM(i) BW_FIELD((i) * 16, 16) +#define RPS_ENTRY_DPB_INFO(l, e) BW_FIELD(288 + (l) * 7 * 32 + (e) * 7, 5)= //l: 0-2, e: 0-31 +#define RPS_ENTRY_BOTTOM_FLAG(l, e) BW_FIELD(293 + (l) * 7 * 32 + (e) * 7,= 1) //l: 0-2, e: 0-31 +#define RPS_ENTRY_VIEW_INDEX_OFF(l, e) BW_FIELD(294 + (l) * 7 * 32 + (e) *= 7, 1) //l: 0-2, e: 0-31 + +#define RKVDEC_H264_RPS_SIZE ALIGN(288 + 3 * 7 * 32, 128) =20 struct rkvdec_rps { - u16 frame_num[16]; - u32 reserved0; - struct rkvdec_rps_entry entries[12]; - u32 reserved1[66]; -} __packed; + u32 info[RKVDEC_H264_RPS_SIZE / 8 / 4]; +}; =20 void lookup_ref_buf_idx(struct rkvdec_ctx *ctx, struct rkvdec_h264_run *ru= n); void assemble_hw_rps(struct v4l2_h264_reflist_builder *builder, diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.c b/= drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.c index 3119f3bc9f98..f89602075121 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.c @@ -74,72 +74,6 @@ void compute_tiles_non_uniform(struct rkvdec_hevc_run *r= un, u16 log2_min_cb_size row_height[i] =3D pic_in_cts_height - sum; } =20 -static void set_ref_poc(struct rkvdec_rps_short_term_ref_set *set, int poc= , int value, int flag) -{ - switch (poc) { - case 0: - set->delta_poc0 =3D value; - set->used_flag0 =3D flag; - break; - case 1: - set->delta_poc1 =3D value; - set->used_flag1 =3D flag; - break; - case 2: - set->delta_poc2 =3D value; - set->used_flag2 =3D flag; - break; - case 3: - set->delta_poc3 =3D value; - set->used_flag3 =3D flag; - break; - case 4: - set->delta_poc4 =3D value; - set->used_flag4 =3D flag; - break; - case 5: - set->delta_poc5 =3D value; - set->used_flag5 =3D flag; - break; - case 6: - set->delta_poc6 =3D value; - set->used_flag6 =3D flag; - break; - case 7: - set->delta_poc7 =3D value; - set->used_flag7 =3D flag; - break; - case 8: - set->delta_poc8 =3D value; - set->used_flag8 =3D flag; - break; - case 9: - set->delta_poc9 =3D value; - set->used_flag9 =3D flag; - break; - case 10: - set->delta_poc10 =3D value; - set->used_flag10 =3D flag; - break; - case 11: - set->delta_poc11 =3D value; - set->used_flag11 =3D flag; - break; - case 12: - set->delta_poc12 =3D value; - set->used_flag12 =3D flag; - break; - case 13: - set->delta_poc13 =3D value; - set->used_flag13 =3D flag; - break; - case 14: - set->delta_poc14 =3D value; - set->used_flag14 =3D flag; - break; - } -} - static void assemble_scalingfactor0(struct rkvdec_ctx *ctx, u8 *output, const struct v4l2_ctrl_hevc_scaling_matrix *input) { @@ -218,10 +152,11 @@ static void rkvdec_hevc_assemble_hw_lt_rps(struct rkv= dec_hevc_run *run, struct r return; =20 for (int i =3D 0; i < sps->num_long_term_ref_pics_sps; i++) { - rps->refs[i].lt_ref_pic_poc_lsb =3D - run->ext_sps_lt_rps[i].lt_ref_pic_poc_lsb_sps; - rps->refs[i].used_by_curr_pic_lt_flag =3D - !!(run->ext_sps_lt_rps[i].flags & V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_USED_LT= ); + rkvdec_set_bw_field(rps->info, RPS_LT_REF_PIC_POC_LSB(i), + run->ext_sps_lt_rps[i].lt_ref_pic_poc_lsb_sps); + rkvdec_set_bw_field(rps->info, RPS_LT_REF_USED_BY_CURR_PIC(i), + !!(run->ext_sps_lt_rps[i].flags & + V4L2_HEVC_EXT_SPS_LT_RPS_FLAG_USED_LT)); } } =20 @@ -235,18 +170,24 @@ static void rkvdec_hevc_assemble_hw_st_rps(struct rkv= dec_hevc_run *run, struct r int j =3D 0; const struct calculated_rps_st_set *set =3D &calculated_rps_st_sets[i]; =20 - rps->short_term_ref_sets[i].num_negative =3D set->num_negative_pics; - rps->short_term_ref_sets[i].num_positive =3D set->num_positive_pics; + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_NUM_NEGATIVE(i), + set->num_negative_pics); + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_NUM_POSITIVE(i), + set->num_positive_pics); =20 for (; j < set->num_negative_pics; j++) { - set_ref_poc(&rps->short_term_ref_sets[i], j, - set->delta_poc_s0[j], set->used_by_curr_pic_s0[j]); + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_DELTA_POC(i, j), + set->delta_poc_s0[j]); + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_USED(i, j), + set->used_by_curr_pic_s0[j]); } poc =3D j; =20 for (j =3D 0; j < set->num_positive_pics; j++) { - set_ref_poc(&rps->short_term_ref_sets[i], poc + j, - set->delta_poc_s1[j], set->used_by_curr_pic_s1[j]); + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_DELTA_POC(i, poc + j), + set->delta_poc_s1[j]); + rkvdec_set_bw_field(rps->info, RPS_ST_REF_SET_USED(i, poc + j), + set->used_by_curr_pic_s1[j]); } } } diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.h b/= drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.h index 6f4faca4c091..2a9b7719ab2d 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.h +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-hevc-common.h @@ -19,53 +19,24 @@ #include =20 #include "rkvdec.h" +#include "rkvdec-bitwriter.h" =20 -struct rkvdec_rps_refs { - u16 lt_ref_pic_poc_lsb; - u16 used_by_curr_pic_lt_flag : 1; - u16 reserved : 15; -} __packed; +#define RPS_LT_REF_PIC_POC_LSB(i) BW_FIELD(0 + (i) * 32, 16) // i: 0-31 +#define RPS_LT_REF_USED_BY_CURR_PIC(i) BW_FIELD(16 + (i) * 32, 1) // i: 0-= 31 =20 -struct rkvdec_rps_short_term_ref_set { - u32 num_negative : 4; - u32 num_positive : 4; - u32 delta_poc0 : 16; - u32 used_flag0 : 1; - u32 delta_poc1 : 16; - u32 used_flag1 : 1; - u32 delta_poc2 : 16; - u32 used_flag2 : 1; - u32 delta_poc3 : 16; - u32 used_flag3 : 1; - u32 delta_poc4 : 16; - u32 used_flag4 : 1; - u32 delta_poc5 : 16; - u32 used_flag5 : 1; - u32 delta_poc6 : 16; - u32 used_flag6 : 1; - u32 delta_poc7 : 16; - u32 used_flag7 : 1; - u32 delta_poc8 : 16; - u32 used_flag8 : 1; - u32 delta_poc9 : 16; - u32 used_flag9 : 1; - u32 delta_poc10 : 16; - u32 used_flag10 : 1; - u32 delta_poc11 : 16; - u32 used_flag11 : 1; - u32 delta_poc12 : 16; - u32 used_flag12 : 1; - u32 delta_poc13 : 16; - u32 used_flag13 : 1; - u32 delta_poc14 : 16; - u32 used_flag14 : 1; - u32 reserved_bits : 25; - u32 reserved[3]; -} __packed; +#define RPS_ST_REF_SET_NUM_NEGATIVE(i) BW_FIELD(1024 + ((i) * 384), 4) // = i: 0-63 +#define RPS_ST_REF_SET_NUM_POSITIVE(i) BW_FIELD(1028 + ((i) * 384), 4) // = i: 0-63 + +// i: 0-63, j: 0-14 +#define RPS_ST_REF_SET_DELTA_POC(i, j) BW_FIELD(1032 + ((i) * 384) + ((j) = * 17), 16) + +// i: 0-63, j: 0-14 +#define RPS_ST_REF_SET_USED(i, j) BW_FIELD(1048 + ((i) * 384) + ((j) * 17)= , 1) + +#define RKVDEC_RPS_HEVC_SIZE ALIGN(1032 + 64 * 384, 128) =20 struct rkvdec_rps { - struct rkvdec_rps_refs refs[32]; - struct rkvdec_rps_short_term_ref_set short_term_ref_sets[64]; + u32 info[RKVDEC_RPS_HEVC_SIZE / 8 / 4]; } __packed; =20 struct rkvdec_hevc_run { --=20 2.53.0 From nobody Thu Apr 2 17:17:19 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 292BA3E9592; Thu, 2 Apr 2026 14:07:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138825; cv=none; b=Dy01ICyYEh+MLInAoicQ1JhFFVzq1KP7SUaDcn3tpu5Zh7ki+wGZZ/iGoZxtrcl7D/E4Krdgh5r+ZY2SDefV0bY9kqbD1JQOFeJFV6HwaDtVTdIBTiwlbzOQD4B8ayjKAcT+Q4oITpm9Bj0cHFPesR+KKdd9CXHkRc0us7xPzFM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775138825; c=relaxed/simple; bh=9no3zVdc6tjeqpT6yzoQ0SRHiMAAnACAjxl39dluhuk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CZPQNAFflfDRFozxmITCNs9pWPuiMeXgf7PaqxSm10qMPlqI6YRwmV7ljdUsuxvSrkyb4U289hNHH+RvQBzNnmB//k6/WXLJ7Y7sqH8Hq6er4NNCmwpgmfzZkWKbYasbwoekPzhspfg50ZpwLlW+9xak3CoX0bbknuFMtgDJYtE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Fgg2m4Br; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Fgg2m4Br" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1775138819; bh=9no3zVdc6tjeqpT6yzoQ0SRHiMAAnACAjxl39dluhuk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Fgg2m4Br+HtXQY+gqIJvGi5qtH3Ad+hscq0/1AseY22x5I/DPxsmPqBU9cNBeC5RR jCjPm08myDTJZkTTHkUhQaqjJ7skletll0Ge4YwnditW4oTMWLewIwPSJBHldK9ugR ZgcAbMoxtra1yc2xLw6PQHB3f4d75ptaafCBJx5f4nj+DjNqJNmlvWU1bjRr+1/znH sJ4lXnb3DvrS5MUt3fWB+9+thIJ1/hF8/PFR2jJpJmw2EKRnNgBzX8EJk7Z0fS5Afm 0Yam2a0WciQrM/u0WC09x+U5aGV1xQYP6GsZFDysHypaLau0usgInlgj7TdrsZi2+x qg+G7R417ryfA== Received: from [192.168.0.15] (modemcable014.2-22-96.mc.videotron.ca [96.22.2.14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: detlev) by bali.collaboradmins.com (Postfix) with ESMTPSA id 8BAC617E7D87; Thu, 2 Apr 2026 16:06:57 +0200 (CEST) From: Detlev Casanova Date: Thu, 02 Apr 2026 10:06:39 -0400 Subject: [PATCH v3 4/4] media: rkvdec: vdpu383: Drop bitfields for the bitwriter Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260402-rkvdec-use-bitwriter-v3-4-2072474ceaf4@collabora.com> References: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> In-Reply-To: <20260402-rkvdec-use-bitwriter-v3-0-2072474ceaf4@collabora.com> To: Ezequiel Garcia , Mauro Carvalho Chehab , Heiko Stuebner , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Jonas Karlman , Nicolas Dufresne Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, llvm@lists.linux.dev, kernel@collabora.com, Detlev Casanova X-Mailer: b4 0.15.0 The VDPU383 support for hevc and h264 use structs with bitfields to represent the SPS and PPS. Because the fields are mostly unaligned and numerous, it brings compiler issues, especially with clang. To prevent that, switch to using the global bitwriter previously introduced instead. Signed-off-by: Detlev Casanova --- .../platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c | 351 ++++++-------- .../platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c | 502 +++++++++--------= ---- 2 files changed, 360 insertions(+), 493 deletions(-) diff --git a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c b= /drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c index fb4f849d7366..5ec755733916 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-h264.c @@ -15,105 +15,64 @@ #include "rkvdec-cabac.h" #include "rkvdec-vdpu383-regs.h" #include "rkvdec-h264-common.h" - -struct rkvdec_sps { - u16 seq_parameter_set_id: 4; - u16 profile_idc: 8; - u16 constraint_set3_flag: 1; - u16 chroma_format_idc: 2; - u16 bit_depth_luma: 3; - u16 bit_depth_chroma: 3; - u16 qpprime_y_zero_transform_bypass_flag: 1; - u16 log2_max_frame_num_minus4: 4; - u16 max_num_ref_frames: 5; - u16 pic_order_cnt_type: 2; - u16 log2_max_pic_order_cnt_lsb_minus4: 4; - u16 delta_pic_order_always_zero_flag: 1; - - u16 pic_width_in_mbs: 16; - u16 pic_height_in_mbs: 16; - - u16 frame_mbs_only_flag: 1; - u16 mb_adaptive_frame_field_flag: 1; - u16 direct_8x8_inference_flag: 1; - u16 mvc_extension_enable: 1; - u16 num_views: 2; - u16 view_id0: 10; - u16 view_id1: 10; -} __packed; - -struct rkvdec_pps { - u32 pic_parameter_set_id: 8; - u32 pps_seq_parameter_set_id: 5; - u32 entropy_coding_mode_flag: 1; - u32 bottom_field_pic_order_in_frame_present_flag: 1; - u32 num_ref_idx_l0_default_active_minus1: 5; - u32 num_ref_idx_l1_default_active_minus1: 5; - u32 weighted_pred_flag: 1; - u32 weighted_bipred_idc: 2; - u32 pic_init_qp_minus26: 7; - u32 pic_init_qs_minus26: 6; - u32 chroma_qp_index_offset: 5; - u32 deblocking_filter_control_present_flag: 1; - u32 constrained_intra_pred_flag: 1; - u32 redundant_pic_cnt_present: 1; - u32 transform_8x8_mode_flag: 1; - u32 second_chroma_qp_index_offset: 5; - u32 scaling_list_enable_flag: 1; - u32 is_longterm: 16; - u32 voidx: 16; - - // dpb - u32 pic_field_flag: 1; - u32 pic_associated_flag: 1; - u32 cur_top_field: 32; - u32 cur_bot_field: 32; - - u32 top_field_order_cnt0: 32; - u32 bot_field_order_cnt0: 32; - u32 top_field_order_cnt1: 32; - u32 bot_field_order_cnt1: 32; - u32 top_field_order_cnt2: 32; - u32 bot_field_order_cnt2: 32; - u32 top_field_order_cnt3: 32; - u32 bot_field_order_cnt3: 32; - u32 top_field_order_cnt4: 32; - u32 bot_field_order_cnt4: 32; - u32 top_field_order_cnt5: 32; - u32 bot_field_order_cnt5: 32; - u32 top_field_order_cnt6: 32; - u32 bot_field_order_cnt6: 32; - u32 top_field_order_cnt7: 32; - u32 bot_field_order_cnt7: 32; - u32 top_field_order_cnt8: 32; - u32 bot_field_order_cnt8: 32; - u32 top_field_order_cnt9: 32; - u32 bot_field_order_cnt9: 32; - u32 top_field_order_cnt10: 32; - u32 bot_field_order_cnt10: 32; - u32 top_field_order_cnt11: 32; - u32 bot_field_order_cnt11: 32; - u32 top_field_order_cnt12: 32; - u32 bot_field_order_cnt12: 32; - u32 top_field_order_cnt13: 32; - u32 bot_field_order_cnt13: 32; - u32 top_field_order_cnt14: 32; - u32 bot_field_order_cnt14: 32; - u32 top_field_order_cnt15: 32; - u32 bot_field_order_cnt15: 32; - - u32 ref_field_flags: 16; - u32 ref_topfield_used: 16; - u32 ref_botfield_used: 16; - u32 ref_colmv_use_flag: 16; - - u32 reserved0: 30; - u32 reserved[3]; -} __packed; +#include "rkvdec-bitwriter.h" + +#define SEQ_PARAMETER_SET_ID BW_FIELD(0, 4) +#define PROFILE_IDC BW_FIELD(4, 8) +#define CONSTRAINT_SET3_FLAG BW_FIELD(12, 1) +#define CHROMA_FORMAT_IDC BW_FIELD(13, 2) +#define BIT_DEPTH_LUMA BW_FIELD(15, 3) +#define BIT_DEPTH_CHROMA BW_FIELD(18, 3) +#define QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG BW_FIELD(21, 1) +#define LOG2_MAX_FRAME_NUM_MINUS4 BW_FIELD(22, 4) +#define MAX_NUM_REF_FRAMES BW_FIELD(26, 5) +#define PIC_ORDER_CNT_TYPE BW_FIELD(31, 2) +#define LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4 BW_FIELD(33, 4) +#define DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG BW_FIELD(37, 1) +#define PIC_WIDTH_IN_MBS BW_FIELD(38, 16) +#define PIC_HEIGHT_IN_MBS BW_FIELD(54, 16) +#define FRAME_MBS_ONLY_FLAG BW_FIELD(70, 1) +#define MB_ADAPTIVE_FRAME_FIELD_FLAG BW_FIELD(71, 1) +#define DIRECT_8X8_INFERENCE_FLAG BW_FIELD(72, 1) +#define MVC_EXTENSION_ENABLE BW_FIELD(73, 1) +#define NUM_VIEWS BW_FIELD(74, 2) +#define VIEW_ID(i) BW_FIELD(76 + ((i) * 10), 10) // i: 0-1 + +#define PIC_PARAMETER_SET_ID BW_FIELD(96, 8) +#define PPS_SEQ_PARAMETER_SET_ID BW_FIELD(104, 5) +#define ENTROPY_CODING_MODE_FLAG BW_FIELD(109, 1) +#define BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT_FLAG BW_FIELD(110, 1) +#define NUM_REF_IDX_L_DEFAULT_ACTIVE_MINUS1(i) BW_FIELD(111 + ((i) * 5), = 5) // i: 0-1 +#define WEIGHTED_PRED_FLAG BW_FIELD(121, 1) +#define WEIGHTED_BIPRED_IDC BW_FIELD(122, 2) +#define PIC_INIT_QP_MINUS26 BW_FIELD(124, 7) +#define PIC_INIT_QS_MINUS26 BW_FIELD(131, 6) +#define CHROMA_QP_INDEX_OFFSET BW_FIELD(137, 5) +#define DEBLOCKING_FILTER_CONTROL_PRESENT_FLAG BW_FIELD(142, 1) +#define CONSTRAINED_INTRA_PRED_FLAG BW_FIELD(143, 1) +#define REDUNDANT_PIC_CNT_PRESENT BW_FIELD(144, 1) +#define TRANSFORM_8X8_MODE_FLAG BW_FIELD(145, 1) +#define SECOND_CHROMA_QP_INDEX_OFFSET BW_FIELD(146, 5) +#define SCALING_LIST_ENABLE_FLAG BW_FIELD(151, 1) +#define IS_LONG_TERM(i) BW_FIELD(152 + (i), 1) // i: 0-15 + +#define PIC_FIELD_FLAG BW_FIELD(184, 1) +#define PIC_ASSOCIATED_FLAG BW_FIELD(185, 1) +#define CUR_TOP_FIELD BW_FIELD(186, 32) +#define CUR_BOT_FIELD BW_FIELD(218, 32) + +#define TOP_FIELD_ORDER_CNT(i) BW_FIELD(250 + (i) * 64, 32) // i: 0-15 +#define BOT_FIELD_ORDER_CNT(i) BW_FIELD(282 + (i) * 64, 32) // i: 0-15 + +#define REF_FIELD_FLAGS(i) BW_FIELD(1274 + (i), 1) // i: 0-15 +#define REF_TOPFIELD_USED(i) BW_FIELD(1290 + (i), 1) // i: 0-15 +#define REF_BOTFIELD_USED(i) BW_FIELD(1306 + (i), 1) // i: 0-15 +#define REF_COLMV_USE_FLAG(i) BW_FIELD(1322 + (i), 1) // i: 0-15 + +#define SPS_SIZE ALIGN(1322 + 16, 128) =20 struct rkvdec_sps_pps { - struct rkvdec_sps sps; - struct rkvdec_pps pps; + u32 info[SPS_SIZE / 8 / 4]; } __packed; =20 /* Data structure describing auxiliary buffer format. */ @@ -130,67 +89,6 @@ struct rkvdec_h264_ctx { struct vdpu383_regs_h26x regs; }; =20 -static noinline_for_stack void set_field_order_cnt(struct rkvdec_pps *pps,= const struct v4l2_h264_dpb_entry *dpb) -{ - pps->top_field_order_cnt0 =3D dpb[0].top_field_order_cnt; - pps->bot_field_order_cnt0 =3D dpb[0].bottom_field_order_cnt; - pps->top_field_order_cnt1 =3D dpb[1].top_field_order_cnt; - pps->bot_field_order_cnt1 =3D dpb[1].bottom_field_order_cnt; - pps->top_field_order_cnt2 =3D dpb[2].top_field_order_cnt; - pps->bot_field_order_cnt2 =3D dpb[2].bottom_field_order_cnt; - pps->top_field_order_cnt3 =3D dpb[3].top_field_order_cnt; - pps->bot_field_order_cnt3 =3D dpb[3].bottom_field_order_cnt; - pps->top_field_order_cnt4 =3D dpb[4].top_field_order_cnt; - pps->bot_field_order_cnt4 =3D dpb[4].bottom_field_order_cnt; - pps->top_field_order_cnt5 =3D dpb[5].top_field_order_cnt; - pps->bot_field_order_cnt5 =3D dpb[5].bottom_field_order_cnt; - pps->top_field_order_cnt6 =3D dpb[6].top_field_order_cnt; - pps->bot_field_order_cnt6 =3D dpb[6].bottom_field_order_cnt; - pps->top_field_order_cnt7 =3D dpb[7].top_field_order_cnt; - pps->bot_field_order_cnt7 =3D dpb[7].bottom_field_order_cnt; - pps->top_field_order_cnt8 =3D dpb[8].top_field_order_cnt; - pps->bot_field_order_cnt8 =3D dpb[8].bottom_field_order_cnt; - pps->top_field_order_cnt9 =3D dpb[9].top_field_order_cnt; - pps->bot_field_order_cnt9 =3D dpb[9].bottom_field_order_cnt; - pps->top_field_order_cnt10 =3D dpb[10].top_field_order_cnt; - pps->bot_field_order_cnt10 =3D dpb[10].bottom_field_order_cnt; - pps->top_field_order_cnt11 =3D dpb[11].top_field_order_cnt; - pps->bot_field_order_cnt11 =3D dpb[11].bottom_field_order_cnt; - pps->top_field_order_cnt12 =3D dpb[12].top_field_order_cnt; - pps->bot_field_order_cnt12 =3D dpb[12].bottom_field_order_cnt; - pps->top_field_order_cnt13 =3D dpb[13].top_field_order_cnt; - pps->bot_field_order_cnt13 =3D dpb[13].bottom_field_order_cnt; - pps->top_field_order_cnt14 =3D dpb[14].top_field_order_cnt; - pps->bot_field_order_cnt14 =3D dpb[14].bottom_field_order_cnt; - pps->top_field_order_cnt15 =3D dpb[15].top_field_order_cnt; - pps->bot_field_order_cnt15 =3D dpb[15].bottom_field_order_cnt; -} - -static noinline_for_stack void set_dec_params(struct rkvdec_pps *pps, cons= t struct v4l2_ctrl_h264_decode_params *dec_params) -{ - const struct v4l2_h264_dpb_entry *dpb =3D dec_params->dpb; - - for (int i =3D 0; i < ARRAY_SIZE(dec_params->dpb); i++) { - if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) - pps->is_longterm |=3D (1 << i); - pps->ref_field_flags |=3D - (!!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD)) << i; - pps->ref_colmv_use_flag |=3D - (!!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) << i; - pps->ref_topfield_used |=3D - (!!(dpb[i].fields & V4L2_H264_TOP_FIELD_REF)) << i; - pps->ref_botfield_used |=3D - (!!(dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF)) << i; - } - pps->pic_field_flag =3D - !!(dec_params->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC); - pps->pic_associated_flag =3D - !!(dec_params->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD); - - pps->cur_top_field =3D dec_params->top_field_order_cnt; - pps->cur_bot_field =3D dec_params->bottom_field_order_cnt; -} - static void assemble_hw_pps(struct rkvdec_ctx *ctx, struct rkvdec_h264_run *run) { @@ -202,6 +100,7 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, struct rkvdec_h264_priv_tbl *priv_tbl =3D h264_ctx->priv_tbl.cpu; struct rkvdec_sps_pps *hw_ps; u32 pic_width, pic_height; + int i; =20 /* * HW read the SPS/PPS information from PPS packet index by PPS id. @@ -213,23 +112,25 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, memset(hw_ps, 0, sizeof(*hw_ps)); =20 /* write sps */ - hw_ps->sps.seq_parameter_set_id =3D sps->seq_parameter_set_id; - hw_ps->sps.profile_idc =3D sps->profile_idc; - hw_ps->sps.constraint_set3_flag =3D !!(sps->constraint_set_flags & (1 << = 3)); - hw_ps->sps.chroma_format_idc =3D sps->chroma_format_idc; - hw_ps->sps.bit_depth_luma =3D sps->bit_depth_luma_minus8; - hw_ps->sps.bit_depth_chroma =3D sps->bit_depth_chroma_minus8; - hw_ps->sps.qpprime_y_zero_transform_bypass_flag =3D - !!(sps->flags & V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS); - hw_ps->sps.log2_max_frame_num_minus4 =3D sps->log2_max_frame_num_minus4; - hw_ps->sps.max_num_ref_frames =3D sps->max_num_ref_frames; - hw_ps->sps.pic_order_cnt_type =3D sps->pic_order_cnt_type; - hw_ps->sps.log2_max_pic_order_cnt_lsb_minus4 =3D - sps->log2_max_pic_order_cnt_lsb_minus4; - hw_ps->sps.delta_pic_order_always_zero_flag =3D - !!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO); - hw_ps->sps.mvc_extension_enable =3D 0; - hw_ps->sps.num_views =3D 0; + rkvdec_set_bw_field(hw_ps->info, SEQ_PARAMETER_SET_ID, sps->seq_parameter= _set_id); + rkvdec_set_bw_field(hw_ps->info, PROFILE_IDC, sps->profile_idc); + rkvdec_set_bw_field(hw_ps->info, CONSTRAINT_SET3_FLAG, + !!(sps->constraint_set_flags & (1 << 3))); + rkvdec_set_bw_field(hw_ps->info, CHROMA_FORMAT_IDC, sps->chroma_format_id= c); + rkvdec_set_bw_field(hw_ps->info, BIT_DEPTH_LUMA, sps->bit_depth_luma_minu= s8); + rkvdec_set_bw_field(hw_ps->info, BIT_DEPTH_CHROMA, sps->bit_depth_chroma_= minus8); + rkvdec_set_bw_field(hw_ps->info, QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG, + !!(sps->flags & V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS)= ); + rkvdec_set_bw_field(hw_ps->info, LOG2_MAX_FRAME_NUM_MINUS4, + sps->log2_max_frame_num_minus4); + rkvdec_set_bw_field(hw_ps->info, MAX_NUM_REF_FRAMES, sps->max_num_ref_fra= mes); + rkvdec_set_bw_field(hw_ps->info, PIC_ORDER_CNT_TYPE, sps->pic_order_cnt_t= ype); + rkvdec_set_bw_field(hw_ps->info, LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4, + sps->log2_max_pic_order_cnt_lsb_minus4); + rkvdec_set_bw_field(hw_ps->info, DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG, + !!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO)); + rkvdec_set_bw_field(hw_ps->info, MVC_EXTENSION_ENABLE, 0); + rkvdec_set_bw_field(hw_ps->info, NUM_VIEWS, 0); =20 /* * Use the SPS values since they are already in macroblocks @@ -245,48 +146,72 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, if (!!(dec_params->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)) pic_height /=3D 2; =20 - hw_ps->sps.pic_width_in_mbs =3D pic_width; - hw_ps->sps.pic_height_in_mbs =3D pic_height; + rkvdec_set_bw_field(hw_ps->info, PIC_WIDTH_IN_MBS, pic_width); + rkvdec_set_bw_field(hw_ps->info, PIC_HEIGHT_IN_MBS, pic_height); =20 - hw_ps->sps.frame_mbs_only_flag =3D - !!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY); - hw_ps->sps.mb_adaptive_frame_field_flag =3D - !!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD); - hw_ps->sps.direct_8x8_inference_flag =3D - !!(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE); + rkvdec_set_bw_field(hw_ps->info, FRAME_MBS_ONLY_FLAG, + !!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)); + rkvdec_set_bw_field(hw_ps->info, MB_ADAPTIVE_FRAME_FIELD_FLAG, + !!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD)); + rkvdec_set_bw_field(hw_ps->info, DIRECT_8X8_INFERENCE_FLAG, + !!(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE)); =20 /* write pps */ - hw_ps->pps.pic_parameter_set_id =3D pps->pic_parameter_set_id; - hw_ps->pps.pps_seq_parameter_set_id =3D pps->seq_parameter_set_id; - hw_ps->pps.entropy_coding_mode_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE); - hw_ps->pps.bottom_field_pic_order_in_frame_present_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESE= NT); - hw_ps->pps.num_ref_idx_l0_default_active_minus1 =3D - pps->num_ref_idx_l0_default_active_minus1; - hw_ps->pps.num_ref_idx_l1_default_active_minus1 =3D - pps->num_ref_idx_l1_default_active_minus1; - hw_ps->pps.weighted_pred_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED); - hw_ps->pps.weighted_bipred_idc =3D pps->weighted_bipred_idc; - hw_ps->pps.pic_init_qp_minus26 =3D pps->pic_init_qp_minus26; - hw_ps->pps.pic_init_qs_minus26 =3D pps->pic_init_qs_minus26; - hw_ps->pps.chroma_qp_index_offset =3D pps->chroma_qp_index_offset; - hw_ps->pps.deblocking_filter_control_present_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT); - hw_ps->pps.constrained_intra_pred_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED); - hw_ps->pps.redundant_pic_cnt_present =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT); - hw_ps->pps.transform_8x8_mode_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE); - hw_ps->pps.second_chroma_qp_index_offset =3D pps->second_chroma_qp_index_= offset; - hw_ps->pps.scaling_list_enable_flag =3D - !!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT); - - set_field_order_cnt(&hw_ps->pps, dpb); - set_dec_params(&hw_ps->pps, dec_params); + rkvdec_set_bw_field(hw_ps->info, PIC_PARAMETER_SET_ID, pps->pic_parameter= _set_id); + rkvdec_set_bw_field(hw_ps->info, PPS_SEQ_PARAMETER_SET_ID, pps->seq_param= eter_set_id); + rkvdec_set_bw_field(hw_ps->info, ENTROPY_CODING_MODE_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE)); + rkvdec_set_bw_field(hw_ps->info, BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT_= FLAG, + !!(pps->flags & + V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, NUM_REF_IDX_L_DEFAULT_ACTIVE_MINUS1(0), + pps->num_ref_idx_l0_default_active_minus1); + rkvdec_set_bw_field(hw_ps->info, NUM_REF_IDX_L_DEFAULT_ACTIVE_MINUS1(1), + pps->num_ref_idx_l1_default_active_minus1); + rkvdec_set_bw_field(hw_ps->info, WEIGHTED_PRED_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED)); + rkvdec_set_bw_field(hw_ps->info, WEIGHTED_BIPRED_IDC, pps->weighted_bipre= d_idc); + rkvdec_set_bw_field(hw_ps->info, PIC_INIT_QP_MINUS26, pps->pic_init_qp_mi= nus26); + rkvdec_set_bw_field(hw_ps->info, PIC_INIT_QS_MINUS26, pps->pic_init_qs_mi= nus26); + rkvdec_set_bw_field(hw_ps->info, CHROMA_QP_INDEX_OFFSET, pps->chroma_qp_i= ndex_offset); + rkvdec_set_bw_field(hw_ps->info, DEBLOCKING_FILTER_CONTROL_PRESENT_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESEN= T)); + rkvdec_set_bw_field(hw_ps->info, CONSTRAINED_INTRA_PRED_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED)); + rkvdec_set_bw_field(hw_ps->info, REDUNDANT_PIC_CNT_PRESENT, + !!(pps->flags & V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, TRANSFORM_8X8_MODE_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE)); + rkvdec_set_bw_field(hw_ps->info, SECOND_CHROMA_QP_INDEX_OFFSET, + pps->second_chroma_qp_index_offset); + rkvdec_set_bw_field(hw_ps->info, SCALING_LIST_ENABLE_FLAG, + !!(pps->flags & V4L2_H264_PPS_FLAG_SCALING_MATRIX_PRESENT)); + + for (i =3D 0; i < ARRAY_SIZE(dec_params->dpb); i++) { + rkvdec_set_bw_field(hw_ps->info, TOP_FIELD_ORDER_CNT(i), + dpb[i].top_field_order_cnt); + rkvdec_set_bw_field(hw_ps->info, BOT_FIELD_ORDER_CNT(i), + dpb[i].bottom_field_order_cnt); + + rkvdec_set_bw_field(hw_ps->info, IS_LONG_TERM(i), + !!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)); + rkvdec_set_bw_field(hw_ps->info, REF_FIELD_FLAGS(i), + !!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_FIELD)); + rkvdec_set_bw_field(hw_ps->info, REF_COLMV_USE_FLAG(i), + !!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)); + rkvdec_set_bw_field(hw_ps->info, REF_TOPFIELD_USED(i), + !!(dpb[i].fields & V4L2_H264_TOP_FIELD_REF)); + rkvdec_set_bw_field(hw_ps->info, REF_BOTFIELD_USED(i), + !!(dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF)); + } + + rkvdec_set_bw_field(hw_ps->info, PIC_FIELD_FLAG, + !!(dec_params->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)); + rkvdec_set_bw_field(hw_ps->info, PIC_ASSOCIATED_FLAG, + !!(dec_params->flags & V4L2_H264_DECODE_PARAM_FLAG_BOTTOM_FIELD)); =20 + rkvdec_set_bw_field(hw_ps->info, CUR_TOP_FIELD, dec_params->top_field_ord= er_cnt); + rkvdec_set_bw_field(hw_ps->info, CUR_BOT_FIELD, dec_params->bottom_field_= order_cnt); } =20 static void rkvdec_write_regs(struct rkvdec_ctx *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..3575338a531a 100644 --- a/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c +++ b/drivers/media/platform/rockchip/rkvdec/rkvdec-vdpu383-hevc.c @@ -13,149 +13,106 @@ #include "rkvdec-rcb.h" #include "rkvdec-hevc-common.h" #include "rkvdec-vdpu383-regs.h" +#include "rkvdec-bitwriter.h" + +#define VIDEO_PARAMETER_SET_ID BW_FIELD(0, 4) +#define SEQ_PARAMETER_SET_ID BW_FIELD(4, 4) +#define CHROMA_FORMAT_IDC BW_FIELD(8, 2) +#define PIC_WIDTH_IN_LUMA_SAMPLES BW_FIELD(10, 16) +#define PIC_HEIGHT_IN_LUMA_SAMPLES BW_FIELD(26, 16) +#define BIT_DEPTH_LUMA BW_FIELD(42, 3) +#define BIT_DEPTH_CHROMA BW_FIELD(45, 3) +#define LOG2_MAX_PIC_ORDER_CNT_LSB BW_FIELD(48, 5) +#define LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE BW_FIELD(53, 2) +#define LOG2_MIN_LUMA_CODING_BLOCK_SIZE BW_FIELD(55, 3) +#define LOG2_MIN_TRANSFORM_BLOCK_SIZE BW_FIELD(58, 3) +#define LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_SIZE BW_FIELD(61, 2) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTER BW_FIELD(63, 3) +#define MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA BW_FIELD(66, 3) +#define SCALING_LIST_ENABLED_FLAG BW_FIELD(69, 1) +#define AMP_ENABLED_FLAG BW_FIELD(70, 1) +#define SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG BW_FIELD(71, 1) +#define PCM_ENABLED_FLAG BW_FIELD(72, 1) +#define PCM_SAMPLE_BIT_DEPTH_LUMA BW_FIELD(73, 4) +#define PCM_SAMPLE_BIT_DEPTH_CHROMA BW_FIELD(77, 4) +#define PCM_LOOP_FILTER_DISABLED_FLAG BW_FIELD(81, 1) +#define LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE BW_FIELD(82, 3) +#define LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE BW_FIELD(85, 3) +#define NUM_SHORT_TERM_REF_PIC_SETS BW_FIELD(88, 7) +#define LONG_TERM_REF_PICS_PRESENT_FLAG BW_FIELD(95, 1) +#define NUM_LONG_TERM_REF_PICS_SPS BW_FIELD(96, 6) +#define SPS_TEMPORAL_MVP_ENABLED_FLAG BW_FIELD(102, 1) +#define STRONG_INTRA_SMOOTHING_ENABLED_FLAG BW_FIELD(103, 1) +#define SPS_MAX_DEC_PIC_BUFFERING_MINUS1 BW_FIELD(111, 4) +#define SEPARATE_COLOUR_PLANE_FLAG BW_FIELD(115, 1) +#define HIGH_PRECISION_OFFSETS_ENABLED_FLAG BW_FIELD(116, 1) +#define PERSISTENT_RICE_ADAPTATION_ENABLED_FLAG BW_FIELD(117, 1) + +/* PPS */ +#define PIC_PARAMETER_SET_ID BW_FIELD(118, 6) +#define PPS_SEQ_PARAMETER_SET_ID BW_FIELD(124, 4) +#define DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG BW_FIELD(128, 1) +#define OUTPUT_FLAG_PRESENT_FLAG BW_FIELD(129, 1) +#define NUM_EXTRA_SLICE_HEADER_BITS BW_FIELD(130, 13) +#define SIGN_DATA_HIDING_ENABLED_FLAG BW_FIELD(143, 1) +#define CABAC_INIT_PRESENT_FLAG BW_FIELD(144, 1) +#define NUM_REF_IDX_L0_DEFAULT_ACTIVE BW_FIELD(145, 4) +#define NUM_REF_IDX_L1_DEFAULT_ACTIVE BW_FIELD(149, 4) +#define INIT_QP_MINUS26 BW_FIELD(153, 7) +#define CONSTRAINED_INTRA_PRED_FLAG BW_FIELD(160, 1) +#define TRANSFORM_SKIP_ENABLED_FLAG BW_FIELD(161, 1) +#define CU_QP_DELTA_ENABLED_FLAG BW_FIELD(162, 1) +#define LOG2_MIN_CU_QP_DELTA_SIZE BW_FIELD(163, 3) +#define PPS_CB_QP_OFFSET BW_FIELD(166, 5) +#define PPS_CR_QP_OFFSET BW_FIELD(171, 5) +#define PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG BW_FIELD(176, 1) +#define WEIGHTED_PRED_FLAG BW_FIELD(177, 1) +#define WEIGHTED_BIPRED_FLAG BW_FIELD(178, 1) +#define TRANSQUANT_BYPASS_ENABLED_FLAG BW_FIELD(179, 1) +#define TILES_ENABLED_FLAG BW_FIELD(180, 1) +#define ENTROPY_CODING_SYNC_ENABLED_FLAG BW_FIELD(181, 1) +#define PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG BW_FIELD(182, 1) +#define LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG BW_FIELD(183, 1) +#define DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG BW_FIELD(184, 1) +#define PPS_DEBLOCKING_FILTER_DISABLED_FLAG BW_FIELD(185, 1) +#define PPS_BETA_OFFSET_DIV2 BW_FIELD(186, 4) +#define PPS_TC_OFFSET_DIV2 BW_FIELD(190, 4) +#define LISTS_MODIFICATION_PRESENT_FLAG BW_FIELD(194, 1) +#define LOG2_PARALLEL_MERGE_LEVEL BW_FIELD(195, 3) +#define SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_FLAG BW_FIELD(198, 1) + +/* pps extensions */ +#define LOG2_MAX_TRANSFORM_SKIP_BLOCK_SIZE BW_FIELD(202, 2) +#define CROSS_COMPONENT_PREDICTION_ENABLED_FLAG BW_FIELD(204, 1) +#define CHROMA_QP_OFFSET_LIST_ENABLED_FLAG BW_FIELD(205, 1) +#define LOG2_MIN_CU_CHROMA_QP_DELTA_SIZE BW_FIELD(206, 3) +#define CB_QP_OFFSET_LIST(i) BW_FIELD(209 + (i) * 5, 5) // i: 0-5 +#define CB_CR_OFFSET_LIST(i) BW_FIELD(239 + (i) * 5, 5) // i: 0-5 +#define CHROMA_QP_OFFSET_LIST_LEN_MINUS1 BW_FIELD(269, 3) + +/* mvc0 && mvc1 */ +#define MVC_FF BW_FIELD(272, 16) +#define MVC_00 BW_FIELD(288, 9) + +/* poc info */ +#define RESERVED2 BW_FIELD(297, 3) +#define CURRENT_POC BW_FIELD(300, 32) +#define REF_PIC_POC(i) BW_FIELD(332 + (i) * 32, 32) // i: 0-14 +#define RESERVED3 BW_FIELD(812, 32) +#define REF_IS_VALID(i) BW_FIELD(844 + (i), 1) // i: 0-14 +#define RESERVED4 BW_FIELD(859, 1) + +/* tile info*/ +#define NUM_TILE_COLUMNS BW_FIELD(860, 5) +#define NUM_TILE_ROWS BW_FIELD(865, 5) +#define COLUMN_WIDTH(i) BW_FIELD(870 + (i) * 12, 12) // i: 0-19 +#define ROW_HEIGHT(i) BW_FIELD(1110 + (i) * 12, 12) // i: 0-21 + +#define HEVC_SPS_SIZE ALIGN(1110 + 22 * 12, 256) =20 struct rkvdec_hevc_sps_pps { - // SPS - u16 video_parameters_set_id : 4; - u16 seq_parameters_set_id_sps : 4; - u16 chroma_format_idc : 2; - u16 width : 16; - u16 height : 16; - u16 bit_depth_luma : 3; - u16 bit_depth_chroma : 3; - u16 max_pic_order_count_lsb : 5; - u16 diff_max_min_luma_coding_block_size : 2; - u16 min_luma_coding_block_size : 3; - u16 min_transform_block_size : 3; - u16 diff_max_min_transform_block_size : 2; - u16 max_transform_hierarchy_depth_inter : 3; - u16 max_transform_hierarchy_depth_intra : 3; - u16 scaling_list_enabled_flag : 1; - u16 amp_enabled_flag : 1; - u16 sample_adaptive_offset_enabled_flag : 1; - u16 pcm_enabled_flag : 1; - u16 pcm_sample_bit_depth_luma : 4; - u16 pcm_sample_bit_depth_chroma : 4; - u16 pcm_loop_filter_disabled_flag : 1; - u16 diff_max_min_pcm_luma_coding_block_size : 3; - u16 min_pcm_luma_coding_block_size : 3; - u16 num_short_term_ref_pic_sets : 7; - u16 long_term_ref_pics_present_flag : 1; - u16 num_long_term_ref_pics_sps : 6; - u16 sps_temporal_mvp_enabled_flag : 1; - u16 strong_intra_smoothing_enabled_flag : 1; - u16 reserved0 : 7; - u16 sps_max_dec_pic_buffering_minus1 : 4; - u16 separate_colour_plane_flag : 1; - u16 high_precision_offsets_enabled_flag : 1; - u16 persistent_rice_adaptation_enabled_flag : 1; - - // PPS - u16 picture_parameters_set_id : 6; - u16 seq_parameters_set_id_pps : 4; - u16 dependent_slice_segments_enabled_flag : 1; - u16 output_flag_present_flag : 1; - u16 num_extra_slice_header_bits : 13; - u16 sign_data_hiding_enabled_flag : 1; - u16 cabac_init_present_flag : 1; - u16 num_ref_idx_l0_default_active : 4; - u16 num_ref_idx_l1_default_active : 4; - u16 init_qp_minus26 : 7; - u16 constrained_intra_pred_flag : 1; - u16 transform_skip_enabled_flag : 1; - u16 cu_qp_delta_enabled_flag : 1; - u16 log2_min_cb_size : 3; - u16 pps_cb_qp_offset : 5; - u16 pps_cr_qp_offset : 5; - u16 pps_slice_chroma_qp_offsets_present_flag : 1; - u16 weighted_pred_flag : 1; - u16 weighted_bipred_flag : 1; - u16 transquant_bypass_enabled_flag : 1; - u16 tiles_enabled_flag : 1; - u16 entropy_coding_sync_enabled_flag : 1; - u16 pps_loop_filter_across_slices_enabled_flag : 1; - u16 loop_filter_across_tiles_enabled_flag : 1; - u16 deblocking_filter_override_enabled_flag : 1; - u16 pps_deblocking_filter_disabled_flag : 1; - u16 pps_beta_offset_div2 : 4; - u16 pps_tc_offset_div2 : 4; - u16 lists_modification_present_flag : 1; - u16 log2_parallel_merge_level : 3; - u16 slice_segment_header_extension_present_flag : 1; - u16 reserved1 : 3; - - // pps extensions - u16 log2_max_transform_skip_block_size : 2; - u16 cross_component_prediction_enabled_flag : 1; - u16 chroma_qp_offset_list_enabled_flag : 1; - u16 log2_min_cu_chroma_qp_delta_size : 3; - u16 cb_qp_offset_list0 : 5; - u16 cb_qp_offset_list1 : 5; - u16 cb_qp_offset_list2 : 5; - u16 cb_qp_offset_list3 : 5; - u16 cb_qp_offset_list4 : 5; - u16 cb_qp_offset_list5 : 5; - u16 cb_cr_offset_list0 : 5; - u16 cb_cr_offset_list1 : 5; - u16 cb_cr_offset_list2 : 5; - u16 cb_cr_offset_list3 : 5; - u16 cb_cr_offset_list4 : 5; - u16 cb_cr_offset_list5 : 5; - u16 chroma_qp_offset_list_len_minus1 : 3; - - /* mvc0 && mvc1 */ - u16 mvc_ff : 16; - u16 mvc_00 : 9; - - /* poc info */ - u16 reserved2 : 3; - u32 current_poc : 32; - u32 ref_pic_poc0 : 32; - u32 ref_pic_poc1 : 32; - u32 ref_pic_poc2 : 32; - u32 ref_pic_poc3 : 32; - u32 ref_pic_poc4 : 32; - u32 ref_pic_poc5 : 32; - u32 ref_pic_poc6 : 32; - u32 ref_pic_poc7 : 32; - u32 ref_pic_poc8 : 32; - u32 ref_pic_poc9 : 32; - u32 ref_pic_poc10 : 32; - u32 ref_pic_poc11 : 32; - u32 ref_pic_poc12 : 32; - u32 ref_pic_poc13 : 32; - u32 ref_pic_poc14 : 32; - u32 reserved3 : 32; - u32 ref_is_valid : 15; - u32 reserved4 : 1; - - /* tile info*/ - u16 num_tile_columns : 5; - u16 num_tile_rows : 5; - u32 column_width0 : 24; - u32 column_width1 : 24; - u32 column_width2 : 24; - u32 column_width3 : 24; - u32 column_width4 : 24; - u32 column_width5 : 24; - u32 column_width6 : 24; - u32 column_width7 : 24; - u32 column_width8 : 24; - u32 column_width9 : 24; - u32 row_height0 : 24; - u32 row_height1 : 24; - u32 row_height2 : 24; - u32 row_height3 : 24; - u32 row_height4 : 24; - u32 row_height5 : 24; - u32 row_height6 : 24; - u32 row_height7 : 24; - u32 row_height8 : 24; - u32 row_height9 : 24; - u32 row_height10 : 24; - u32 reserved5 : 2; - u32 padding; -} __packed; + u32 info[HEVC_SPS_SIZE / 8 / 4]; +}; =20 struct rkvdec_hevc_priv_tbl { struct rkvdec_hevc_sps_pps param_set; @@ -171,51 +128,6 @@ struct rkvdec_hevc_ctx { struct vdpu383_regs_h26x regs; }; =20 -static void set_column_row(struct rkvdec_hevc_sps_pps *hw_ps, u16 *column,= u16 *row) -{ - hw_ps->column_width0 =3D column[0] | (column[1] << 12); - hw_ps->row_height0 =3D row[0] | (row[1] << 12); - hw_ps->column_width1 =3D column[2] | (column[3] << 12); - hw_ps->row_height1 =3D row[2] | (row[3] << 12); - hw_ps->column_width2 =3D column[4] | (column[5] << 12); - hw_ps->row_height2 =3D row[4] | (row[5] << 12); - hw_ps->column_width3 =3D column[6] | (column[7] << 12); - hw_ps->row_height3 =3D row[6] | (row[7] << 12); - hw_ps->column_width4 =3D column[8] | (column[9] << 12); - hw_ps->row_height4 =3D row[8] | (row[9] << 12); - hw_ps->column_width5 =3D column[10] | (column[11] << 12); - hw_ps->row_height5 =3D row[10] | (row[11] << 12); - hw_ps->column_width6 =3D column[12] | (column[13] << 12); - hw_ps->row_height6 =3D row[12] | (row[13] << 12); - hw_ps->column_width7 =3D column[14] | (column[15] << 12); - hw_ps->row_height7 =3D row[14] | (row[15] << 12); - hw_ps->column_width8 =3D column[16] | (column[17] << 12); - hw_ps->row_height8 =3D row[16] | (row[17] << 12); - hw_ps->column_width9 =3D column[18] | (column[19] << 12); - hw_ps->row_height9 =3D row[18] | (row[19] << 12); - - hw_ps->row_height10 =3D row[20] | (row[21] << 12); -} - -static void set_pps_ref_pic_poc(struct rkvdec_hevc_sps_pps *hw_ps, const s= truct v4l2_hevc_dpb_entry *dpb) -{ - hw_ps->ref_pic_poc0 =3D dpb[0].pic_order_cnt_val; - hw_ps->ref_pic_poc1 =3D dpb[1].pic_order_cnt_val; - hw_ps->ref_pic_poc2 =3D dpb[2].pic_order_cnt_val; - hw_ps->ref_pic_poc3 =3D dpb[3].pic_order_cnt_val; - hw_ps->ref_pic_poc4 =3D dpb[4].pic_order_cnt_val; - hw_ps->ref_pic_poc5 =3D dpb[5].pic_order_cnt_val; - hw_ps->ref_pic_poc6 =3D dpb[6].pic_order_cnt_val; - hw_ps->ref_pic_poc7 =3D dpb[7].pic_order_cnt_val; - hw_ps->ref_pic_poc8 =3D dpb[8].pic_order_cnt_val; - hw_ps->ref_pic_poc9 =3D dpb[9].pic_order_cnt_val; - hw_ps->ref_pic_poc10 =3D dpb[10].pic_order_cnt_val; - hw_ps->ref_pic_poc11 =3D dpb[11].pic_order_cnt_val; - hw_ps->ref_pic_poc12 =3D dpb[12].pic_order_cnt_val; - hw_ps->ref_pic_poc13 =3D dpb[13].pic_order_cnt_val; - hw_ps->ref_pic_poc14 =3D dpb[14].pic_order_cnt_val; -} - static void assemble_hw_pps(struct rkvdec_ctx *ctx, struct rkvdec_hevc_run *run) { @@ -245,104 +157,130 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, memset(hw_ps, 0, sizeof(*hw_ps)); =20 /* write sps */ - hw_ps->video_parameters_set_id =3D sps->video_parameter_set_id; - hw_ps->seq_parameters_set_id_sps =3D sps->seq_parameter_set_id; - hw_ps->chroma_format_idc =3D sps->chroma_format_idc; + rkvdec_set_bw_field(hw_ps->info, VIDEO_PARAMETER_SET_ID, sps->video_param= eter_set_id); + rkvdec_set_bw_field(hw_ps->info, SEQ_PARAMETER_SET_ID, sps->seq_parameter= _set_id); + rkvdec_set_bw_field(hw_ps->info, CHROMA_FORMAT_IDC, sps->chroma_format_id= c); =20 log2_min_cb_size =3D sps->log2_min_luma_coding_block_size_minus3 + 3; width =3D sps->pic_width_in_luma_samples; height =3D sps->pic_height_in_luma_samples; - hw_ps->width =3D width; - hw_ps->height =3D height; - hw_ps->bit_depth_luma =3D sps->bit_depth_luma_minus8 + 8; - hw_ps->bit_depth_chroma =3D sps->bit_depth_chroma_minus8 + 8; - hw_ps->max_pic_order_count_lsb =3D sps->log2_max_pic_order_cnt_lsb_minus4= + 4; - hw_ps->diff_max_min_luma_coding_block_size =3D sps->log2_diff_max_min_lum= a_coding_block_size; - hw_ps->min_luma_coding_block_size =3D sps->log2_min_luma_coding_block_siz= e_minus3 + 3; - hw_ps->min_transform_block_size =3D sps->log2_min_luma_transform_block_si= ze_minus2 + 2; - hw_ps->diff_max_min_transform_block_size =3D - sps->log2_diff_max_min_luma_transform_block_size; - hw_ps->max_transform_hierarchy_depth_inter =3D sps->max_transform_hierarc= hy_depth_inter; - hw_ps->max_transform_hierarchy_depth_intra =3D sps->max_transform_hierarc= hy_depth_intra; - hw_ps->scaling_list_enabled_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED); - hw_ps->amp_enabled_flag =3D !!(sps->flags & V4L2_HEVC_SPS_FLAG_AMP_ENABLE= D); - hw_ps->sample_adaptive_offset_enabled_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET); + + rkvdec_set_bw_field(hw_ps->info, PIC_WIDTH_IN_LUMA_SAMPLES, width); + rkvdec_set_bw_field(hw_ps->info, PIC_HEIGHT_IN_LUMA_SAMPLES, height); + rkvdec_set_bw_field(hw_ps->info, BIT_DEPTH_LUMA, sps->bit_depth_luma_minu= s8 + 8); + rkvdec_set_bw_field(hw_ps->info, BIT_DEPTH_CHROMA, sps->bit_depth_chroma_= minus8 + 8); + rkvdec_set_bw_field(hw_ps->info, LOG2_MAX_PIC_ORDER_CNT_LSB, + sps->log2_max_pic_order_cnt_lsb_minus4 + 4); + rkvdec_set_bw_field(hw_ps->info, LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE, + sps->log2_diff_max_min_luma_coding_block_size); + rkvdec_set_bw_field(hw_ps->info, LOG2_MIN_LUMA_CODING_BLOCK_SIZE, + sps->log2_min_luma_coding_block_size_minus3 + 3); + rkvdec_set_bw_field(hw_ps->info, LOG2_MIN_TRANSFORM_BLOCK_SIZE, + sps->log2_min_luma_transform_block_size_minus2 + 2); + rkvdec_set_bw_field(hw_ps->info, LOG2_DIFF_MAX_MIN_LUMA_TRANSFORM_BLOCK_S= IZE, + sps->log2_diff_max_min_luma_transform_block_size); + rkvdec_set_bw_field(hw_ps->info, MAX_TRANSFORM_HIERARCHY_DEPTH_INTER, + sps->max_transform_hierarchy_depth_inter); + rkvdec_set_bw_field(hw_ps->info, MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA, + sps->max_transform_hierarchy_depth_intra); + rkvdec_set_bw_field(hw_ps->info, SCALING_LIST_ENABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, AMP_ENABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_AMP_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET)); =20 pcm_enabled =3D !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_ENABLED); - hw_ps->pcm_enabled_flag =3D pcm_enabled; - hw_ps->pcm_sample_bit_depth_luma =3D - pcm_enabled ? sps->pcm_sample_bit_depth_luma_minus1 + 1 : 0; - hw_ps->pcm_sample_bit_depth_chroma =3D - pcm_enabled ? sps->pcm_sample_bit_depth_chroma_minus1 + 1 : 0; - hw_ps->pcm_loop_filter_disabled_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED); - hw_ps->diff_max_min_pcm_luma_coding_block_size =3D - sps->log2_diff_max_min_pcm_luma_coding_block_size; - hw_ps->min_pcm_luma_coding_block_size =3D - pcm_enabled ? sps->log2_min_pcm_luma_coding_block_size_minus3 + 3 : 0; - hw_ps->num_short_term_ref_pic_sets =3D sps->num_short_term_ref_pic_sets; - hw_ps->long_term_ref_pics_present_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT); - hw_ps->num_long_term_ref_pics_sps =3D sps->num_long_term_ref_pics_sps; - hw_ps->sps_temporal_mvp_enabled_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED); - hw_ps->strong_intra_smoothing_enabled_flag =3D - !!(sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED); - hw_ps->sps_max_dec_pic_buffering_minus1 =3D sps->sps_max_dec_pic_bufferin= g_minus1; + rkvdec_set_bw_field(hw_ps->info, PCM_ENABLED_FLAG, pcm_enabled); + rkvdec_set_bw_field(hw_ps->info, PCM_SAMPLE_BIT_DEPTH_LUMA, + pcm_enabled ? sps->pcm_sample_bit_depth_luma_minus1 + 1 : 0); + rkvdec_set_bw_field(hw_ps->info, PCM_SAMPLE_BIT_DEPTH_CHROMA, + pcm_enabled ? sps->pcm_sample_bit_depth_chroma_minus1 + 1 : 0); + rkvdec_set_bw_field(hw_ps->info, PCM_LOOP_FILTER_DISABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED)); + rkvdec_set_bw_field(hw_ps->info, LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_= SIZE, + sps->log2_diff_max_min_pcm_luma_coding_block_size); + rkvdec_set_bw_field(hw_ps->info, LOG2_MIN_PCM_LUMA_CODING_BLOCK_SIZE, + pcm_enabled ? sps->log2_min_pcm_luma_coding_block_size_minus3 + 3 := 0); + rkvdec_set_bw_field(hw_ps->info, NUM_SHORT_TERM_REF_PIC_SETS, + sps->num_short_term_ref_pic_sets); + rkvdec_set_bw_field(hw_ps->info, LONG_TERM_REF_PICS_PRESENT_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, NUM_LONG_TERM_REF_PICS_SPS, + sps->num_long_term_ref_pics_sps); + rkvdec_set_bw_field(hw_ps->info, SPS_TEMPORAL_MVP_ENABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, STRONG_INTRA_SMOOTHING_ENABLED_FLAG, + !!(sps->flags & V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, SPS_MAX_DEC_PIC_BUFFERING_MINUS1, + sps->sps_max_dec_pic_buffering_minus1); =20 /* write pps */ - hw_ps->picture_parameters_set_id =3D pps->pic_parameter_set_id; - hw_ps->seq_parameters_set_id_pps =3D sps->seq_parameter_set_id; - hw_ps->dependent_slice_segments_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED); - hw_ps->output_flag_present_flag =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_OU= TPUT_FLAG_PRESENT); - hw_ps->num_extra_slice_header_bits =3D pps->num_extra_slice_header_bits; - hw_ps->sign_data_hiding_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED); - hw_ps->cabac_init_present_flag =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_CAB= AC_INIT_PRESENT); - hw_ps->num_ref_idx_l0_default_active =3D pps->num_ref_idx_l0_default_acti= ve_minus1 + 1; - hw_ps->num_ref_idx_l1_default_active =3D pps->num_ref_idx_l1_default_acti= ve_minus1 + 1; - hw_ps->init_qp_minus26 =3D pps->init_qp_minus26; - hw_ps->constrained_intra_pred_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED); - hw_ps->transform_skip_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED); - hw_ps->cu_qp_delta_enabled_flag =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_CU= _QP_DELTA_ENABLED); - hw_ps->log2_min_cb_size =3D log2_min_cb_size + - sps->log2_diff_max_min_luma_coding_block_size - - pps->diff_cu_qp_delta_depth; - hw_ps->pps_cb_qp_offset =3D pps->pps_cb_qp_offset; - hw_ps->pps_cr_qp_offset =3D pps->pps_cr_qp_offset; - hw_ps->pps_slice_chroma_qp_offsets_present_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT); - hw_ps->weighted_pred_flag =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED= _PRED); - hw_ps->weighted_bipred_flag =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHT= ED_BIPRED); - hw_ps->transquant_bypass_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED); + rkvdec_set_bw_field(hw_ps->info, PIC_PARAMETER_SET_ID, pps->pic_parameter= _set_id); + rkvdec_set_bw_field(hw_ps->info, SEQ_PARAMETER_SET_ID, sps->seq_parameter= _set_id); + rkvdec_set_bw_field(hw_ps->info, DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED)= ); + rkvdec_set_bw_field(hw_ps->info, OUTPUT_FLAG_PRESENT_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, NUM_EXTRA_SLICE_HEADER_BITS, + pps->num_extra_slice_header_bits); + rkvdec_set_bw_field(hw_ps->info, SIGN_DATA_HIDING_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, CABAC_INIT_PRESENT_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, NUM_REF_IDX_L0_DEFAULT_ACTIVE, + pps->num_ref_idx_l0_default_active_minus1 + 1); + rkvdec_set_bw_field(hw_ps->info, NUM_REF_IDX_L1_DEFAULT_ACTIVE, + pps->num_ref_idx_l1_default_active_minus1 + 1); + rkvdec_set_bw_field(hw_ps->info, INIT_QP_MINUS26, pps->init_qp_minus26); + rkvdec_set_bw_field(hw_ps->info, CONSTRAINED_INTRA_PRED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED)); + rkvdec_set_bw_field(hw_ps->info, TRANSFORM_SKIP_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, CU_QP_DELTA_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, LOG2_MIN_CU_QP_DELTA_SIZE, log2_min_cb_s= ize + + sps->log2_diff_max_min_luma_coding_block_size - + pps->diff_cu_qp_delta_depth); + rkvdec_set_bw_field(hw_ps->info, PPS_CB_QP_OFFSET, pps->pps_cb_qp_offset); + rkvdec_set_bw_field(hw_ps->info, PPS_CR_QP_OFFSET, pps->pps_cr_qp_offset); + rkvdec_set_bw_field(hw_ps->info, PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG, + !!(pps->flags & + V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, WEIGHTED_PRED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED)); + rkvdec_set_bw_field(hw_ps->info, WEIGHTED_BIPRED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED)); + rkvdec_set_bw_field(hw_ps->info, TRANSQUANT_BYPASS_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED)); tiles_enabled =3D !!(pps->flags & V4L2_HEVC_PPS_FLAG_TILES_ENABLED); - hw_ps->tiles_enabled_flag =3D tiles_enabled; - hw_ps->entropy_coding_sync_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED); - hw_ps->pps_loop_filter_across_slices_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED= ); - hw_ps->loop_filter_across_tiles_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED); - hw_ps->deblocking_filter_override_enabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED); - hw_ps->pps_deblocking_filter_disabled_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER); - hw_ps->pps_beta_offset_div2 =3D pps->pps_beta_offset_div2; - hw_ps->pps_tc_offset_div2 =3D pps->pps_tc_offset_div2; - hw_ps->lists_modification_present_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT); - hw_ps->log2_parallel_merge_level =3D pps->log2_parallel_merge_level_minus= 2 + 2; - hw_ps->slice_segment_header_extension_present_flag =3D - !!(pps->flags & V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESEN= T); - hw_ps->num_tile_columns =3D tiles_enabled ? pps->num_tile_columns_minus1 = + 1 : 1; - hw_ps->num_tile_rows =3D tiles_enabled ? pps->num_tile_rows_minus1 + 1 : = 1; - hw_ps->mvc_ff =3D 0xffff; + rkvdec_set_bw_field(hw_ps->info, TILES_ENABLED_FLAG, tiles_enabled); + rkvdec_set_bw_field(hw_ps->info, ENTROPY_CODING_SYNC_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FL= AG, + !!(pps->flags & + V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED= )); + rkvdec_set_bw_field(hw_ps->info, DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG, + !!(pps->flags & + V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED)); + rkvdec_set_bw_field(hw_ps->info, PPS_DEBLOCKING_FILTER_DISABLED_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER)); + rkvdec_set_bw_field(hw_ps->info, PPS_BETA_OFFSET_DIV2, pps->pps_beta_offs= et_div2); + rkvdec_set_bw_field(hw_ps->info, PPS_TC_OFFSET_DIV2, pps->pps_tc_offset_d= iv2); + rkvdec_set_bw_field(hw_ps->info, LISTS_MODIFICATION_PRESENT_FLAG, + !!(pps->flags & V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, LOG2_PARALLEL_MERGE_LEVEL, + pps->log2_parallel_merge_level_minus2 + 2); + rkvdec_set_bw_field(hw_ps->info, SLICE_SEGMENT_HEADER_EXTENSION_PRESENT_F= LAG, + !!(pps->flags & + V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT)); + rkvdec_set_bw_field(hw_ps->info, NUM_TILE_COLUMNS, + tiles_enabled ? pps->num_tile_columns_minus1 + 1 : 1); + rkvdec_set_bw_field(hw_ps->info, NUM_TILE_ROWS, + tiles_enabled ? pps->num_tile_rows_minus1 + 1 : 1); + rkvdec_set_bw_field(hw_ps->info, MVC_FF, 0xffff); =20 // Setup tiles information memset(column_width, 0, sizeof(column_width)); @@ -367,15 +305,19 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, row_height[0] =3D (height + max_cu_width - 1) / max_cu_width; } =20 - set_column_row(hw_ps, column_width, row_height); + for (i =3D 0; i < 20; i++) + rkvdec_set_bw_field(hw_ps->info, COLUMN_WIDTH(i), column_width[i]); + for (i =3D 0; i < 22; i++) + rkvdec_set_bw_field(hw_ps->info, ROW_HEIGHT(i), row_height[i]); =20 // Setup POC information - hw_ps->current_poc =3D dec_params->pic_order_cnt_val; + rkvdec_set_bw_field(hw_ps->info, CURRENT_POC, dec_params->pic_order_cnt_v= al); =20 - set_pps_ref_pic_poc(hw_ps, dec_params->dpb); for (i =3D 0; i < ARRAY_SIZE(dec_params->dpb); i++) { - u32 valid =3D !!(dec_params->num_active_dpb_entries > i); - hw_ps->ref_is_valid |=3D valid << i; + rkvdec_set_bw_field(hw_ps->info, REF_IS_VALID(i), + !!(dec_params->num_active_dpb_entries > i)); + rkvdec_set_bw_field(hw_ps->info, REF_PIC_POC(i), + dec_params->dpb[i].pic_order_cnt_val); } } =20 --=20 2.53.0