Message ID | 20221219155616.848690-1-benjamin.gaignard@collabora.com |
---|---|
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp2468547wrn; Mon, 19 Dec 2022 07:59:00 -0800 (PST) X-Google-Smtp-Source: AA0mqf6w6zPf6//0Zj5j9+tyB9j1m622u+q8am5TsIvQ8xq8+cqN2Xj/nPJA2GbRk6SVjHdCxusi X-Received: by 2002:a17:902:ccd0:b0:188:7da8:a970 with SMTP id z16-20020a170902ccd000b001887da8a970mr50022751ple.8.1671465540471; Mon, 19 Dec 2022 07:59:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671465540; cv=none; d=google.com; s=arc-20160816; b=wLHrVgTLnvPw633YDhR78q2XhzDCaVgzuZ2JGYLIX94I9Z+OXcapXP7AIMEdSTzDWG xuaf9C4IyX8VPzEP34Mawjpyl92jwpqsY/N95o9LW8m01xx7Hr8PzeqkuQRywhWxJRJ4 6nsYfS8+92OyMBrKuTpgkBOYOLq88eNO/YaTx28FNuxr8lImK7vPRuFO/owsLfJGRrpb nqXXgr7ZoAJpkGuIIPG0tb5p15dicVUCYP33jKlAbseZ8+esnXLFP7cNZTtHkeCPmfSk KZ00li+ryigO8mhpXRwlihMw5XfGiGGVkwONrFOYjMk4HJQHYIW0ODzi6fEhOKfhO39E zXPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=yE9ts2/piWUja2GKLYFKN4wXJJdBHTnIqQ3YXNL7p3s=; b=0CR6n6I0URhhkz6SFUXesI3BOigwb6DySMHS029R5YH3k0leA24eATBYQuohU0sWNH 4zXrfuaRy8M1Rv9Ovo4Lu67uptB91Pbbh8ZGkplmeaJ1jKgeu2qzbr69NmZOHDOGBsHH qfr+tA2YYgnC33HveijK1GB9cYUbedWM57+cfN3ktBsFTOyPeCb7rQocgwjPkG8FpKDc Yuri9Jjksu+f1oaHX3fpfMkonEbMYAkCqLqcSmIXd7uNI9+V4mg+G975XznpJD0LAMqU 6dmoA+HmqrB5hwIytTpR0dLlwjT4qga0fPqv1j6y6osFdRgxJA6XiypGkhp/JsHrXwie b+KA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=KhN5FkuS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t6-20020a170902bc4600b00186e4a758a0si10408979plz.573.2022.12.19.07.58.47; Mon, 19 Dec 2022 07:59:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=KhN5FkuS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232568AbiLSP4j (ORCPT <rfc822;abdi.embedded@gmail.com> + 99 others); Mon, 19 Dec 2022 10:56:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232043AbiLSP41 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 19 Dec 2022 10:56:27 -0500 Received: from madras.collabora.co.uk (madras.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e5ab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0E6EB6272; Mon, 19 Dec 2022 07:56:25 -0800 (PST) Received: from benjamin-XPS-13-9310.. (unknown [IPv6:2a01:e0a:120:3210:f69c:5603:d4ce:7aa2]) (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: benjamin.gaignard) by madras.collabora.co.uk (Postfix) with ESMTPSA id 91FE36602C25; Mon, 19 Dec 2022 15:56:23 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1671465383; bh=UyVulrVn+7bAVKLq/DGXCKRzuRojbWRGKmItzsniUQ0=; h=From:To:Cc:Subject:Date:From; b=KhN5FkuStBnUYbcL5zO5utJ1twZs259RkiQ0rKTDWaQya+3fTR3t4H3pp2ndipwOA aey+i8pzNYFD6bYYiK2nSWMzgMISxOKWGj+oh6sVpfgC/69zqQnrtumXX5PqK64H0z uhzN+iFAfYKGXjbDSatqMCYi2jJgbz2eT2aC6prJnuyio8KDJNBQBYJPrTGs6x9EQ3 06TiqQHu0pWkQxFkIbvZFQdv00x3vuTT0vNWV5GFn/s5FS6zVm4xZ/gY1rIpxxeo2q TJWk+nhf3cocvtDTRfQQJyRgglb2kLz16xYwG+Brxl6dcpdBQuJ1e07zrMmh6Uzc8G ZhXwW5Sa+Zm4A== From: Benjamin Gaignard <benjamin.gaignard@collabora.com> To: ezequiel@vanguardiasur.com.ar, p.zabel@pengutronix.de, mchehab@kernel.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, heiko@sntech.de, daniel.almeida@collabora.com, nicolas.dufresne@collabora.co.uk Cc: linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@collabora.com, Benjamin Gaignard <benjamin.gaignard@collabora.com> Subject: [PATCH v1 0/9] AV1 stateless decoder for RK3588 Date: Mon, 19 Dec 2022 16:56:07 +0100 Message-Id: <20221219155616.848690-1-benjamin.gaignard@collabora.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1752658650197592080?= X-GMAIL-MSGID: =?utf-8?q?1752658650197592080?= |
Series |
AV1 stateless decoder for RK3588
|
|
Message
Benjamin Gaignard
Dec. 19, 2022, 3:56 p.m. UTC
This series implement AV1 stateless decoder for RK3588 SoC. The harware support 8 and 10 bits bitstreams up to 7680x4320. AV1 feature like film grain or scaling are done by the postprocessor. The driver can produce NV12_4L4 and NV12 pixel formats. A native 10bits NV12_4L4 format is possible but need more investigation to be completly documented and enabled. It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and Sebastian's device-tree patches for RK3588. The full branch can be found here: https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. The failing tests are: - 10bits bitstream because 10bits output formats aren't yet implemented. - the 2 tests with 2 spatial layers: few errors in luma/chroma values - tests with resolution < hardware limit (64x64) Benjamin Benjamin Gaignard (9): dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible media: verisilicon: Add AV1 decoder mode and controls media: verisilicon: Save bit depth for AV1 decoder media: verisilicon: Check AV1 bitstreams bit depth media: verisilicon: Compute motion vectors size for AV1 frames media: verisilicon: Add AV1 entropy helpers media: verisilicon: Add Rockchip AV1 decoder media: verisilicon: Add film grain feature to AV1 driver media: verisilicon: Enable AV1 decoder on rk3588 .../bindings/media/rockchip-vpu.yaml | 1 + drivers/media/platform/verisilicon/Makefile | 3 + drivers/media/platform/verisilicon/hantro.h | 5 + .../media/platform/verisilicon/hantro_drv.c | 54 + .../media/platform/verisilicon/hantro_hw.h | 102 + .../platform/verisilicon/hantro_postproc.c | 3 + .../media/platform/verisilicon/hantro_v4l2.c | 5 + .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ .../verisilicon/rockchip_av1_entropymode.h | 272 + .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ .../verisilicon/rockchip_av1_filmgrain.h | 36 + .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ .../verisilicon/rockchip_vpu981_regs.h | 477 ++ .../platform/verisilicon/rockchip_vpu_hw.c | 116 + 14 files changed, 8291 insertions(+) create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h
Comments
Le lundi 19 décembre 2022 à 16:56 +0100, Benjamin Gaignard a écrit : > This series implement AV1 stateless decoder for RK3588 SoC. > The harware support 8 and 10 bits bitstreams up to 7680x4320. > AV1 feature like film grain or scaling are done by the postprocessor. > The driver can produce NV12_4L4 and NV12 pixel formats. > A native 10bits NV12_4L4 format is possible but need more investigation > to be completly documented and enabled. > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > Sebastian's device-tree patches for RK3588. > > The full branch can be found here: > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > The failing tests are: > - 10bits bitstream because 10bits output formats aren't yet implemented. > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > - tests with resolution < hardware limit (64x64) Its nice to note that we tested 10bit support by forcing P010 output from the postprocessor, with all bitstream working except for filmgrain. Hopefully we'll get 10bit properly sorted out, but we don't think the uAPI have any issues specifically for 10bit (Mediatek driver does not support 10bit or filmgrain). > > Benjamin > > Benjamin Gaignard (9): > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > media: verisilicon: Add AV1 decoder mode and controls > media: verisilicon: Save bit depth for AV1 decoder > media: verisilicon: Check AV1 bitstreams bit depth > media: verisilicon: Compute motion vectors size for AV1 frames > media: verisilicon: Add AV1 entropy helpers > media: verisilicon: Add Rockchip AV1 decoder > media: verisilicon: Add film grain feature to AV1 driver > media: verisilicon: Enable AV1 decoder on rk3588 > > .../bindings/media/rockchip-vpu.yaml | 1 + > drivers/media/platform/verisilicon/Makefile | 3 + > drivers/media/platform/verisilicon/hantro.h | 5 + > .../media/platform/verisilicon/hantro_drv.c | 54 + > .../media/platform/verisilicon/hantro_hw.h | 102 + > .../platform/verisilicon/hantro_postproc.c | 3 + > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > .../verisilicon/rockchip_av1_entropymode.h | 272 + > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > 14 files changed, 8291 insertions(+) > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >
Hi Benjamin, On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard <benjamin.gaignard@collabora.com> wrote: > > This series implement AV1 stateless decoder for RK3588 SoC. > The harware support 8 and 10 bits bitstreams up to 7680x4320. > AV1 feature like film grain or scaling are done by the postprocessor. > The driver can produce NV12_4L4 and NV12 pixel formats. > A native 10bits NV12_4L4 format is possible but need more investigation > to be completly documented and enabled. > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > Sebastian's device-tree patches for RK3588. > I thought the AV1 decoder in RK3588 was really a separate hardware from the Hantro G1/G2. Shouldn't this need a new driver for this new hardware? Thanks! Ezequiel > The full branch can be found here: > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > The failing tests are: > - 10bits bitstream because 10bits output formats aren't yet implemented. > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > - tests with resolution < hardware limit (64x64) > > Benjamin > > Benjamin Gaignard (9): > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > media: verisilicon: Add AV1 decoder mode and controls > media: verisilicon: Save bit depth for AV1 decoder > media: verisilicon: Check AV1 bitstreams bit depth > media: verisilicon: Compute motion vectors size for AV1 frames > media: verisilicon: Add AV1 entropy helpers > media: verisilicon: Add Rockchip AV1 decoder > media: verisilicon: Add film grain feature to AV1 driver > media: verisilicon: Enable AV1 decoder on rk3588 > > .../bindings/media/rockchip-vpu.yaml | 1 + > drivers/media/platform/verisilicon/Makefile | 3 + > drivers/media/platform/verisilicon/hantro.h | 5 + > .../media/platform/verisilicon/hantro_drv.c | 54 + > .../media/platform/verisilicon/hantro_hw.h | 102 + > .../platform/verisilicon/hantro_postproc.c | 3 + > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > .../verisilicon/rockchip_av1_entropymode.h | 272 + > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > 14 files changed, 8291 insertions(+) > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > > -- > 2.34.1 >
Hi Benjamin, Hi Ezequiel, On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: >On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard ><benjamin.gaignard@collabora.com> wrote: >> >> This series implement AV1 stateless decoder for RK3588 SoC. >> The harware support 8 and 10 bits bitstreams up to 7680x4320. >> AV1 feature like film grain or scaling are done by the postprocessor. >> The driver can produce NV12_4L4 and NV12 pixel formats. >> A native 10bits NV12_4L4 format is possible but need more investigation >> to be completly documented and enabled. >> >> It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and >> Sebastian's device-tree patches for RK3588. >> > >I thought the AV1 decoder in RK3588 was really a separate hardware >from the Hantro G1/G2. > >Shouldn't this need a new driver for this new hardware? Just jumping into this discussion as I am currently working on the rkvenc driver. In my case I am extending the rkvdec driver to become more generic for other rockchip specific enc/decoders. My first change looks like this: --- drivers/staging/media/rkvdec/Makefile | 4 +- drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- --- While working on other parts of the encoder I found many places in the rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro functions but where limited to the decoder case. I think there are two options for the av1 codec. 1) If the vpu981 is a driver that has nothing to do with verisilicon but works with this driver framework, then we should integrate vepu981 into it but consider rename the verisilicon unrelated parts to something generic. 2) Move the vepu981 av1 driver into the rkvdec instead. If 1) is the way to go, we can even think of moving the staging code parts from rkvdec to the verisilicon code. Likewise to the vepu981-av1. I could also keep on integrating the rkvenc on that base instead. Regards, Michael >> The full branch can be found here: >> https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 >> >> Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. >> The failing tests are: >> - 10bits bitstream because 10bits output formats aren't yet implemented. >> - the 2 tests with 2 spatial layers: few errors in luma/chroma values >> - tests with resolution < hardware limit (64x64) >> >> Benjamin >> >> Benjamin Gaignard (9): >> dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible >> media: verisilicon: Add AV1 decoder mode and controls >> media: verisilicon: Save bit depth for AV1 decoder >> media: verisilicon: Check AV1 bitstreams bit depth >> media: verisilicon: Compute motion vectors size for AV1 frames >> media: verisilicon: Add AV1 entropy helpers >> media: verisilicon: Add Rockchip AV1 decoder >> media: verisilicon: Add film grain feature to AV1 driver >> media: verisilicon: Enable AV1 decoder on rk3588 >> >> .../bindings/media/rockchip-vpu.yaml | 1 + >> drivers/media/platform/verisilicon/Makefile | 3 + >> drivers/media/platform/verisilicon/hantro.h | 5 + >> .../media/platform/verisilicon/hantro_drv.c | 54 + >> .../media/platform/verisilicon/hantro_hw.h | 102 + >> .../platform/verisilicon/hantro_postproc.c | 3 + >> .../media/platform/verisilicon/hantro_v4l2.c | 5 + >> .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ >> .../verisilicon/rockchip_av1_entropymode.h | 272 + >> .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ >> .../verisilicon/rockchip_av1_filmgrain.h | 36 + >> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ >> .../verisilicon/rockchip_vpu981_regs.h | 477 ++ >> .../platform/verisilicon/rockchip_vpu_hw.c | 116 + >> 14 files changed, 8291 insertions(+) >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >> >> -- >> 2.34.1 >> > >_______________________________________________ >linux-arm-kernel mailing list >linux-arm-kernel@lists.infradead.org >http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >
Hi Michael, On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: > > > Hi Benjamin, > Hi Ezequiel, > > On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: > >On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > ><benjamin.gaignard@collabora.com> wrote: > >> > >> This series implement AV1 stateless decoder for RK3588 SoC. > >> The harware support 8 and 10 bits bitstreams up to 7680x4320. > >> AV1 feature like film grain or scaling are done by the postprocessor. > >> The driver can produce NV12_4L4 and NV12 pixel formats. > >> A native 10bits NV12_4L4 format is possible but need more investigation > >> to be completly documented and enabled. > >> > >> It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > >> Sebastian's device-tree patches for RK3588. > >> > > > >I thought the AV1 decoder in RK3588 was really a separate hardware > >from the Hantro G1/G2. > > > >Shouldn't this need a new driver for this new hardware? > > Just jumping into this discussion as I am currently working on the rkvenc driver. > The more the merrier, there's always room for developers :-) > In my case I am extending the rkvdec driver to become more generic for > other rockchip specific enc/decoders. > > My first change looks like this: > --- > drivers/staging/media/rkvdec/Makefile | 4 +- > drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- > drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- > drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- > drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- > --- > > While working on other parts of the encoder I found many places in the > rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro > functions but where limited to the decoder case. > Because stateless decoders devices are very similar in their general behavior, their drivers could be very similar. Hantro and Rkvdec could look similar because the same humans worked on them. Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling could be shared among all stateless decoder drivers. I think even at one point we experimented with having a shared/common code base for all stateless codecs. In other words, it's entirely possible to support Hantro devices in the Cedrus driver and vice-versa, you would only have to write the hardware-specific bits. However, there is consensus to have a separate driver for each different hardware, even when the hardware is a bit similar. This may lead to some code duplication, but it's less fragile / more flexible. Maintaining drivers this way allows developers to evolve, testing on a small family of devices, without breaking support for other devices. This is important as sometimes it's hard to get the hardware, but we still don't want to break the support! > I think there are two options for the av1 codec. > > 1) If the vpu981 is a driver that has nothing to do with verisilicon but > works with this driver framework, then we should integrate vepu981 into it > but consider rename the verisilicon unrelated parts to something generic. > > 2) Move the vepu981 av1 driver into the rkvdec instead. > > If 1) is the way to go, we can even think of moving the staging code parts from > rkvdec to the verisilicon code. Likewise to the vepu981-av1. > The Hantro driver should only support G1, G2, and VC8000D; which can be said to belong to the same family. The RKVDEC driver supports Rockchip vdpu34x core. I have to admit I'm not exactly sure if we support anything else than vdpu34x. I'm not familiar with the AV1 support provided by this patch, but looking at the mpp code: ... "rk3588", ROCKCHIP_SOC_RK3588, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, which according to this patchset is vdpu981 (?) If the vdpu38x device interface, configuration, buffer handling and registers are similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver should be straightforward. If the vdpu38x core differs, it may be reason enough to consider a new driver. As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. Again, I'm far less worried for a little code duplication in the boilerplate (which can be solved with helpers, etc.) and more worried about making sure we can evolve drivers easily, while minimizing regressions. Hope it helps! Ezequiel > I could also keep on integrating the rkvenc on that base instead. > > Regards, > Michael > > >> The full branch can be found here: > >> https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > >> > >> Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > >> The failing tests are: > >> - 10bits bitstream because 10bits output formats aren't yet implemented. > >> - the 2 tests with 2 spatial layers: few errors in luma/chroma values > >> - tests with resolution < hardware limit (64x64) > >> > >> Benjamin > >> > >> Benjamin Gaignard (9): > >> dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > >> media: verisilicon: Add AV1 decoder mode and controls > >> media: verisilicon: Save bit depth for AV1 decoder > >> media: verisilicon: Check AV1 bitstreams bit depth > >> media: verisilicon: Compute motion vectors size for AV1 frames > >> media: verisilicon: Add AV1 entropy helpers > >> media: verisilicon: Add Rockchip AV1 decoder > >> media: verisilicon: Add film grain feature to AV1 driver > >> media: verisilicon: Enable AV1 decoder on rk3588 > >> > >> .../bindings/media/rockchip-vpu.yaml | 1 + > >> drivers/media/platform/verisilicon/Makefile | 3 + > >> drivers/media/platform/verisilicon/hantro.h | 5 + > >> .../media/platform/verisilicon/hantro_drv.c | 54 + > >> .../media/platform/verisilicon/hantro_hw.h | 102 + > >> .../platform/verisilicon/hantro_postproc.c | 3 + > >> .../media/platform/verisilicon/hantro_v4l2.c | 5 + > >> .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > >> .../verisilicon/rockchip_av1_entropymode.h | 272 + > >> .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > >> .../verisilicon/rockchip_av1_filmgrain.h | 36 + > >> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > >> .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > >> .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > >> 14 files changed, 8291 insertions(+) > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > >> > >> -- > >> 2.34.1 > >> > > > >_______________________________________________ > >linux-arm-kernel mailing list > >linux-arm-kernel@lists.infradead.org > >http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > > > -- > Pengutronix e.K. | | > Steuerwalder Str. 21 | http://www.pengutronix.de/ | > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Le 20/12/2022 à 02:52, Ezequiel Garcia a écrit : > Hi Michael, > > On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: >> >> Hi Benjamin, >> Hi Ezequiel, >> >> On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: >>> On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard >>> <benjamin.gaignard@collabora.com> wrote: >>>> This series implement AV1 stateless decoder for RK3588 SoC. >>>> The harware support 8 and 10 bits bitstreams up to 7680x4320. >>>> AV1 feature like film grain or scaling are done by the postprocessor. >>>> The driver can produce NV12_4L4 and NV12 pixel formats. >>>> A native 10bits NV12_4L4 format is possible but need more investigation >>>> to be completly documented and enabled. >>>> >>>> It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and >>>> Sebastian's device-tree patches for RK3588. >>>> >>> I thought the AV1 decoder in RK3588 was really a separate hardware >> >from the Hantro G1/G2. >>> Shouldn't this need a new driver for this new hardware? >> Just jumping into this discussion as I am currently working on the rkvenc driver. >> > The more the merrier, there's always room for developers :-) > >> In my case I am extending the rkvdec driver to become more generic for >> other rockchip specific enc/decoders. >> >> My first change looks like this: >> --- >> drivers/staging/media/rkvdec/Makefile | 4 +- >> drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- >> drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- >> drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- >> drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- >> --- >> >> While working on other parts of the encoder I found many places in the >> rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro >> functions but where limited to the decoder case. >> > Because stateless decoders devices are very similar in their general behavior, > their drivers could be very similar. > > Hantro and Rkvdec could look similar because the same humans worked on them. > > Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling > could be shared among all stateless decoder drivers. I think even at one point > we experimented with having a shared/common code base for all stateless codecs. > > In other words, it's entirely possible to support Hantro devices in > the Cedrus driver > and vice-versa, you would only have to write the hardware-specific bits. > > However, there is consensus to have a separate driver for each > different hardware, > even when the hardware is a bit similar. This may lead to some code duplication, > but it's less fragile / more flexible. Maintaining drivers this way allows > developers to evolve, testing on a small family of devices, without > breaking support > for other devices. > > This is important as sometimes it's hard to get the hardware, > but we still don't want to break the support! > >> I think there are two options for the av1 codec. >> >> 1) If the vpu981 is a driver that has nothing to do with verisilicon but >> works with this driver framework, then we should integrate vepu981 into it >> but consider rename the verisilicon unrelated parts to something generic. >> >> 2) Move the vepu981 av1 driver into the rkvdec instead. >> >> If 1) is the way to go, we can even think of moving the staging code parts from >> rkvdec to the verisilicon code. Likewise to the vepu981-av1. >> > The Hantro driver should only support G1, G2, and VC8000D; > which can be said to belong to the same family. Rockchip TRM names this hardware block vpu981 but it is a Verisilicon hardware block, probably a VC9000D with a different register mapping. > > The RKVDEC driver supports Rockchip vdpu34x core. I have to admit > I'm not exactly sure if we support anything else than vdpu34x. > > I'm not familiar with the AV1 support provided by this patch, > but looking at the mpp code: > > ... > "rk3588", > ROCKCHIP_SOC_RK3588, > HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | > HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, > { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, > { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, > > Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, > which according to this patchset is vdpu981 (?) > > If the vdpu38x device interface, configuration, buffer handling and > registers are > similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver > should be straightforward. > If the vdpu38x core differs, it may be reason enough to consider a new driver. > > As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. > > Again, I'm far less worried for a little code duplication in the > boilerplate (which can be solved > with helpers, etc.) and more worried about making sure we can evolve > drivers easily, > while minimizing regressions. > > Hope it helps! > Ezequiel > > >> I could also keep on integrating the rkvenc on that base instead. >> >> Regards, >> Michael >> >>>> The full branch can be found here: >>>> https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 >>>> >>>> Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. >>>> The failing tests are: >>>> - 10bits bitstream because 10bits output formats aren't yet implemented. >>>> - the 2 tests with 2 spatial layers: few errors in luma/chroma values >>>> - tests with resolution < hardware limit (64x64) >>>> >>>> Benjamin >>>> >>>> Benjamin Gaignard (9): >>>> dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible >>>> media: verisilicon: Add AV1 decoder mode and controls >>>> media: verisilicon: Save bit depth for AV1 decoder >>>> media: verisilicon: Check AV1 bitstreams bit depth >>>> media: verisilicon: Compute motion vectors size for AV1 frames >>>> media: verisilicon: Add AV1 entropy helpers >>>> media: verisilicon: Add Rockchip AV1 decoder >>>> media: verisilicon: Add film grain feature to AV1 driver >>>> media: verisilicon: Enable AV1 decoder on rk3588 >>>> >>>> .../bindings/media/rockchip-vpu.yaml | 1 + >>>> drivers/media/platform/verisilicon/Makefile | 3 + >>>> drivers/media/platform/verisilicon/hantro.h | 5 + >>>> .../media/platform/verisilicon/hantro_drv.c | 54 + >>>> .../media/platform/verisilicon/hantro_hw.h | 102 + >>>> .../platform/verisilicon/hantro_postproc.c | 3 + >>>> .../media/platform/verisilicon/hantro_v4l2.c | 5 + >>>> .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ >>>> .../verisilicon/rockchip_av1_entropymode.h | 272 + >>>> .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ >>>> .../verisilicon/rockchip_av1_filmgrain.h | 36 + >>>> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ >>>> .../verisilicon/rockchip_vpu981_regs.h | 477 ++ >>>> .../platform/verisilicon/rockchip_vpu_hw.c | 116 + >>>> 14 files changed, 8291 insertions(+) >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c >>>> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >>>> >>>> -- >>>> 2.34.1 >>>> >>> _______________________________________________ >>> linux-arm-kernel mailing list >>> linux-arm-kernel@lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >>> >> -- >> Pengutronix e.K. | | >> Steuerwalder Str. 21 | http://www.pengutronix.de/ | >> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | >> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Hi Ezequiel, On Mon, Dec 19, 2022 at 10:52:02PM -0300, Ezequiel Garcia wrote: >On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: >> On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: >> >On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard >> ><benjamin.gaignard@collabora.com> wrote: >> >> >> >> This series implement AV1 stateless decoder for RK3588 SoC. >> >> The harware support 8 and 10 bits bitstreams up to 7680x4320. >> >> AV1 feature like film grain or scaling are done by the postprocessor. >> >> The driver can produce NV12_4L4 and NV12 pixel formats. >> >> A native 10bits NV12_4L4 format is possible but need more investigation >> >> to be completly documented and enabled. >> >> >> >> It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and >> >> Sebastian's device-tree patches for RK3588. >> >> >> > >> >I thought the AV1 decoder in RK3588 was really a separate hardware >> >from the Hantro G1/G2. >> > >> >Shouldn't this need a new driver for this new hardware? >> >> Just jumping into this discussion as I am currently working on the rkvenc driver. >> > >The more the merrier, there's always room for developers :-) > >> In my case I am extending the rkvdec driver to become more generic for >> other rockchip specific enc/decoders. >> >> My first change looks like this: >> --- >> drivers/staging/media/rkvdec/Makefile | 4 +- >> drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- >> drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- >> drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- >> drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- >> --- >> >> While working on other parts of the encoder I found many places in the >> rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro >> functions but where limited to the decoder case. >> > >Because stateless decoders devices are very similar in their general behavior, >their drivers could be very similar. > >Hantro and Rkvdec could look similar because the same humans worked on them. > >Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling >could be shared among all stateless decoder drivers. I think even at one point >we experimented with having a shared/common code base for all stateless codecs. > >In other words, it's entirely possible to support Hantro devices in >the Cedrus driver >and vice-versa, you would only have to write the hardware-specific bits. > >However, there is consensus to have a separate driver for each >different hardware, >even when the hardware is a bit similar. This may lead to some code duplication, >but it's less fragile / more flexible. Maintaining drivers this way allows >developers to evolve, testing on a small family of devices, without >breaking support >for other devices. > >This is important as sometimes it's hard to get the hardware, >but we still don't want to break the support! > >> I think there are two options for the av1 codec. >> >> 1) If the vpu981 is a driver that has nothing to do with verisilicon but >> works with this driver framework, then we should integrate vepu981 into it >> but consider rename the verisilicon unrelated parts to something generic. >> >> 2) Move the vepu981 av1 driver into the rkvdec instead. >> >> If 1) is the way to go, we can even think of moving the staging code parts from >> rkvdec to the verisilicon code. Likewise to the vepu981-av1. >> > >The Hantro driver should only support G1, G2, and VC8000D; >which can be said to belong to the same family. > >The RKVDEC driver supports Rockchip vdpu34x core. I have to admit >I'm not exactly sure if we support anything else than vdpu34x. Currently the rkvdec is only supporting vdpu34x. My work would integrate vepu54x into the rkvdec boilerplate and so it would support encode as decode. >I'm not familiar with the AV1 support provided by this patch, >but looking at the mpp code: > >... > "rk3588", > ROCKCHIP_SOC_RK3588, > HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | > HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, > { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, > { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, > >Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, >which according to this patchset is vdpu981 (?) > >If the vdpu38x device interface, configuration, buffer handling and >registers are >similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver >should be straightforward. >If the vdpu38x core differs, it may be reason enough to consider a new driver. > >As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. > >Again, I'm far less worried for a little code duplication in the >boilerplate (which can be solved >with helpers, etc.) and more worried about making sure we can evolve >drivers easily, >while minimizing regressions. Thanks for the explanation. As I agree that not breaking current drivers is a strong argument. Also rkvdec is still in staging, which makes it less harmful for the integration of the encoder path. Since we can not ensure that the rkvenc/rkvdec is not another unknown verisilicon core, going the way of working on a common rkvpu driver is probably the best for now. Also, since I have already done some work into that direction, it sounds good for me. :) >> I could also keep on integrating the rkvenc on that base instead. >> >> Regards, >> Michael >> >> >> The full branch can be found here: >> >> https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 >> >> >> >> Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. >> >> The failing tests are: >> >> - 10bits bitstream because 10bits output formats aren't yet implemented. >> >> - the 2 tests with 2 spatial layers: few errors in luma/chroma values >> >> - tests with resolution < hardware limit (64x64) >> >> >> >> Benjamin >> >> >> >> Benjamin Gaignard (9): >> >> dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible >> >> media: verisilicon: Add AV1 decoder mode and controls >> >> media: verisilicon: Save bit depth for AV1 decoder >> >> media: verisilicon: Check AV1 bitstreams bit depth >> >> media: verisilicon: Compute motion vectors size for AV1 frames >> >> media: verisilicon: Add AV1 entropy helpers >> >> media: verisilicon: Add Rockchip AV1 decoder >> >> media: verisilicon: Add film grain feature to AV1 driver >> >> media: verisilicon: Enable AV1 decoder on rk3588 >> >> >> >> .../bindings/media/rockchip-vpu.yaml | 1 + >> >> drivers/media/platform/verisilicon/Makefile | 3 + >> >> drivers/media/platform/verisilicon/hantro.h | 5 + >> >> .../media/platform/verisilicon/hantro_drv.c | 54 + >> >> .../media/platform/verisilicon/hantro_hw.h | 102 + >> >> .../platform/verisilicon/hantro_postproc.c | 3 + >> >> .../media/platform/verisilicon/hantro_v4l2.c | 5 + >> >> .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ >> >> .../verisilicon/rockchip_av1_entropymode.h | 272 + >> >> .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ >> >> .../verisilicon/rockchip_av1_filmgrain.h | 36 + >> >> .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ >> >> .../verisilicon/rockchip_vpu981_regs.h | 477 ++ >> >> .../platform/verisilicon/rockchip_vpu_hw.c | 116 + >> >> 14 files changed, 8291 insertions(+) >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c >> >> create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >> >> >> >> -- >> >> 2.34.1 >> >> >> > >> >_______________________________________________ >> >linux-arm-kernel mailing list >> >linux-arm-kernel@lists.infradead.org >> >http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> > >> >> -- >> Pengutronix e.K. | | >> Steuerwalder Str. 21 | http://www.pengutronix.de/ | >> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | >> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | >
Le lundi 19 décembre 2022 à 22:54 +0100, Michael Grzeschik a écrit : > Hi Benjamin, > Hi Ezequiel, > > On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: > > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > > <benjamin.gaignard@collabora.com> wrote: > > > > > > This series implement AV1 stateless decoder for RK3588 SoC. > > > The harware support 8 and 10 bits bitstreams up to 7680x4320. > > > AV1 feature like film grain or scaling are done by the postprocessor. > > > The driver can produce NV12_4L4 and NV12 pixel formats. > > > A native 10bits NV12_4L4 format is possible but need more investigation > > > to be completly documented and enabled. > > > > > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > > > Sebastian's device-tree patches for RK3588. > > > > > > > I thought the AV1 decoder in RK3588 was really a separate hardware > > from the Hantro G1/G2. > > > > Shouldn't this need a new driver for this new hardware? > > Just jumping into this discussion as I am currently working on the rkvenc driver. > > In my case I am extending the rkvdec driver to become more generic for > other rockchip specific enc/decoders. > > My first change looks like this: > --- > drivers/staging/media/rkvdec/Makefile | 4 +- > drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- > drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- > drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- > drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- > --- > > While working on other parts of the encoder I found many places in the > rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro > functions but where limited to the decoder case. > > I think there are two options for the av1 codec. > > 1) If the vpu981 is a driver that has nothing to do with verisilicon but > works with this driver framework, then we should integrate vepu981 into it > but consider rename the verisilicon unrelated parts to something generic. I've raised in my review the the naming is sub-optimal. This is an unmodified VC9000D AV1 decoder. No other codecs have been included in the package, even though VC9000D cores can support more. Stating this driver have no place here seems a bit strange to me, but with proper arguments, maybe we can make a case and start a VC9000D dedicated driver (that will be a lot of copy paste, VC9000D post processor notably is identical to VC8000 post processor, but one could argue we should make a VCX000 driver ? > > 2) Move the vepu981 av1 driver into the rkvdec instead. That make no sense, its not a Rockchip HW design, and will likely start appearing on non-RK SoC in the future. > > If 1) is the way to go, we can even think of moving the staging code parts from > rkvdec to the verisilicon code. Likewise to the vepu981-av1. Again, I think using RK naming is unfortunate choice. This AV1 decoder is just like the G1/H1 combo you will find on RK3288. And that same combo is found on many older SoC (actually even newer SoC un the VC8000Nano brand). Like all generation of Hantro chips, there is an optional dependency that can exist between encoder and decoders. The question is if this requires a single driver to maintain a valid state or not. So far, it seems devs have assume that is it needed. p.s. fun fact, on most HW, the decoder rate is cut in half with running concurrently with the encoder > > I could also keep on integrating the rkvenc on that base instead. Do you know if there is any interaction between the encoder and decoder ? Shared registers, shared internal cache ? That's basically what differentiate Hantro here. Also, be aware that some folks are considering starting on RKVDEC2 driver, are you looking at RK32/33 series ? or more RK35 ? > > Regards, > Michael > > > > The full branch can be found here: > > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > > > > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > > > The failing tests are: > > > - 10bits bitstream because 10bits output formats aren't yet implemented. > > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > > > - tests with resolution < hardware limit (64x64) > > > > > > Benjamin > > > > > > Benjamin Gaignard (9): > > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > > > media: verisilicon: Add AV1 decoder mode and controls > > > media: verisilicon: Save bit depth for AV1 decoder > > > media: verisilicon: Check AV1 bitstreams bit depth > > > media: verisilicon: Compute motion vectors size for AV1 frames > > > media: verisilicon: Add AV1 entropy helpers > > > media: verisilicon: Add Rockchip AV1 decoder > > > media: verisilicon: Add film grain feature to AV1 driver > > > media: verisilicon: Enable AV1 decoder on rk3588 > > > > > > .../bindings/media/rockchip-vpu.yaml | 1 + > > > drivers/media/platform/verisilicon/Makefile | 3 + > > > drivers/media/platform/verisilicon/hantro.h | 5 + > > > .../media/platform/verisilicon/hantro_drv.c | 54 + > > > .../media/platform/verisilicon/hantro_hw.h | 102 + > > > .../platform/verisilicon/hantro_postproc.c | 3 + > > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > > > .../verisilicon/rockchip_av1_entropymode.h | 272 + > > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > > > 14 files changed, 8291 insertions(+) > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > > > > > > -- > > > 2.34.1 > > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > >
Le mardi 20 décembre 2022 à 14:40 +0100, Michael Grzeschik a écrit : > Hi Ezequiel, > > On Mon, Dec 19, 2022 at 10:52:02PM -0300, Ezequiel Garcia wrote: > > On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: > > > On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: > > > > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > > > > <benjamin.gaignard@collabora.com> wrote: > > > > > > > > > > This series implement AV1 stateless decoder for RK3588 SoC. > > > > > The harware support 8 and 10 bits bitstreams up to 7680x4320. > > > > > AV1 feature like film grain or scaling are done by the postprocessor. > > > > > The driver can produce NV12_4L4 and NV12 pixel formats. > > > > > A native 10bits NV12_4L4 format is possible but need more investigation > > > > > to be completly documented and enabled. > > > > > > > > > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > > > > > Sebastian's device-tree patches for RK3588. > > > > > > > > > > > > > I thought the AV1 decoder in RK3588 was really a separate hardware > > > > from the Hantro G1/G2. > > > > > > > > Shouldn't this need a new driver for this new hardware? > > > > > > Just jumping into this discussion as I am currently working on the rkvenc driver. > > > > > > > The more the merrier, there's always room for developers :-) > > > > > In my case I am extending the rkvdec driver to become more generic for > > > other rockchip specific enc/decoders. > > > > > > My first change looks like this: > > > --- > > > drivers/staging/media/rkvdec/Makefile | 4 +- > > > drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- > > > drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- > > > drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- > > > drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- > > > --- > > > > > > While working on other parts of the encoder I found many places in the > > > rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro > > > functions but where limited to the decoder case. > > > > > > > Because stateless decoders devices are very similar in their general behavior, > > their drivers could be very similar. > > > > Hantro and Rkvdec could look similar because the same humans worked on them. > > > > Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling > > could be shared among all stateless decoder drivers. I think even at one point > > we experimented with having a shared/common code base for all stateless codecs. > > > > In other words, it's entirely possible to support Hantro devices in > > the Cedrus driver > > and vice-versa, you would only have to write the hardware-specific bits. > > > > However, there is consensus to have a separate driver for each > > different hardware, > > even when the hardware is a bit similar. This may lead to some code duplication, > > but it's less fragile / more flexible. Maintaining drivers this way allows > > developers to evolve, testing on a small family of devices, without > > breaking support > > for other devices. > > > > This is important as sometimes it's hard to get the hardware, > > but we still don't want to break the support! > > > > > I think there are two options for the av1 codec. > > > > > > 1) If the vpu981 is a driver that has nothing to do with verisilicon but > > > works with this driver framework, then we should integrate vepu981 into it > > > but consider rename the verisilicon unrelated parts to something generic. > > > > > > 2) Move the vepu981 av1 driver into the rkvdec instead. > > > > > > If 1) is the way to go, we can even think of moving the staging code parts from > > > rkvdec to the verisilicon code. Likewise to the vepu981-av1. > > > > > > > The Hantro driver should only support G1, G2, and VC8000D; > > which can be said to belong to the same family. > > > > The RKVDEC driver supports Rockchip vdpu34x core. I have to admit > > I'm not exactly sure if we support anything else than vdpu34x. > > Currently the rkvdec is only supporting vdpu34x. My work would integrate > vepu54x into the rkvdec boilerplate and so it would support encode as decode. Which CODEC do you currently work on ? We are about to send a first RFC for a VP8 stateless encoder API (with a rk3399 driver to test), but haven't written the Stateless Encoder API spec yet, so still some work there. And was planning to make an H.264 Sateless Encoder soon. Would be nice to avoid duplicating the effort. > > > I'm not familiar with the AV1 support provided by this patch, > > but looking at the mpp code: > > > > ... > > "rk3588", > > ROCKCHIP_SOC_RK3588, > > HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | > > HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, > > { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, > > { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, > > > > Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, > > which according to this patchset is vdpu981 (?) > > > > If the vdpu38x device interface, configuration, buffer handling and > > registers are > > similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver > > should be straightforward. > > If the vdpu38x core differs, it may be reason enough to consider a new driver. > > > > As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. Well, it has its own driver, Hantro (which is not rkvdec). But maybe you could extend on why you think VC9000D decoder have no place in the hantro/verisilicon family ? > > > > Again, I'm far less worried for a little code duplication in the > > boilerplate (which can be solved > > with helpers, etc.) and more worried about making sure we can evolve > > drivers easily, > > while minimizing regressions. > > Thanks for the explanation. > > As I agree that not breaking current drivers is a strong argument. Also > rkvdec is still in staging, which makes it less harmful for the > integration of the encoder path. We are working on unstaging patches. > > Since we can not ensure that the rkvenc/rkvdec is not another unknown > verisilicon core, going the way of working on a common rkvpu driver is > probably the best for now. We can collectively share our knowledge (to the limit of our legal rights to share) make the right call. In the case of this VC9000D decoder, there is a massive amount of registers that aren't AV1 specific, and existed in VC8000 cores as it, same offset, same size. Hantro designs have this very specific style, which is to share register, giving it a meaning for multiple CODECs. I've commented about that in my review, but until we have more codecs support on VC9000 cores, generalizing the register definition is premature. Though, an typical example of things that are Hantro specific and common to G1, VC8000 and VC9000, is the handling of references for H.264 decoding. This differs massively from how it works with rkvdec here. > > Also, since I have already done some work into that direction, it sounds > good for me. :) Great. For you interest, the modified Hantro H1 encoder is an information that Rockchip disclosed to us directly. And that whys vepu121 (if my memory is right) is implemented in Hantro driver. The register layout have been altered by RK but that's all there is, it does share semantic (and a lot of code) with the "real" H1 found on RK3288, IMX8M Mini and others. > > > > > I could also keep on integrating the rkvenc on that base instead. > > > > > > Regards, > > > Michael > > > > > > > > The full branch can be found here: > > > > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > > > > > > > > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > > > > > The failing tests are: > > > > > - 10bits bitstream because 10bits output formats aren't yet implemented. > > > > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > > > > > - tests with resolution < hardware limit (64x64) > > > > > > > > > > Benjamin > > > > > > > > > > Benjamin Gaignard (9): > > > > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > > > > > media: verisilicon: Add AV1 decoder mode and controls > > > > > media: verisilicon: Save bit depth for AV1 decoder > > > > > media: verisilicon: Check AV1 bitstreams bit depth > > > > > media: verisilicon: Compute motion vectors size for AV1 frames > > > > > media: verisilicon: Add AV1 entropy helpers > > > > > media: verisilicon: Add Rockchip AV1 decoder > > > > > media: verisilicon: Add film grain feature to AV1 driver > > > > > media: verisilicon: Enable AV1 decoder on rk3588 > > > > > > > > > > .../bindings/media/rockchip-vpu.yaml | 1 + > > > > > drivers/media/platform/verisilicon/Makefile | 3 + > > > > > drivers/media/platform/verisilicon/hantro.h | 5 + > > > > > .../media/platform/verisilicon/hantro_drv.c | 54 + > > > > > .../media/platform/verisilicon/hantro_hw.h | 102 + > > > > > .../platform/verisilicon/hantro_postproc.c | 3 + > > > > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > > > > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > > > > > .../verisilicon/rockchip_av1_entropymode.h | 272 + > > > > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > > > > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > > > > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > > > > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > > > > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > > > > > 14 files changed, 8291 insertions(+) > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > > > > > > > > > > -- > > > > > 2.34.1 > > > > > > > > > > > > > _______________________________________________ > > > > linux-arm-kernel mailing list > > > > linux-arm-kernel@lists.infradead.org > > > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > > > > > > > > > -- > > > Pengutronix e.K. | | > > > Steuerwalder Str. 21 | http://www.pengutronix.de/ | > > > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > > > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > > >
Bonjour Nicolas, On Tue, Dec 20, 2022 at 2:15 PM Nicolas Dufresne <nicolas@ndufresne.ca> wrote: > > Le mardi 20 décembre 2022 à 14:40 +0100, Michael Grzeschik a écrit : > > Hi Ezequiel, > > > > On Mon, Dec 19, 2022 at 10:52:02PM -0300, Ezequiel Garcia wrote: > > > On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: > > > > On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: > > > > > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > > > > > <benjamin.gaignard@collabora.com> wrote: > > > > > > > > > > > > This series implement AV1 stateless decoder for RK3588 SoC. > > > > > > The harware support 8 and 10 bits bitstreams up to 7680x4320. > > > > > > AV1 feature like film grain or scaling are done by the postprocessor. > > > > > > The driver can produce NV12_4L4 and NV12 pixel formats. > > > > > > A native 10bits NV12_4L4 format is possible but need more investigation > > > > > > to be completly documented and enabled. > > > > > > > > > > > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > > > > > > Sebastian's device-tree patches for RK3588. > > > > > > > > > > > > > > > > I thought the AV1 decoder in RK3588 was really a separate hardware > > > > > from the Hantro G1/G2. > > > > > > > > > > Shouldn't this need a new driver for this new hardware? > > > > > > > > Just jumping into this discussion as I am currently working on the rkvenc driver. > > > > > > > > > > The more the merrier, there's always room for developers :-) > > > > > > > In my case I am extending the rkvdec driver to become more generic for > > > > other rockchip specific enc/decoders. > > > > > > > > My first change looks like this: > > > > --- > > > > drivers/staging/media/rkvdec/Makefile | 4 +- > > > > drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- > > > > drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- > > > > drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- > > > > drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- > > > > --- > > > > > > > > While working on other parts of the encoder I found many places in the > > > > rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro > > > > functions but where limited to the decoder case. > > > > > > > > > > Because stateless decoders devices are very similar in their general behavior, > > > their drivers could be very similar. > > > > > > Hantro and Rkvdec could look similar because the same humans worked on them. > > > > > > Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling > > > could be shared among all stateless decoder drivers. I think even at one point > > > we experimented with having a shared/common code base for all stateless codecs. > > > > > > In other words, it's entirely possible to support Hantro devices in > > > the Cedrus driver > > > and vice-versa, you would only have to write the hardware-specific bits. > > > > > > However, there is consensus to have a separate driver for each > > > different hardware, > > > even when the hardware is a bit similar. This may lead to some code duplication, > > > but it's less fragile / more flexible. Maintaining drivers this way allows > > > developers to evolve, testing on a small family of devices, without > > > breaking support > > > for other devices. > > > > > > This is important as sometimes it's hard to get the hardware, > > > but we still don't want to break the support! > > > > > > > I think there are two options for the av1 codec. > > > > > > > > 1) If the vpu981 is a driver that has nothing to do with verisilicon but > > > > works with this driver framework, then we should integrate vepu981 into it > > > > but consider rename the verisilicon unrelated parts to something generic. > > > > > > > > 2) Move the vepu981 av1 driver into the rkvdec instead. > > > > > > > > If 1) is the way to go, we can even think of moving the staging code parts from > > > > rkvdec to the verisilicon code. Likewise to the vepu981-av1. > > > > > > > > > > The Hantro driver should only support G1, G2, and VC8000D; > > > which can be said to belong to the same family. > > > > > > The RKVDEC driver supports Rockchip vdpu34x core. I have to admit > > > I'm not exactly sure if we support anything else than vdpu34x. > > > > Currently the rkvdec is only supporting vdpu34x. My work would integrate > > vepu54x into the rkvdec boilerplate and so it would support encode as decode. > > Which CODEC do you currently work on ? We are about to send a first RFC for a > VP8 stateless encoder API (with a rk3399 driver to test), but haven't written > the Stateless Encoder API spec yet, so still some work there. And was planning > to make an H.264 Sateless Encoder soon. Would be nice to avoid duplicating the > effort. > > > > > > I'm not familiar with the AV1 support provided by this patch, > > > but looking at the mpp code: > > > > > > ... > > > "rk3588", > > > ROCKCHIP_SOC_RK3588, > > > HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | > > > HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, > > > { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, > > > { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, > > > > > > Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, > > > which according to this patchset is vdpu981 (?) > > > > > > If the vdpu38x device interface, configuration, buffer handling and > > > registers are > > > similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver > > > should be straightforward. > > > If the vdpu38x core differs, it may be reason enough to consider a new driver. > > > > > > As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. > > Well, it has its own driver, Hantro (which is not rkvdec). But maybe you could > extend on why you think VC9000D decoder have no place in the hantro/verisilicon > family ? > Oh good, then the AV1 core in RK3588 is actually a Verisilicon VC9000D core, I didn't know that. Maybe the naming in the driver should be vc9000? Or maybe it should be noted in comments and documentation. If that was already documented somewhere in this patchset, then I definitely missed it. > > > > > > Again, I'm far less worried for a little code duplication in the > > > boilerplate (which can be solved > > > with helpers, etc.) and more worried about making sure we can evolve > > > drivers easily, > > > while minimizing regressions. > > > > Thanks for the explanation. > > > > As I agree that not breaking current drivers is a strong argument. Also > > rkvdec is still in staging, which makes it less harmful for the > > integration of the encoder path. > > We are working on unstaging patches. > Rkvdec can be unstaged. Sebastian: I remember you were working on Rkvdec. If you want to unstage this driver now, and work on features later, I believe that would make a lot of sense! Thanks! Ezequiel > > > > Since we can not ensure that the rkvenc/rkvdec is not another unknown > > verisilicon core, going the way of working on a common rkvpu driver is > > probably the best for now. > > We can collectively share our knowledge (to the limit of our legal rights to > share) make the right call. In the case of this VC9000D decoder, there is a > massive amount of registers that aren't AV1 specific, and existed in VC8000 > cores as it, same offset, same size. Hantro designs have this very specific > style, which is to share register, giving it a meaning for multiple CODECs. > > I've commented about that in my review, but until we have more codecs support on > VC9000 cores, generalizing the register definition is premature. > > Though, an typical example of things that are Hantro specific and common to G1, > VC8000 and VC9000, is the handling of references for H.264 decoding. This > differs massively from how it works with rkvdec here. > > > > > Also, since I have already done some work into that direction, it sounds > > good for me. :) > > Great. For you interest, the modified Hantro H1 encoder is an information that > Rockchip disclosed to us directly. And that whys vepu121 (if my memory is right) > is implemented in Hantro driver. The register layout have been altered by RK but > that's all there is, it does share semantic (and a lot of code) with the "real" > H1 found on RK3288, IMX8M Mini and others. > > > > > > > > > I could also keep on integrating the rkvenc on that base instead. > > > > > > > > Regards, > > > > Michael > > > > > > > > > > The full branch can be found here: > > > > > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > > > > > > > > > > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > > > > > > The failing tests are: > > > > > > - 10bits bitstream because 10bits output formats aren't yet implemented. > > > > > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > > > > > > - tests with resolution < hardware limit (64x64) > > > > > > > > > > > > Benjamin > > > > > > > > > > > > Benjamin Gaignard (9): > > > > > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > > > > > > media: verisilicon: Add AV1 decoder mode and controls > > > > > > media: verisilicon: Save bit depth for AV1 decoder > > > > > > media: verisilicon: Check AV1 bitstreams bit depth > > > > > > media: verisilicon: Compute motion vectors size for AV1 frames > > > > > > media: verisilicon: Add AV1 entropy helpers > > > > > > media: verisilicon: Add Rockchip AV1 decoder > > > > > > media: verisilicon: Add film grain feature to AV1 driver > > > > > > media: verisilicon: Enable AV1 decoder on rk3588 > > > > > > > > > > > > .../bindings/media/rockchip-vpu.yaml | 1 + > > > > > > drivers/media/platform/verisilicon/Makefile | 3 + > > > > > > drivers/media/platform/verisilicon/hantro.h | 5 + > > > > > > .../media/platform/verisilicon/hantro_drv.c | 54 + > > > > > > .../media/platform/verisilicon/hantro_hw.h | 102 + > > > > > > .../platform/verisilicon/hantro_postproc.c | 3 + > > > > > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > > > > > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > > > > > > .../verisilicon/rockchip_av1_entropymode.h | 272 + > > > > > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > > > > > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > > > > > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > > > > > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > > > > > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > > > > > > 14 files changed, 8291 insertions(+) > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > > > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > > > > > > > > > > > > -- > > > > > > 2.34.1 > > > > > > > > > > > > > > > > _______________________________________________ > > > > > linux-arm-kernel mailing list > > > > > linux-arm-kernel@lists.infradead.org > > > > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > > > > > > > > > > > > -- > > > > Pengutronix e.K. | | > > > > Steuerwalder Str. 21 | http://www.pengutronix.de/ | > > > > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > > > > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > > > > > >
Le lundi 19 décembre 2022 à 18:07 -0300, Ezequiel Garcia a écrit : > Hi Benjamin, > > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > <benjamin.gaignard@collabora.com> wrote: > > > > This series implement AV1 stateless decoder for RK3588 SoC. > > The harware support 8 and 10 bits bitstreams up to 7680x4320. > > AV1 feature like film grain or scaling are done by the postprocessor. > > The driver can produce NV12_4L4 and NV12 pixel formats. > > A native 10bits NV12_4L4 format is possible but need more investigation > > to be completly documented and enabled. > > > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > > Sebastian's device-tree patches for RK3588. > > > > I thought the AV1 decoder in RK3588 was really a separate hardware > from the Hantro G1/G2. > > Shouldn't this need a new driver for this new hardware? As discussed on IRC, whenever we enable H.264 and HEVC on VC9000 cores, we will benefit from sharing some very specific code with the G1 and G2 (respectively). Though for now, there is no overlap as the single core on RK3588 have all other codecs disabled by fuse. > > Thanks! > Ezequiel > > > The full branch can be found here: > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 > > > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. > > The failing tests are: > > - 10bits bitstream because 10bits output formats aren't yet implemented. > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values > > - tests with resolution < hardware limit (64x64) > > > > Benjamin > > > > Benjamin Gaignard (9): > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible > > media: verisilicon: Add AV1 decoder mode and controls > > media: verisilicon: Save bit depth for AV1 decoder > > media: verisilicon: Check AV1 bitstreams bit depth > > media: verisilicon: Compute motion vectors size for AV1 frames > > media: verisilicon: Add AV1 entropy helpers > > media: verisilicon: Add Rockchip AV1 decoder > > media: verisilicon: Add film grain feature to AV1 driver > > media: verisilicon: Enable AV1 decoder on rk3588 > > > > .../bindings/media/rockchip-vpu.yaml | 1 + > > drivers/media/platform/verisilicon/Makefile | 3 + > > drivers/media/platform/verisilicon/hantro.h | 5 + > > .../media/platform/verisilicon/hantro_drv.c | 54 + > > .../media/platform/verisilicon/hantro_hw.h | 102 + > > .../platform/verisilicon/hantro_postproc.c | 3 + > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ > > .../verisilicon/rockchip_av1_entropymode.h | 272 + > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + > > 14 files changed, 8291 insertions(+) > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h > > > > -- > > 2.34.1 > >
On Tue, Dec 20, 2022 at 12:00:01PM -0500, Nicolas Dufresne wrote: >Le lundi 19 décembre 2022 à 22:54 +0100, Michael Grzeschik a écrit : >> Hi Benjamin, >> Hi Ezequiel, >> >> On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: >> > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard >> > <benjamin.gaignard@collabora.com> wrote: >> > > >> > > This series implement AV1 stateless decoder for RK3588 SoC. >> > > The harware support 8 and 10 bits bitstreams up to 7680x4320. >> > > AV1 feature like film grain or scaling are done by the postprocessor. >> > > The driver can produce NV12_4L4 and NV12 pixel formats. >> > > A native 10bits NV12_4L4 format is possible but need more investigation >> > > to be completly documented and enabled. >> > > >> > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and >> > > Sebastian's device-tree patches for RK3588. >> > > >> > >> > I thought the AV1 decoder in RK3588 was really a separate hardware >> > from the Hantro G1/G2. >> > >> > Shouldn't this need a new driver for this new hardware? >> >> Just jumping into this discussion as I am currently working on the rkvenc driver. >> >> In my case I am extending the rkvdec driver to become more generic for >> other rockchip specific enc/decoders. >> >> My first change looks like this: >> --- >> drivers/staging/media/rkvdec/Makefile | 4 +- >> drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- >> drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- >> drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- >> drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- >> --- >> >> While working on other parts of the encoder I found many places in the >> rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro >> functions but where limited to the decoder case. >> >> I think there are two options for the av1 codec. >> >> 1) If the vpu981 is a driver that has nothing to do with verisilicon but >> works with this driver framework, then we should integrate vepu981 into it >> but consider rename the verisilicon unrelated parts to something generic. > >I've raised in my review the the naming is sub-optimal. This is an unmodified >VC9000D AV1 decoder. No other codecs have been included in the package, even >though VC9000D cores can support more. > >Stating this driver have no place here seems a bit strange to me, but with >proper arguments, maybe we can make a case and start a VC9000D dedicated driver >(that will be a lot of copy paste, VC9000D post processor notably is identical >to VC8000 post processor, but one could argue we should make a VCX000 driver ? > >> >> 2) Move the vepu981 av1 driver into the rkvdec instead. > >That make no sense, its not a Rockchip HW design, and will likely start >appearing on non-RK SoC in the future. Sure. I did not know that it actually is an VC9000. >> If 1) is the way to go, we can even think of moving the staging code parts from >> rkvdec to the verisilicon code. Likewise to the vepu981-av1. > >Again, I think using RK naming is unfortunate choice. This AV1 decoder is just >like the G1/H1 combo you will find on RK3288. And that same combo is found on >many older SoC (actually even newer SoC un the VC8000Nano brand). > >Like all generation of Hantro chips, there is an optional dependency that can >exist between encoder and decoders. The question is if this requires a single >driver to maintain a valid state or not. So far, it seems devs have assume that >is it needed. > >p.s. fun fact, on most HW, the decoder rate is cut in half with running >concurrently with the encoder > >> >> I could also keep on integrating the rkvenc on that base instead. > >Do you know if there is any interaction between the encoder and decoder ? Shared >registers, shared internal cache ? That's basically what differentiate Hantro >here. Also, be aware that some folks are considering starting on RKVDEC2 driver, >are you looking at RK32/33 series ? or more RK35 ? I don't know of any limitations or interactions between the encoder and decoder. I know that the rkvdec is implementing the register space of the mpp called vdpu34x. My work would adress the vepu54x encoder registers. Which can be found on rk3588 (vepu541) and rk3568/r3566 (vepu540). AFAIK the vepu541 and vepu540 are very similar. The vepu540 is limited by 4k and vepu541 can handle 8k h264. However how the vepu541 is interacting with the vdpu34x needs to be found out. Also I did not find any common parts in the mpp implementation yet. >> > > The full branch can be found here: >> > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 >> > > >> > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. >> > > The failing tests are: >> > > - 10bits bitstream because 10bits output formats aren't yet implemented. >> > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values >> > > - tests with resolution < hardware limit (64x64) >> > > >> > > Benjamin >> > > >> > > Benjamin Gaignard (9): >> > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible >> > > media: verisilicon: Add AV1 decoder mode and controls >> > > media: verisilicon: Save bit depth for AV1 decoder >> > > media: verisilicon: Check AV1 bitstreams bit depth >> > > media: verisilicon: Compute motion vectors size for AV1 frames >> > > media: verisilicon: Add AV1 entropy helpers >> > > media: verisilicon: Add Rockchip AV1 decoder >> > > media: verisilicon: Add film grain feature to AV1 driver >> > > media: verisilicon: Enable AV1 decoder on rk3588 >> > > >> > > .../bindings/media/rockchip-vpu.yaml | 1 + >> > > drivers/media/platform/verisilicon/Makefile | 3 + >> > > drivers/media/platform/verisilicon/hantro.h | 5 + >> > > .../media/platform/verisilicon/hantro_drv.c | 54 + >> > > .../media/platform/verisilicon/hantro_hw.h | 102 + >> > > .../platform/verisilicon/hantro_postproc.c | 3 + >> > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + >> > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ >> > > .../verisilicon/rockchip_av1_entropymode.h | 272 + >> > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ >> > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + >> > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ >> > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ >> > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + >> > > 14 files changed, 8291 insertions(+) >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c >> > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >> > > >> > > -- >> > > 2.34.1 >> > > >> > >> > _______________________________________________ >> > linux-arm-kernel mailing list >> > linux-arm-kernel@lists.infradead.org >> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> > >> > >
On Tue, Dec 20, 2022 at 12:15:20PM -0500, Nicolas Dufresne wrote: >Le mardi 20 décembre 2022 à 14:40 +0100, Michael Grzeschik a écrit : >> Hi Ezequiel, >> >> On Mon, Dec 19, 2022 at 10:52:02PM -0300, Ezequiel Garcia wrote: >> > On Mon, Dec 19, 2022 at 6:54 PM Michael Grzeschik <mgr@pengutronix.de> wrote: >> > > On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: >> > > > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard >> > > > <benjamin.gaignard@collabora.com> wrote: >> > > > > >> > > > > This series implement AV1 stateless decoder for RK3588 SoC. >> > > > > The harware support 8 and 10 bits bitstreams up to 7680x4320. >> > > > > AV1 feature like film grain or scaling are done by the postprocessor. >> > > > > The driver can produce NV12_4L4 and NV12 pixel formats. >> > > > > A native 10bits NV12_4L4 format is possible but need more investigation >> > > > > to be completly documented and enabled. >> > > > > >> > > > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and >> > > > > Sebastian's device-tree patches for RK3588. >> > > > > >> > > > >> > > > I thought the AV1 decoder in RK3588 was really a separate hardware >> > > > from the Hantro G1/G2. >> > > > >> > > > Shouldn't this need a new driver for this new hardware? >> > > >> > > Just jumping into this discussion as I am currently working on the rkvenc driver. >> > > >> > >> > The more the merrier, there's always room for developers :-) >> > >> > > In my case I am extending the rkvdec driver to become more generic for >> > > other rockchip specific enc/decoders. >> > > >> > > My first change looks like this: >> > > --- >> > > drivers/staging/media/rkvdec/Makefile | 4 +- >> > > drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- >> > > drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- >> > > drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- >> > > drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- >> > > --- >> > > >> > > While working on other parts of the encoder I found many places in the >> > > rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro >> > > functions but where limited to the decoder case. >> > > >> > >> > Because stateless decoders devices are very similar in their general behavior, >> > their drivers could be very similar. >> > >> > Hantro and Rkvdec could look similar because the same humans worked on them. >> > >> > Most boilerplate code, as well as V4L2 format negotiation, VB2 buffer handling >> > could be shared among all stateless decoder drivers. I think even at one point >> > we experimented with having a shared/common code base for all stateless codecs. >> > >> > In other words, it's entirely possible to support Hantro devices in >> > the Cedrus driver >> > and vice-versa, you would only have to write the hardware-specific bits. >> > >> > However, there is consensus to have a separate driver for each >> > different hardware, >> > even when the hardware is a bit similar. This may lead to some code duplication, >> > but it's less fragile / more flexible. Maintaining drivers this way allows >> > developers to evolve, testing on a small family of devices, without >> > breaking support >> > for other devices. >> > >> > This is important as sometimes it's hard to get the hardware, >> > but we still don't want to break the support! >> > >> > > I think there are two options for the av1 codec. >> > > >> > > 1) If the vpu981 is a driver that has nothing to do with verisilicon but >> > > works with this driver framework, then we should integrate vepu981 into it >> > > but consider rename the verisilicon unrelated parts to something generic. >> > > >> > > 2) Move the vepu981 av1 driver into the rkvdec instead. >> > > >> > > If 1) is the way to go, we can even think of moving the staging code parts from >> > > rkvdec to the verisilicon code. Likewise to the vepu981-av1. >> > > >> > >> > The Hantro driver should only support G1, G2, and VC8000D; >> > which can be said to belong to the same family. >> > >> > The RKVDEC driver supports Rockchip vdpu34x core. I have to admit >> > I'm not exactly sure if we support anything else than vdpu34x. >> >> Currently the rkvdec is only supporting vdpu34x. My work would integrate >> vepu54x into the rkvdec boilerplate and so it would support encode as decode. > >Which CODEC do you currently work on ? We are about to send a first RFC for a >VP8 stateless encoder API (with a rk3399 driver to test), but haven't written >the Stateless Encoder API spec yet, so still some work there. And was planning >to make an H.264 Sateless Encoder soon. Would be nice to avoid duplicating the >effort. As mentioned in the other Mail. I am working on the vepu54x core, which can be found on the rk35 chips. The H.264 Stateless API it is currently based on is comming from the bootlin stack that is floating around since some time. https://git.pengutronix.de/cgit/mgr/linux/commit/?h=v5.19/topic/rk3568-vepu-h264-stateless-bootlin&id=ec2b92670100c6bd075ca859bc3392b5b913be27 The STATELESS controlls are not yet final. And with your future implementation of a second h264 encoder we will have to find a common definition. For me now it is good enough to get started with the first steps of encoding some early frames and get to know the hardware better. My first goal is to get the driver perform good enough to run the bootlin application against it and get a h264 stream. https://github.com/bootlin/v4l2-hantro-h264-encoder >> > I'm not familiar with the AV1 support provided by this patch, >> > but looking at the mpp code: >> > >> > ... >> > "rk3588", >> > ROCKCHIP_SOC_RK3588, >> > HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | >> > HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, >> > { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, >> > { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, >> > >> > Seems RK3588 supports a Hantro core (VDPU2), a vdpu38x core and this AV1 core, >> > which according to this patchset is vdpu981 (?) >> > >> > If the vdpu38x device interface, configuration, buffer handling and >> > registers are >> > similar enough with vdpu34x, adding vdpu38x to the Rkvdec driver >> > should be straightforward. >> > If the vdpu38x core differs, it may be reason enough to consider a new driver. >> > >> > As for vdpu981 (AV1), I'm inclined to think it deserves its own driver. > >Well, it has its own driver, Hantro (which is not rkvdec). But maybe you could >extend on why you think VC9000D decoder have no place in the hantro/verisilicon >family ? > >> > >> > Again, I'm far less worried for a little code duplication in the >> > boilerplate (which can be solved >> > with helpers, etc.) and more worried about making sure we can evolve >> > drivers easily, >> > while minimizing regressions. >> >> Thanks for the explanation. >> >> As I agree that not breaking current drivers is a strong argument. Also >> rkvdec is still in staging, which makes it less harmful for the >> integration of the encoder path. > >We are working on unstaging patches. > >> >> Since we can not ensure that the rkvenc/rkvdec is not another unknown >> verisilicon core, going the way of working on a common rkvpu driver is >> probably the best for now. > >We can collectively share our knowledge (to the limit of our legal rights to >share) make the right call. In the case of this VC9000D decoder, there is a >massive amount of registers that aren't AV1 specific, and existed in VC8000 >cores as it, same offset, same size. Hantro designs have this very specific >style, which is to share register, giving it a meaning for multiple CODECs. > >I've commented about that in my review, but until we have more codecs support on >VC9000 cores, generalizing the register definition is premature. > >Though, an typical example of things that are Hantro specific and common to G1, >VC8000 and VC9000, is the handling of references for H.264 decoding. This >differs massively from how it works with rkvdec here. > >> >> Also, since I have already done some work into that direction, it sounds >> good for me. :) > >Great. For you interest, the modified Hantro H1 encoder is an information that >Rockchip disclosed to us directly. And that whys vepu121 (if my memory is right) >is implemented in Hantro driver. The register layout have been altered by RK but >that's all there is, it does share semantic (and a lot of code) with the "real" >H1 found on RK3288, IMX8M Mini and others. Good to know! After asking at Rockchip some time ago. They ensured us that the vepu54x core is something rockchip specific. We will live with that. I hope that we can find everything necessary for implementing the rkvenc mainline driver based on the mpp stack and the datasheets that are freely available. However it is possible that we could run into limitations here in the future. >> > > I could also keep on integrating the rkvenc on that base instead. >> > > >> > > Regards, >> > > Michael >> > > >> > > > > The full branch can be found here: >> > > > > https://gitlab.collabora.com/linux/for-upstream/-/commits/rk3588_av1_decoder_v1 >> > > > > >> > > > > Fluster score is: 151/239 while testing AV1-TEST-VECTORS with GStreamer-AV1-V4L2SL-Gst1.0. >> > > > > The failing tests are: >> > > > > - 10bits bitstream because 10bits output formats aren't yet implemented. >> > > > > - the 2 tests with 2 spatial layers: few errors in luma/chroma values >> > > > > - tests with resolution < hardware limit (64x64) >> > > > > >> > > > > Benjamin >> > > > > >> > > > > Benjamin Gaignard (9): >> > > > > dt-bindings: media: rockchip-vpu: Add rk3588 vpu compatible >> > > > > media: verisilicon: Add AV1 decoder mode and controls >> > > > > media: verisilicon: Save bit depth for AV1 decoder >> > > > > media: verisilicon: Check AV1 bitstreams bit depth >> > > > > media: verisilicon: Compute motion vectors size for AV1 frames >> > > > > media: verisilicon: Add AV1 entropy helpers >> > > > > media: verisilicon: Add Rockchip AV1 decoder >> > > > > media: verisilicon: Add film grain feature to AV1 driver >> > > > > media: verisilicon: Enable AV1 decoder on rk3588 >> > > > > >> > > > > .../bindings/media/rockchip-vpu.yaml | 1 + >> > > > > drivers/media/platform/verisilicon/Makefile | 3 + >> > > > > drivers/media/platform/verisilicon/hantro.h | 5 + >> > > > > .../media/platform/verisilicon/hantro_drv.c | 54 + >> > > > > .../media/platform/verisilicon/hantro_hw.h | 102 + >> > > > > .../platform/verisilicon/hantro_postproc.c | 3 + >> > > > > .../media/platform/verisilicon/hantro_v4l2.c | 5 + >> > > > > .../verisilicon/rockchip_av1_entropymode.c | 4536 +++++++++++++++++ >> > > > > .../verisilicon/rockchip_av1_entropymode.h | 272 + >> > > > > .../verisilicon/rockchip_av1_filmgrain.c | 401 ++ >> > > > > .../verisilicon/rockchip_av1_filmgrain.h | 36 + >> > > > > .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 2280 +++++++++ >> > > > > .../verisilicon/rockchip_vpu981_regs.h | 477 ++ >> > > > > .../platform/verisilicon/rockchip_vpu_hw.c | 116 + >> > > > > 14 files changed, 8291 insertions(+) >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.c >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_entropymode.h >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.c >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_av1_filmgrain.h >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_hw_av1_dec.c >> > > > > create mode 100644 drivers/media/platform/verisilicon/rockchip_vpu981_regs.h >> > > > > >> > > > > -- >> > > > > 2.34.1 >> > > > > >> > > > >> > > > _______________________________________________ >> > > > linux-arm-kernel mailing list >> > > > linux-arm-kernel@lists.infradead.org >> > > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> > > > >> > > >> > > -- >> > > Pengutronix e.K. | | >> > > Steuerwalder Str. 21 | http://www.pengutronix.de/ | >> > > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | >> > > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | >> > >> > >
Hi Nicolas, Michael, (+Andrzej) El mié, 21 dic. 2022 19:01, Michael Grzeschik <mgr@pengutronix.de> escribió: > > On Tue, Dec 20, 2022 at 12:00:01PM -0500, Nicolas Dufresne wrote: > >Le lundi 19 décembre 2022 à 22:54 +0100, Michael Grzeschik a écrit : > >> Hi Benjamin, > >> Hi Ezequiel, > >> > >> On Mon, Dec 19, 2022 at 06:07:38PM -0300, Ezequiel Garcia wrote: > >> > On Mon, Dec 19, 2022 at 12:56 PM Benjamin Gaignard > >> > <benjamin.gaignard@collabora.com> wrote: > >> > > > >> > > This series implement AV1 stateless decoder for RK3588 SoC. > >> > > The harware support 8 and 10 bits bitstreams up to 7680x4320. > >> > > AV1 feature like film grain or scaling are done by the postprocessor. > >> > > The driver can produce NV12_4L4 and NV12 pixel formats. > >> > > A native 10bits NV12_4L4 format is possible but need more investigation > >> > > to be completly documented and enabled. > >> > > > >> > > It is based on Daniel's "[RFC,v3] media: Add AV1 uAPI" [1] patches and > >> > > Sebastian's device-tree patches for RK3588. > >> > > > >> > > >> > I thought the AV1 decoder in RK3588 was really a separate hardware > >> > from the Hantro G1/G2. > >> > > >> > Shouldn't this need a new driver for this new hardware? > >> > >> Just jumping into this discussion as I am currently working on the rkvenc driver. > >> > >> In my case I am extending the rkvdec driver to become more generic for > >> other rockchip specific enc/decoders. > >> > >> My first change looks like this: > >> --- > >> drivers/staging/media/rkvdec/Makefile | 4 +- > >> drivers/staging/media/rkvdec/rkvdec-h264.c | 100 ++++----- > >> drivers/staging/media/rkvdec/rkvdec-vp9.c | 142 ++++++------- > >> drivers/staging/media/rkvdec/{rkvdec.c => rkvpu.c} | 510 +++++++++++++++++++++++----------------------- > >> drivers/staging/media/rkvdec/{rkvdec.h => rkvpu.h} | 66 +++--- > >> --- > >> > >> While working on other parts of the encoder I found many places in the > >> rkvdec driver (e.g. v4l2 and vb2 callbacks) that looked familiar to the hantro > >> functions but where limited to the decoder case. > >> > >> I think there are two options for the av1 codec. > >> > >> 1) If the vpu981 is a driver that has nothing to do with verisilicon but > >> works with this driver framework, then we should integrate vepu981 into it > >> but consider rename the verisilicon unrelated parts to something generic. > > > >I've raised in my review the the naming is sub-optimal. This is an unmodified > >VC9000D AV1 decoder. No other codecs have been included in the package, even > >though VC9000D cores can support more. > > > >Stating this driver have no place here seems a bit strange to me, but with > >proper arguments, maybe we can make a case and start a VC9000D dedicated driver > >(that will be a lot of copy paste, VC9000D post processor notably is identical > >to VC8000 post processor, but one could argue we should make a VCX000 driver ? > > > >> > >> 2) Move the vepu981 av1 driver into the rkvdec instead. > > > >That make no sense, its not a Rockchip HW design, and will likely start > >appearing on non-RK SoC in the future. > > Sure. I did not know that it actually is an VC9000. > > >> If 1) is the way to go, we can even think of moving the staging code parts from > >> rkvdec to the verisilicon code. Likewise to the vepu981-av1. > > > >Again, I think using RK naming is unfortunate choice. This AV1 decoder is just > >like the G1/H1 combo you will find on RK3288. And that same combo is found on > >many older SoC (actually even newer SoC un the VC8000Nano brand). > > > >Like all generation of Hantro chips, there is an optional dependency that can > >exist between encoder and decoders. The question is if this requires a single > >driver to maintain a valid state or not. So far, it seems devs have assume that > >is it needed. > > > >p.s. fun fact, on most HW, the decoder rate is cut in half with running > >concurrently with the encoder > > > >> > >> I could also keep on integrating the rkvenc on that base instead. > > > >Do you know if there is any interaction between the encoder and decoder ? Shared > >registers, shared internal cache ? That's basically what differentiate Hantro > >here. Also, be aware that some folks are considering starting on RKVDEC2 driver, > >are you looking at RK32/33 series ? or more RK35 ? > > I don't know of any limitations or interactions between the encoder and > decoder. I believe we should explore separate drivers, and if there is any interaction, try to model the shared piece through a shared block in the device tree. In most cases, the decoder and encoder are separate blocks. Also, the V4L2 stateless decoder interface covers only decoding. Supporting both in the same driver has been painful, especially the V4L2 negotiation, is hard to support for both encoders and decoders, and has led to many bugs (and even worse, regressions) in the drivers. Thanks, Ezequiel