Thread (33 messages) 33 messages, 5 authors, 2018-08-08

Re: [linux-sunxi] [PATCH v6 4/8] media: platform: Add Cedrus VPU decoder driver

From: Tomasz Figa <tfiga@chromium.org>
Date: 2018-08-07 15:11:17
Also in: linux-arm-kernel, linux-media, lkml

On Wed, Aug 8, 2018 at 12:05 AM Jernej Škrabec [off-list ref] wrote:
Dne torek, 07. avgust 2018 ob 14:31:03 CEST je Paul Kocialkowski napisal(a):
quoted
Hi,

On Fri, 2018-07-27 at 16:58 +0200, Jernej Škrabec wrote:
quoted
Dne petek, 27. julij 2018 ob 16:03:41 CEST je Jernej Škrabec napisal(a):
quoted
Hi!

Dne sreda, 25. julij 2018 ob 12:02:52 CEST je Paul Kocialkowski
napisal(a):
quoted
quoted
quoted
quoted
This introduces the Cedrus VPU driver that supports the VPU found in
Allwinner SoCs, also known as Video Engine. It is implemented through
a v4l2 m2m decoder device and a media device (used for media
requests).
So far, it only supports MPEG2 decoding.

Since this VPU is stateless, synchronization with media requests is
required in order to ensure consistency between frame headers that
contain metadata about the frame to process and the raw slice data
that
is used to generate the frame.

This driver was made possible thanks to the long-standing effort
carried out by the linux-sunxi community in the interest of reverse
engineering, documenting and implementing support for Allwinner VPU.

Signed-off-by: Paul Kocialkowski <redacted>
---
<snip>
quoted
+void cedrus_dst_format_set(struct cedrus_dev *dev,
+                          struct v4l2_pix_format_mplane *fmt)
+{
+       unsigned int width = fmt->width;
+       unsigned int height = fmt->height;
+       u32 chroma_size;
+       u32 reg;
+
+       switch (fmt->pixelformat) {
+       case V4L2_PIX_FMT_NV12:
+               chroma_size = ALIGN(width, 32) * ALIGN(height / 2, 32);
After some testing, it turns out that right aligment for untiled format
is
16.
quoted
+
+               reg = VE_PRIMARY_OUT_FMT_NV12 |
+                     VE_SECONDARY_SPECIAL_OUT_FMT_NV12;
+               cedrus_write(dev, VE_PRIMARY_OUT_FMT, reg);
+
+               reg = VE_CHROMA_BUF_LEN_SDRT(chroma_size / 2) |
+                     VE_SECONDARY_OUT_FMT_SPECIAL;
+               cedrus_write(dev, VE_CHROMA_BUF_LEN, reg);
+
+               reg = chroma_size / 2;
+               cedrus_write(dev, VE_PRIMARY_CHROMA_BUF_LEN, reg);
+
+               reg = VE_PRIMARY_FB_LINE_STRIDE_LUMA(ALIGN(width, 32)) |
^ that one should be aligned to 16
quoted
+                     VE_PRIMARY_FB_LINE_STRIDE_CHROMA(ALIGN(width / 2, 16));
It seems that CHROMA has to be aligned to 8 ^
I think the issue here is that the divider should be applied after the
alignment, not before, such as: ALIGN(width, 16) / 2, which also
provides a 8-aligned value.

Feel free to let me know if that causes any particular issue!
I think this is only semantics, it doesn't really matter if it is aligned to
16 first and then divided by 2 or divided by 2 and then aligned to 8.
It depends if |width| is always expected to be aligned to 2. For
example, given |width| = 17,

ALIGN(17, 16) = 32, 32 / 2 = 16
17 / 2 = 8, ALIGN(8, 8) = 8

Best regards,
Tomasz
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help