From: Detlev Casanova <detlev.casanova@collabora.com>
To: linux-kernel@vger.kernel.org, Alex Bee <knaerzche@gmail.com>
Cc: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Heiko Stuebner <heiko@sntech.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sebastian Reichel <sebastian.reichel@collabora.com>,
Dragan Simic <dsimic@manjaro.org>,
Diederik de Haas <didi.debian@cknow.org>,
Andy Yan <andy.yan@rock-chips.com>,
Boris Brezillon <boris.brezillon@collabora.com>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
Daniel Almeida <daniel.almeida@collabora.com>,
Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Nicolas Dufresne <nicolas.dufresne@collabora.com>,
Benjamin Gaignard <benjamin.gaignard@collabora.com>,
Jonas Karlman <jonas@kwiboo.se>,
linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-staging@lists.linux.dev
Subject: Re: [PATCH v3 2/4] media: rockchip: Introduce the rkvdec2 driver
Date: Tue, 25 Jun 2024 12:56:24 -0400 [thread overview]
Message-ID: <3815203.kQq0lBPeGt@arisu> (raw)
In-Reply-To: <c7882f94-e2cb-4023-a53e-87ebc8fa3460@gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 6103 bytes --]
Hi Alex,
On Sunday, June 23, 2024 5:33:28 A.M. EDT you wrote:
> Hi Detlev,
>
> Am 20.06.24 um 16:19 schrieb Detlev Casanova:
> > This driver supports the second generation of the Rockchip Video
> > decoder, also known as vdpu34x.
> > It is currently only used on the RK3588(s) SoC.
> >
> > There are 2 decoders on the RK3588 SoC that can work in pair to decode
> > 8K video at 30 FPS but currently, only using one core at a time is
> > supported.
> >
> > Scheduling requests between the two cores will be implemented later.
> >
> > The core supports H264, HEVC, VP9 and AVS2 decoding but this driver
> > currently only supports H264.
> >
> > The driver is based on rkvdec and they may share some code in the
> > future.
> > The decision to make a different driver is mainly because rkvdec2 has
> > more features and can work with multiple cores.
> >
> > The registers are mapped in a struct in RAM using bitfields. It is IO
> > copied to the HW when all values are configured.
> > The decision to use such a struct instead of writing buffers one by one
> >
> > is based on the following reasons:
> > - Rockchip cores are known to misbehave when registers are not written
> >
> > in address order,
> >
> > - Those cores also need the software to write all registers, even if
> >
> > they are written their default values or are not related to the task
> > (this core will not start decoding some H264 frames if some VP9
> > registers are not written to 0)
> >
> > - In the future, to support multiple cores, the scheduler could be
> >
> > optimized by storing the precomputed registers values and copy them
> > to the HW as soos as a core becomes available.
> >
> > This makes the code more readable and may bring performance improvements
> > in future features.
> >
> > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
> > ---
> >
> > drivers/staging/media/Kconfig | 1 +
> > drivers/staging/media/Makefile | 1 +
> > drivers/staging/media/rkvdec2/Kconfig | 15 +
> > drivers/staging/media/rkvdec2/Makefile | 3 +
> > drivers/staging/media/rkvdec2/TODO | 9 +
> > drivers/staging/media/rkvdec2/rkvdec2-h264.c | 739 +++++++++++
> > drivers/staging/media/rkvdec2/rkvdec2-regs.h | 345 +++++
> > drivers/staging/media/rkvdec2/rkvdec2.c | 1253 ++++++++++++++++++
> > drivers/staging/media/rkvdec2/rkvdec2.h | 130 ++
> > 9 files changed, 2496 insertions(+)
> > create mode 100644 drivers/staging/media/rkvdec2/Kconfig
> > create mode 100644 drivers/staging/media/rkvdec2/Makefile
> > create mode 100644 drivers/staging/media/rkvdec2/TODO
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2-h264.c
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2-regs.h
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2.c
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2.h
>
> ...
>
> > +static inline void rkvdec2_memcpy_toio(void __iomem *dst, void *src,
> > size_t len) +{
> > +#ifdef CONFIG_ARM64
> > + __iowrite32_copy(dst, src, len);
> > +#elif defined(CONFIG_ARM)
>
> I guess that can get an "#else" since memcpy_toio exists for all archs.
>
> > + memcpy_toio(dst, src, len);
> > +#endif
> > +}
> > +
>
> ...
>
> > + /* Set timeout threshold */
> > + if (pixels < RKVDEC2_1080P_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_1080p;
> > + else if (pixels < RKVDEC2_4K_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_4K;
> > + else if (pixels < RKVDEC2_8K_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_8K;
> > +
>
> Did you test if it works with anything > 8K? If so, you propably want to
> make the check above
>
> + else
> + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_8K;
>
> Otherwise the timeout may not be set/contain invalid values from any former
> stream.
That's right, but it would be set to 0 because of the memset.
RKVDEC2_TIMEOUT_8K might not be enough for bigger frame sizes, so I'll set it
to the maximum value (0xffffffff) when frames are bigger than 8K and also adapt
the watchdog time: RKVDEC2_TIMEOUT_8K is around 100 ms, but 0xffffffff is arnoud
5.3 seconds (reg032/axi_clock_freq)
I'll do more tests with this as well.
> ...
>
> > +
> > +static const struct rkvdec2_coded_fmt_desc rkvdec2_coded_fmts[] = {
> > + {
> > + .fourcc = V4L2_PIX_FMT_H264_SLICE,
> > + .frmsize = {
> > + .min_width = 16,
> > + .max_width = 65520,
> > + .step_width = 16,
> > + .min_height = 16,
> > + .max_height = 65520,
> > + .step_height = 16,
> > + },
> > + .ctrls = &rkvdec2_h264_ctrls,
> > + .ops = &rkvdec2_h264_fmt_ops,
> > + .num_decoded_fmts =
ARRAY_SIZE(rkvdec2_h264_decoded_fmts),
> > + .decoded_fmts = rkvdec2_h264_decoded_fmts,
> > + .subsystem_flags =
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF,
> > + },
> > +};
> > +
>
> Note, that this is also given to userspace (VIDIOC_ENUM_FRAMESIZES) and
> this is already incorrect in the old rkvdec driver (and hantro): From
> userspace perspective we do not have a restriction in
> step_width/step_width, as we are aligning any given width/height to HW
> requirements in the driver - what we should give to userspace is
> fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS; fsize->stepwise.min_height =
> 1; fsize->stepwise.min_width = 1; fsize->stepwise.max_height = 65520;
> fsize->stepwise.max_width = 65520;
Is fsize->stepwise.min_height = 1; and fsize->stepwise.min_width = 1 correct ?
Or do you mean fsize->stepwise.step_height = 1; and fsize->stepwise.setp_width
= 1 ?
It would give this instead:
.frmsize = {
.min_width = 16,
.max_width = 65520,
.step_width = 1,
.min_height = 16,
.max_height = 65520,
.step_height = 1,
},
and .vidioc_enum_framesizes sets fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
> I guess this new driver should be an
> opportunity to fix that and distinguish between internal and external
> frame size requirements and the .vidioc_enum_framesizes callback should
> adapted accordingly. Regards, Alex
Detlev.
[-- Attachment #1.2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 170 bytes --]
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: Detlev Casanova <detlev.casanova@collabora.com>
To: linux-kernel@vger.kernel.org, Alex Bee <knaerzche@gmail.com>
Cc: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Heiko Stuebner <heiko@sntech.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sebastian Reichel <sebastian.reichel@collabora.com>,
Dragan Simic <dsimic@manjaro.org>,
Diederik de Haas <didi.debian@cknow.org>,
Andy Yan <andy.yan@rock-chips.com>,
Boris Brezillon <boris.brezillon@collabora.com>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
Daniel Almeida <daniel.almeida@collabora.com>,
Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Nicolas Dufresne <nicolas.dufresne@collabora.com>,
Benjamin Gaignard <benjamin.gaignard@collabora.com>,
Jonas Karlman <jonas@kwiboo.se>,
linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-staging@lists.linux.dev
Subject: Re: [PATCH v3 2/4] media: rockchip: Introduce the rkvdec2 driver
Date: Tue, 25 Jun 2024 12:56:24 -0400 [thread overview]
Message-ID: <3815203.kQq0lBPeGt@arisu> (raw)
In-Reply-To: <c7882f94-e2cb-4023-a53e-87ebc8fa3460@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 6103 bytes --]
Hi Alex,
On Sunday, June 23, 2024 5:33:28 A.M. EDT you wrote:
> Hi Detlev,
>
> Am 20.06.24 um 16:19 schrieb Detlev Casanova:
> > This driver supports the second generation of the Rockchip Video
> > decoder, also known as vdpu34x.
> > It is currently only used on the RK3588(s) SoC.
> >
> > There are 2 decoders on the RK3588 SoC that can work in pair to decode
> > 8K video at 30 FPS but currently, only using one core at a time is
> > supported.
> >
> > Scheduling requests between the two cores will be implemented later.
> >
> > The core supports H264, HEVC, VP9 and AVS2 decoding but this driver
> > currently only supports H264.
> >
> > The driver is based on rkvdec and they may share some code in the
> > future.
> > The decision to make a different driver is mainly because rkvdec2 has
> > more features and can work with multiple cores.
> >
> > The registers are mapped in a struct in RAM using bitfields. It is IO
> > copied to the HW when all values are configured.
> > The decision to use such a struct instead of writing buffers one by one
> >
> > is based on the following reasons:
> > - Rockchip cores are known to misbehave when registers are not written
> >
> > in address order,
> >
> > - Those cores also need the software to write all registers, even if
> >
> > they are written their default values or are not related to the task
> > (this core will not start decoding some H264 frames if some VP9
> > registers are not written to 0)
> >
> > - In the future, to support multiple cores, the scheduler could be
> >
> > optimized by storing the precomputed registers values and copy them
> > to the HW as soos as a core becomes available.
> >
> > This makes the code more readable and may bring performance improvements
> > in future features.
> >
> > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
> > ---
> >
> > drivers/staging/media/Kconfig | 1 +
> > drivers/staging/media/Makefile | 1 +
> > drivers/staging/media/rkvdec2/Kconfig | 15 +
> > drivers/staging/media/rkvdec2/Makefile | 3 +
> > drivers/staging/media/rkvdec2/TODO | 9 +
> > drivers/staging/media/rkvdec2/rkvdec2-h264.c | 739 +++++++++++
> > drivers/staging/media/rkvdec2/rkvdec2-regs.h | 345 +++++
> > drivers/staging/media/rkvdec2/rkvdec2.c | 1253 ++++++++++++++++++
> > drivers/staging/media/rkvdec2/rkvdec2.h | 130 ++
> > 9 files changed, 2496 insertions(+)
> > create mode 100644 drivers/staging/media/rkvdec2/Kconfig
> > create mode 100644 drivers/staging/media/rkvdec2/Makefile
> > create mode 100644 drivers/staging/media/rkvdec2/TODO
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2-h264.c
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2-regs.h
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2.c
> > create mode 100644 drivers/staging/media/rkvdec2/rkvdec2.h
>
> ...
>
> > +static inline void rkvdec2_memcpy_toio(void __iomem *dst, void *src,
> > size_t len) +{
> > +#ifdef CONFIG_ARM64
> > + __iowrite32_copy(dst, src, len);
> > +#elif defined(CONFIG_ARM)
>
> I guess that can get an "#else" since memcpy_toio exists for all archs.
>
> > + memcpy_toio(dst, src, len);
> > +#endif
> > +}
> > +
>
> ...
>
> > + /* Set timeout threshold */
> > + if (pixels < RKVDEC2_1080P_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_1080p;
> > + else if (pixels < RKVDEC2_4K_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_4K;
> > + else if (pixels < RKVDEC2_8K_PIXELS)
> > + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_8K;
> > +
>
> Did you test if it works with anything > 8K? If so, you propably want to
> make the check above
>
> + else
> + regs->common.timeout_threshold = RKVDEC2_TIMEOUT_8K;
>
> Otherwise the timeout may not be set/contain invalid values from any former
> stream.
That's right, but it would be set to 0 because of the memset.
RKVDEC2_TIMEOUT_8K might not be enough for bigger frame sizes, so I'll set it
to the maximum value (0xffffffff) when frames are bigger than 8K and also adapt
the watchdog time: RKVDEC2_TIMEOUT_8K is around 100 ms, but 0xffffffff is arnoud
5.3 seconds (reg032/axi_clock_freq)
I'll do more tests with this as well.
> ...
>
> > +
> > +static const struct rkvdec2_coded_fmt_desc rkvdec2_coded_fmts[] = {
> > + {
> > + .fourcc = V4L2_PIX_FMT_H264_SLICE,
> > + .frmsize = {
> > + .min_width = 16,
> > + .max_width = 65520,
> > + .step_width = 16,
> > + .min_height = 16,
> > + .max_height = 65520,
> > + .step_height = 16,
> > + },
> > + .ctrls = &rkvdec2_h264_ctrls,
> > + .ops = &rkvdec2_h264_fmt_ops,
> > + .num_decoded_fmts =
ARRAY_SIZE(rkvdec2_h264_decoded_fmts),
> > + .decoded_fmts = rkvdec2_h264_decoded_fmts,
> > + .subsystem_flags =
VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF,
> > + },
> > +};
> > +
>
> Note, that this is also given to userspace (VIDIOC_ENUM_FRAMESIZES) and
> this is already incorrect in the old rkvdec driver (and hantro): From
> userspace perspective we do not have a restriction in
> step_width/step_width, as we are aligning any given width/height to HW
> requirements in the driver - what we should give to userspace is
> fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS; fsize->stepwise.min_height =
> 1; fsize->stepwise.min_width = 1; fsize->stepwise.max_height = 65520;
> fsize->stepwise.max_width = 65520;
Is fsize->stepwise.min_height = 1; and fsize->stepwise.min_width = 1 correct ?
Or do you mean fsize->stepwise.step_height = 1; and fsize->stepwise.setp_width
= 1 ?
It would give this instead:
.frmsize = {
.min_width = 16,
.max_width = 65520,
.step_width = 1,
.min_height = 16,
.max_height = 65520,
.step_height = 1,
},
and .vidioc_enum_framesizes sets fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
> I guess this new driver should be an
> opportunity to fix that and distinguish between internal and external
> frame size requirements and the .vidioc_enum_framesizes callback should
> adapted accordingly. Regards, Alex
Detlev.
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2024-06-25 16:57 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-20 14:19 [PATCH v3 0/4] media: rockchip: Add rkvdec2 driver Detlev Casanova
2024-06-20 14:19 ` Detlev Casanova
2024-06-20 14:19 ` [PATCH v3 1/4] media: rockchip: Move H264 CABAC table to header file Detlev Casanova
2024-06-20 14:19 ` Detlev Casanova
2024-06-20 14:19 ` [PATCH v3 2/4] media: rockchip: Introduce the rkvdec2 driver Detlev Casanova
2024-06-20 14:19 ` Detlev Casanova
2024-06-21 8:20 ` Jonas Karlman
2024-06-21 8:20 ` Jonas Karlman
2024-06-23 9:33 ` Alex Bee
2024-06-23 9:33 ` Alex Bee
2024-06-25 16:56 ` Detlev Casanova [this message]
2024-06-25 16:56 ` Detlev Casanova
2024-06-26 9:12 ` Alex Bee
2024-06-26 9:12 ` Alex Bee
2024-06-27 9:41 ` Jonas Karlman
2024-06-27 9:41 ` Jonas Karlman
2024-06-27 11:10 ` Alex Bee
2024-06-27 11:10 ` Alex Bee
2024-06-20 14:19 ` [PATCH v3 3/4] media: dt-bindings: rockchip: Document RK3588 Video Decoder bindings Detlev Casanova
2024-06-20 14:19 ` Detlev Casanova
2024-06-20 16:01 ` Conor Dooley
2024-06-20 16:01 ` Conor Dooley
2024-06-20 14:19 ` [PATCH v3 4/4] arm64: dts: rockchip: Add rkvdec2 Video Decoder on rk3588(s) Detlev Casanova
2024-06-20 14:19 ` Detlev Casanova
2024-06-20 15:00 ` Jonas Karlman
2024-06-20 15:00 ` Jonas Karlman
2024-06-25 17:40 ` Detlev Casanova
2024-06-25 17:40 ` Detlev Casanova
2024-06-27 9:50 ` Jonas Karlman
2024-06-27 9:50 ` Jonas Karlman
2024-06-21 8:07 ` Jonas Karlman
2024-06-21 8:07 ` Jonas Karlman
2024-06-26 9:29 ` Jianfeng Liu
2024-06-26 9:29 ` Jianfeng Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3815203.kQq0lBPeGt@arisu \
--to=detlev.casanova@collabora.com \
--cc=andy.yan@rock-chips.com \
--cc=benjamin.gaignard@collabora.com \
--cc=boris.brezillon@collabora.com \
--cc=conor+dt@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=devicetree@vger.kernel.org \
--cc=didi.debian@cknow.org \
--cc=dsimic@manjaro.org \
--cc=ezequiel@vanguardiasur.com.ar \
--cc=gregkh@linuxfoundation.org \
--cc=heiko@sntech.de \
--cc=hverkuil-cisco@xs4all.nl \
--cc=jonas@kwiboo.se \
--cc=knaerzche@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-staging@lists.linux.dev \
--cc=mchehab@kernel.org \
--cc=nicolas.dufresne@collabora.com \
--cc=paul.kocialkowski@bootlin.com \
--cc=robh@kernel.org \
--cc=sebastian.reichel@collabora.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.