Re: [PATCH v10 0/7] Wave5 codec driver

From: Sebastian Fricke
Date: Tue Nov 01 2022 - 09:17:45 EST


Hey Prasanth,

Thanks for taking a look.

On 31.10.2022 23:52, Prasanth Mantena wrote:
On 02:04-20221022, Sebastian Fricke wrote:
The Wave5 codec driver is a stateful encoder/decoder.
It is found on the J721S2 SoC, JH7100 SoC, ssd202d SoC. Etc.
But current test report is based on J721S2 SoC and pre-silicon FPGA.

The driver currently supports V4L2_PIX_FMT_HEVC, V4L2_PIX_FMT_H264.

This driver has so far been tested on J721S2 EVM board and pre-silicon
FPGA.

Testing on J721S2 EVM board shows it working fine both decoder and
encoder.
The driver is successfully working with gstreamer v4l2 good-plugin
without any modification.

# v4l2-compliance -d0
Total for wave5-dec device /dev/video0: 44, Succeeded: 44, Failed: 0, Warnings: 0

# v4l2-compliance -d1
Buffer ioctls:
fail: ../../../v4l-utils-1.18.1/utils/v4l2-compliance/v4l2-test-buffers.cpp(610): q.reqbufs(node, 1)
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: FAIL
fail: ../../../v4l-utils-1.18.1/utils/v4l2-compliance/v4l2-test-buffers.cpp(753): q.reqbufs(node, 2)
test VIDIOC_EXPBUF: FAIL
test Requests: OK (Not Supported)

Total for wave5-enc device /dev/video1: 44, Succeeded: 42, Failed: 2, Warnings: 2

changes since v9:

* Move from staging to the media directory
* Move coda driver to sub-directory

* Fixes:
* Use platform_get_irq instead of platform_get_resource to fetch the IRQ

* General cleanups:
* Add missing error messages to error conditions
* Improve messages/variable names/comments, align parameter names across the driver
* Use macros instead of magic numbers in multiple occassions
* Reduce code duplication in multiple places
* Fix whitespace, newline and tab alignment issues
* Remove unused struct fields & commented out code
* Convert signed integers to unsigned if signed is not necessary
* Convert int/unsigned int to s32/u32, when the variable is assigned to the
return of a register read or provided as a parameter for a register write
(and vice versa)
* Fix incorrect bitwise operators where logical operators are appropriate
* Multiple smaller changes

* Generalization:
* Add new helper file providing generalized routines for vpu-dec & vpu-enc
* Generalize luma & chroma table size calculation and stride calculation

* Resource cleanup and error handling:
* Add error handling to all calls with ignored return codes
* Handle DMA resource cleanup properly
* Fix insufficient instance cleanup while opening dec/enc

changes since v8:

* add 'wave5' to DEV_NAME
* update to support Multi-stream
* update to support loop test/dynamic resolution change
* remove unnecessary memset, g_volatile, old version option

changes since v7:

* update v4l2-compliance test report
* fix build error on linux-kernel 5.18.0-rc4

changes since v6:

* update TODO file
* get sram info from device tree

changes since v5:

* support NV12/NV21 pixelformat for encoder and decoder
* handle adnormal exit and EOS

changes since v4:

* refactor functions in wave5-hw and fix bug reported by Daniel Palmer
* rename functions and variables to better names
* change variable types such as replacing s32 with u32 and int with bool
* as appropriate

changes since v3:

* Fixing all issues commented by Dan Carpenter
* Change file names to have wave5- prefix
* In wave5_vpu_probe, enable the clocks before reading registers, as
* commented from Daniel Palmer
* Add more to the TODO list,

changes since v2:

Main fixes includes:
* change the yaml and dirver code to support up to 4 clks (instead of
* one)
* fix Kconfig format
* remove unneeded cast,
* change var types
* change var names, func names
* checkpatch fixes

changes since v1:

Fix changes due to comments from Ezequiel and Dan Carpenter. Main fixes
inclueds:
* move all files to one dir 'wave5'
* replace private error codes with standard error codes
* fix extra spaces
* various checkpatch fixes
* replace private 'DPRINTK' macro with standard 'dev_err/dbg ..'
* fix error handling
* add more possible fixes to the TODO file


We see issues with the patchset. The decoder output contains garbage
data randomly in the image. This is seen more for higher
resolutions(>=1080p).

Thanks for the highlight, I am currently debugging that issue as well as
an issue found with the encoder, which seems to be present since V9.
I'll try to keep you updated but currently I am not finished with
isolating the issue.

The gstreamer pipeline for encoder fails with negotiation error as
stated below.

"vdec 4210000.video-codec: Invalid intra refresh mode: 0 (valid: 1-4)"

Yes, I have noticed this issue as well and it as already fixed in my
local tree, this was a refactoring error.



Dafna Hirschfeld (1):
media: chips-media: wave5: Add the vdi layer

Nas Chung (3):
media: chips-media: wave5: Add vpuapi layer
media: chips-media: wave5: Add the v4l2 layer
media: chips-media: wave5: Add TODO file

Robert Beckett (2):
dt-bindings: media: wave5: add yaml devicetree bindings
media: chips-media: wave5: Add wave5 driver to maintainers file

Sebastian Fricke (1):
media: platform: chips-media: Move Coda to separate folder

.../devicetree/bindings/media/wave5.yml | 73 +
MAINTAINERS | 11 +-
drivers/media/platform/chips-media/Kconfig | 18 +-
drivers/media/platform/chips-media/Makefile | 6 +-
.../media/platform/chips-media/coda/Kconfig | 18 +
.../media/platform/chips-media/coda/Makefile | 6 +
.../chips-media/{ => coda}/coda-bit.c | 0
.../chips-media/{ => coda}/coda-common.c | 0
.../chips-media/{ => coda}/coda-gdi.c | 0
.../chips-media/{ => coda}/coda-h264.c | 0
.../chips-media/{ => coda}/coda-jpeg.c | 0
.../chips-media/{ => coda}/coda-mpeg2.c | 0
.../chips-media/{ => coda}/coda-mpeg4.c | 0
.../platform/chips-media/{ => coda}/coda.h | 0
.../chips-media/{ => coda}/coda_regs.h | 0
.../chips-media/{ => coda}/imx-vdoa.c | 0
.../chips-media/{ => coda}/imx-vdoa.h | 0
.../platform/chips-media/{ => coda}/trace.h | 0
.../media/platform/chips-media/wave5/Kconfig | 12 +
.../media/platform/chips-media/wave5/Makefile | 10 +
drivers/media/platform/chips-media/wave5/TODO | 25 +
.../platform/chips-media/wave5/wave5-helper.c | 175 +
.../platform/chips-media/wave5/wave5-helper.h | 28 +
.../platform/chips-media/wave5/wave5-hw.c | 3459 +++++++++++++++++
.../chips-media/wave5/wave5-regdefine.h | 654 ++++
.../platform/chips-media/wave5/wave5-vdi.c | 261 ++
.../platform/chips-media/wave5/wave5-vdi.h | 67 +
.../chips-media/wave5/wave5-vpu-dec.c | 1399 +++++++
.../chips-media/wave5/wave5-vpu-enc.c | 1454 +++++++
.../platform/chips-media/wave5/wave5-vpu.c | 362 ++

io.h is needed for devm_ioremap to work.

Do you mean this?

```
drivers/media/platform/chips-media/wave5/wave5-vpu.c
191: dev->vdb_register = devm_platform_ioremap_resource(pdev, 0);
192- if (IS_ERR(dev->vdb_register))
193- return PTR_ERR(dev->vdb_register);
```

Because there is no `devm_ioremap` function call in the driver.
And the `devm_platform_ioremap_resource`, seems to work just fine.

Any clarification is highly appreciated for this comment.

Sincerely,
Sebastian Fricke


.../platform/chips-media/wave5/wave5-vpu.h | 72 +
.../platform/chips-media/wave5/wave5-vpuapi.c | 1115 ++++++
.../platform/chips-media/wave5/wave5-vpuapi.h | 1198 ++++++
.../chips-media/wave5/wave5-vpuconfig.h | 90 +
.../chips-media/wave5/wave5-vpuerror.h | 454 +++
.../media/platform/chips-media/wave5/wave5.h | 94 +
36 files changed, 11040 insertions(+), 21 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/wave5.yml
create mode 100644 drivers/media/platform/chips-media/coda/Kconfig
create mode 100644 drivers/media/platform/chips-media/coda/Makefile
rename drivers/media/platform/chips-media/{ => coda}/coda-bit.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-common.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-gdi.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-h264.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-jpeg.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-mpeg2.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda-mpeg4.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda.h (100%)
rename drivers/media/platform/chips-media/{ => coda}/coda_regs.h (100%)
rename drivers/media/platform/chips-media/{ => coda}/imx-vdoa.c (100%)
rename drivers/media/platform/chips-media/{ => coda}/imx-vdoa.h (100%)
rename drivers/media/platform/chips-media/{ => coda}/trace.h (100%)
create mode 100644 drivers/media/platform/chips-media/wave5/Kconfig
create mode 100644 drivers/media/platform/chips-media/wave5/Makefile
create mode 100644 drivers/media/platform/chips-media/wave5/TODO
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-helper.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-helper.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-hw.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-regdefine.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vdi.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vdi.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpu.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpu.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpuapi.c
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpuapi.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpuconfig.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5-vpuerror.h
create mode 100644 drivers/media/platform/chips-media/wave5/wave5.h

--
2.25.1