2024-04-10 09:11:11

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 0/8] Add ISP Bayer for StarFive

This series implements the ISP output Bayer format function to the Camera
Subsystem on StarFive JH7110 SoC. The series has been tested on the
VisionFive 2 board. It should beapplied after the series [1][2]:

[1] Add ISP 3A for StarFive:
https://lore.kernel.org/all/[email protected]/
[2] Add StarFive Camera Subsystem hibernation support:
https://lore.kernel.org/all/[email protected]/

This series is based on top of the master branch of media_stage repository,
which is tested with a v4l2-compliance compiled from the git repo
(git://linuxtv.org/v4l-utils.git).

changes since v1:
- Rebased on series [1][2].
- Replaced "raw" with "bayer".
- Added a new patch 7.
- Upadted title and description for all patch.
- Upadted ISP stream count record to avoid duplicating call subdev s_stream in patch 4.

v1: https://lore.kernel.org/all/[email protected]/

The following are the media graph for the device and the v4l2-compliance
output.

==========================================================================================

[the media graph]:

digraph board {
rankdir=TB
n00000001 [label="{{<port0> 0 | <port1> 1} | stf_isp\n/dev/v4l-subdev0 | {<port2> 2 | <port3> 3 | <port4> 4}}", shape=Mrecord, style=filled, fillcolor=green]
n00000001:port2 -> n0000000f [style=dashed]
n00000001:port4 -> n00000017 [style=dashed]
n00000001:port3 -> n00000013 [style=dashed]
n00000007 [label="output_params\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
n00000007 -> n00000001:port1 [style=dashed]
n0000000b [label="capture_raw\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
n0000000f [label="capture_yuv\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
n00000013 [label="capture_bayer\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
n00000017 [label="capture_scd\n/dev/video4", shape=box, style=filled, fillcolor=yellow]
n00000023 [label="{{<port0> 0} | cdns_csi2rx.19800000.csi\n/dev/v4l-subdev1 | {<port1> 1 | <port2> 2 | <port3> 3 | <port4> 4}}", shape=Mrecord, style=filled, fillcolor=green]
n00000023:port1 -> n00000001:port0 [style=dashed]
n00000023:port1 -> n0000000b [style=dashed]
n0000002d [label="{{} | imx219 6-0010\n/dev/v4l-subdev2 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
n0000002d:port0 -> n00000023:port0 [style=bold]
}

[v4l2-compliance test]:

# v4l2-compliance -m /dev/media0
v4l2-compliance 1.27.0-5174, 64 bits, 64-bit time_t
v4l2-compliance SHA: d700deb14368 2024-01-18 12:19:05

Compliance test for starfive-camss device /dev/media0:

Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0

Required ioctls:
test MEDIA_IOC_DEVICE_INFO: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/media0 open: OK
test MEDIA_IOC_DEVICE_INFO: OK
test for unlimited opens: OK

Media Controller ioctls:
test MEDIA_IOC_G_TOPOLOGY: OK
Entities: 8 Interfaces: 8 Pads: 16 Links: 15
test MEDIA_IOC_ENUM_ENTITIES/LINKS: OK
test MEDIA_IOC_SETUP_LINK: OK

Total for starfive-camss device /dev/media0: 8, Succeeded: 8, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/video0:

Driver Info:
Driver name : starfive-camss
Card type : Starfive Camera Subsystem
Bus info : platform:19840000.isp
Driver version : 6.9.0
Capabilities : 0xac200000
Metadata Output
I/O MC
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x2c200000
Metadata Output
I/O MC
Streaming
Extended Pix Format
Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000009
Type : V4L Video
Entity Info:
ID : 0x00000007 (7)
Name : output_params
Function : V4L2 I/O
Pad 0x01000008 : 0: Source
Link 0x0200001f: to remote pad 0x1000003 of entity 'stf_isp' (Image Signal Processor): Data

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/video0 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 1 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Output 0):
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls (Output 0):
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)

Codec ioctls (Output 0):
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Output 0):
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/video0: 47, Succeeded: 47, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/video1:

Driver Info:
Driver name : starfive-camss
Card type : Starfive Camera Subsystem
Bus info : platform:19840000.isp
Driver version : 6.9.0
Capabilities : 0xa4200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x24200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x0300000d
Type : V4L Video
Entity Info:
ID : 0x0000000b (11)
Name : capture_raw
Function : V4L2 I/O
Pad 0x0100000c : 0: Sink
Link 0x0200002b: from remote pad 0x1000025 of entity 'cdns_csi2rx.19800000.csi' (Video Interface Bridge): Data

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/video1 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK

Codec ioctls (Input 0):
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/video1: 47, Succeeded: 47, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/video2:

Driver Info:
Driver name : starfive-camss
Card type : Starfive Camera Subsystem
Bus info : platform:19840000.isp
Driver version : 6.9.0
Capabilities : 0xa4200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x24200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000011
Type : V4L Video
Entity Info:
ID : 0x0000000f (15)
Name : capture_yuv
Function : V4L2 I/O
Pad 0x01000010 : 0: Sink
Link 0x0200001b: from remote pad 0x1000004 of entity 'stf_isp' (Image Signal Processor): Data, Enabled

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/video2 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK

Codec ioctls (Input 0):
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/video2: 47, Succeeded: 47, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/video3:

Driver Info:
Driver name : starfive-camss
Card type : Starfive Camera Subsystem
Bus info : platform:19840000.isp
Driver version : 6.9.0
Capabilities : 0xa4200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x24200001
Video Capture
I/O MC
Streaming
Extended Pix Format
Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000015
Type : V4L Video
Entity Info:
ID : 0x00000013 (19)
Name : capture_bayer
Function : V4L2 I/O
Pad 0x01000014 : 0: Sink
Link 0x02000021: from remote pad 0x1000005 of entity 'stf_isp' (Image Signal Processor): Data

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/video3 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK

Codec ioctls (Input 0):
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/video3: 47, Succeeded: 47, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/video4:

Driver Info:
Driver name : starfive-camss
Card type : Starfive Camera Subsystem
Bus info : platform:19840000.isp
Driver version : 6.9.0
Capabilities : 0xa4a00000
Metadata Capture
I/O MC
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x24a00000
Metadata Capture
I/O MC
Streaming
Extended Pix Format
Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000019
Type : V4L Video
Entity Info:
ID : 0x00000017 (23)
Name : capture_scd
Function : V4L2 I/O
Pad 0x01000018 : 0: Sink
Link 0x0200001d: from remote pad 0x1000006 of entity 'stf_isp' (Image Signal Processor): Data

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/video4 open: OK
test VIDIOC_QUERYCAP: OK
test VIDIOC_G/S_PRIORITY: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 1 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls (Input 0):
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls (Input 0):
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK
test VIDIOC_TRY_FMT: OK
test VIDIOC_S_FMT: OK
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)

Codec ioctls (Input 0):
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls (Input 0):
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
test CREATE_BUFS maximum bufferstf_isp: ================= START STATUS =================
s: OK
stf_isp: ================== END STATUS ==================
test VIDIOC_EXPBUF: OK
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/video4: 47, Succeeded: 47, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/v4l-subdev0:

Driver Info:
Driver version : 6.9.0
Capabilities : 0x00000000
Client Capabilities: 0x0000000000000002
interval-uses-which Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000031
Type : V4L Sub-Device
Entity Info:
ID : 0x00000001 (1)
Name : stf_isp
Function : Image Signal Processor
Pad 0x01000002 : 0: Sink
Link 0x02000029: from remote pad 0x1000025 of entity 'cdns_csi2rx.19800000.csi' (Video Interface Bridge): Data, Enabled
Pad 0x01000003 : 1: Sink
Link 0x0200001f: from remote pad 0x1000008 of entity 'output_params' (V4L2 I/O): Data
Pad 0x01000004 : 2: Source
Link 0x0200001b: to remote pad 0x1000010 of entity 'capture_yuv' (V4L2 I/O): Data, Enabled
Pad 0x01000005 : 3: Source
Link 0x02000021: to remote pad 0x1000014 of entity 'capture_bayer' (V4L2 I/O): Data
Pad 0x01000006 : 4: Source
Link 0x0200001d: to remote pad 0x1000018 of entity 'capture_scd' (V4L2 I/O): Data

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_SUDBEV_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/v4l-subdev0 open: OK
test VIDIOC_SUBDEV_QUERYCAP: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Sub-Device ioctls (Sink Pad 0):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Sink Pad 1):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 2):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 3):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
fail: v4l2-test-subdevs.cpp(528): sel.r.width == ~0U
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: FAIL
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
fail: v4l2-test-subdevs.cpp(528): sel.r.width == ~0U
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: FAIL
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 4):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Control ioctls:
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls:
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK (Not Supported)
test VIDIOC_TRY_FMT: OK (Not Supported)
test VIDIOC_S_FMT: OK (Not Supported)
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)

Codec ioctls:
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK (Not Supported)
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/v4l-subdev0: 80, Succeeded: 78, Failed: 2, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/v4l-subdev1:

Driver Info:
Driver version : 6.9.0
Capabilities : 0x00000000
Client Capabilities: 0x0000000000000002
interval-uses-which Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
cdns_csi2rx.19800000.csi: ================= START STATUS =================
Hardware revisicdns_csi2rx.19800000.csi: ================== END STATUS ==================
on: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000033
Type : V4L Sub-Device
Entity Info:
ID : 0x00000023 (35)
Name : cdns_csi2rx.19800000.csi
Function : Video Interface Bridge
Pad 0x01000024 : 0: Sink
Link 0x0200002f: from remote pad 0x100002e of entity 'imx219 6-0010' (Camera Sensor): Data, Enabled, Immutable
Pad 0x01000025 : 1: Source
Link 0x02000029: to remote pad 0x1000002 of entity 'stf_isp' (Image Signal Processor): Data, Enabled
Link 0x0200002b: to remote pad 0x100000c of entity 'capture_raw' (V4L2 I/O): Data
Pad 0x01000026 : 2: Source
Pad 0x01000027 : 3: Source
Pad 0x01000028 : 4: Source

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_SUDBEV_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/v4l-subdev1 open: OK
test VIDIOC_SUBDEV_QUERYCAP: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Sub-Device ioctls (Sink Pad 0):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 1):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 2):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 3):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZEimx219 6-0010: ================= START STATUS =================
/FRAME_INTERVAL:imx219 6-0010: ================== END STATUS ==================
OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 4):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Control ioctls:
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported)
test VIDIOC_QUERYCTRL: OK (Not Supported)
test VIDIOC_G/S_CTRL: OK (Not Supported)
test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported)
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported)
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 0 Private Controls: 0

Format ioctls:
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK (Not Supported)
test VIDIOC_TRY_FMT: OK (Not Supported)
test VIDIOC_S_FMT: OK (Not Supported)
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)

Codec ioctls:
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK (Not Supported)
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/v4l-subdev1: 80, Succeeded: 80, Failed: 0, Warnings: 0
--------------------------------------------------------------------------------
Compliance test for starfive-camss device /dev/v4l-subdev2:

Driver Info:
Driver version : 6.9.0
Capabilities : 0x00000000
Client Capabilities: 0x0000000000000002
interval-uses-which Media Driver Info:
Driver name : starfive-camss
Model : Starfive Camera Subsystem
Serial :
Bus info : platform:19840000.isp
Media version : 6.9.0
Hardware revision: 0x00000000 (0)
Driver version : 6.9.0
Interface Info:
ID : 0x03000035
Type : V4L Sub-Device
Entity Info:
ID : 0x0000002d (45)
Name : imx219 6-0010
Function : Camera Sensor
Pad 0x0100002e : 0: Source
Link 0x0200002f: to remote pad 0x1000024 of entity 'cdns_csi2rx.19800000.csi' (Video Interface Bridge): Data, Enabled, Immutable

Required ioctls:
test MC information (see 'Media Driver Info' above): OK
test VIDIOC_SUDBEV_QUERYCAP: OK
test invalid ioctls: OK

Allow for multiple opens:
test second /dev/v4l-subdev2 open: OK
test VIDIOC_SUBDEV_QUERYCAP: OK
test for unlimited opens: OK

Debug ioctls:
test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
test VIDIOC_ENUMAUDIO: OK (Not Supported)
test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
test VIDIOC_G/S_AUDIO: OK (Not Supported)
Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
test VIDIOC_G/S_MODULATOR: OK (Not Supported)
test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
test VIDIOC_ENUMAUDOUT: OK (Not Supported)
test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
test VIDIOC_G/S_AUDOUT: OK (Not Supported)
Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
test VIDIOC_G/S_EDID: OK (Not Supported)

Sub-Device ioctls (Source Pad 0):
Try Stream 0
test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Try VIDIOC_SUBDEV_G/S_FMT: OK
warn: v4l2-test-subdevs.cpp(566): VIDIOC_SUBDEV_G_SELECTION is supported for target 0 but not VIDIOC_SUBDEV_S_SELECTION
test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
Active Stream 0
test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK
test Active VIDIOC_SUBDEV_G/S_FMT: OK
warn: v4l2-test-subdevs.cpp(566): VIDIOC_SUBDEV_G_SELECTION is supported for target 0 but not VIDIOC_SUBDEV_S_SELECTION
test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK
test Active VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Control ioctls:
test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
test VIDIOC_QUERYCTRL: OK
test VIDIOC_G/S_CTRL: OK
test VIDIOC_G/S/TRY_EXT_CTRLS: OK
test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
Standard Controls: 17 Private Controls: 0

Format ioctls:
test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK (Not Supported)
test VIDIOC_G/S_PARM: OK (Not Supported)
test VIDIOC_G_FBUF: OK (Not Supported)
test VIDIOC_G_FMT: OK (Not Supported)
test VIDIOC_TRY_FMT: OK (Not Supported)
test VIDIOC_S_FMT: OK (Not Supported)
test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
test Cropping: OK (Not Supported)
test Composing: OK (Not Supported)
test Scaling: OK (Not Supported)

Codec ioctls:
test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
test VIDIOC_G_ENC_INDEX: OK (Not Supported)
test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK (Not Supported)
test CREATE_BUFS maximum buffers: OK
test VIDIOC_EXPBUF: OK (Not Supported)
test Requests: OK (Not Supported)

Total for starfive-camss device /dev/v4l-subdev2: 52, Succeeded: 52, Failed: 0, Warnings: 2

Grand Total for starfive-camss device /dev/media0: 455, Succeeded: 453, Failed: 2, Warnings: 2

Two warnings are from the imx219, can ignore them.

Changhuang Liang (8):
staging: media: starfive: Get rid of current_fmt
staging: media: starfive: Add bayer pad for ISP
staging: media: starfive: Use PAD_SINK instead of PAD_SRC for crop
staging: media: starfive: Introduce isp_stream
staging: media: starfive: Add ISP bayer video device
staging: media: starfive: Fix bayer output stride configuration
staging: media: starfive: Move the struct media_pipeline position
admin-guide: media: Update documents for StarFive Camera Subsystem

.../admin-guide/media/starfive_camss.rst | 8 +--
.../media/starfive_camss_graph.dot | 28 +++++-----
.../staging/media/starfive/camss/stf-camss.c | 12 +++++
.../staging/media/starfive/camss/stf-camss.h | 2 +-
.../media/starfive/camss/stf-capture.c | 41 +++++++++++++++
.../media/starfive/camss/stf-isp-hw-ops.c | 42 ++++++++++++---
.../staging/media/starfive/camss/stf-isp.c | 52 +++++++++++++++----
.../staging/media/starfive/camss/stf-isp.h | 9 ++--
.../staging/media/starfive/camss/stf-video.c | 30 ++++++++---
.../staging/media/starfive/camss/stf-video.h | 2 +
10 files changed, 184 insertions(+), 42 deletions(-)

--
2.25.1


2024-04-10 09:11:12

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 1/8] staging: media: starfive: Get rid of current_fmt

We want to support multiple formats so saving one "current_fmt" doesn't
work. This was only used to set the ISP_REG_STRIDE so use the sd_state
directly for that and delete the ->current_fmt pointer. No functional
change.

Signed-off-by: Changhuang Liang <[email protected]>
---
.../media/starfive/camss/stf-isp-hw-ops.c | 10 ++++---
.../staging/media/starfive/camss/stf-isp.c | 26 +++++++++++++++----
.../staging/media/starfive/camss/stf-isp.h | 3 ++-
3 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
index 84716c809ab1..44ac472d9dc3 100644
--- a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
+++ b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
@@ -387,7 +387,6 @@ void stf_isp_init_cfg(struct stf_isp_dev *isp_dev)
static void stf_isp_config_crop(struct stfcamss *stfcamss,
struct v4l2_rect *crop)
{
- u32 bpp = stfcamss->isp_dev.current_fmt->bpp;
u32 val;

val = VSTART_CAP(crop->top) | HSTART_CAP(crop->left);
@@ -399,9 +398,14 @@ static void stf_isp_config_crop(struct stfcamss *stfcamss,

val = H_ACT_CAP(crop->height) | W_ACT_CAP(crop->width);
stf_isp_reg_write(stfcamss, ISP_REG_PIPELINE_XY_SIZE, val);
+}
+
+void stf_isp_config_yuv_out_stride(struct stf_isp_dev *isp_dev,
+ u32 width, u8 bpp)
+{
+ u32 val = ALIGN(width * bpp / 8, STFCAMSS_FRAME_WIDTH_ALIGN_8);

- val = ALIGN(crop->width * bpp / 8, STFCAMSS_FRAME_WIDTH_ALIGN_8);
- stf_isp_reg_write(stfcamss, ISP_REG_STRIDE, val);
+ stf_isp_reg_write(isp_dev->stfcamss, ISP_REG_STRIDE, val);
}

static void stf_isp_config_raw_fmt(struct stfcamss *stfcamss, u32 mcode)
diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
index 0cbd23069ac6..d961e06d9f7a 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.c
+++ b/drivers/staging/media/starfive/camss/stf-isp.c
@@ -53,6 +53,19 @@ stf_g_fmt_by_mcode(const struct stf_isp_format_table *fmt_table, u32 mcode)
return NULL;
}

+static int stf_isp_g_index_by_mcode(const struct stf_isp_format_table *fmt_table,
+ u32 mcode)
+{
+ int i;
+
+ for (i = 0; i < fmt_table->nfmts; i++) {
+ if (fmt_table->fmts[i].code == mcode)
+ return i;
+ }
+
+ return -EINVAL;
+}
+
int stf_isp_init(struct stfcamss *stfcamss)
{
struct stf_isp_dev *isp_dev = &stfcamss->isp_dev;
@@ -60,7 +73,6 @@ int stf_isp_init(struct stfcamss *stfcamss)
isp_dev->stfcamss = stfcamss;
isp_dev->formats = isp_formats_st7110;
isp_dev->nformats = ARRAY_SIZE(isp_formats_st7110);
- isp_dev->current_fmt = &isp_formats_source[0];

return 0;
}
@@ -68,15 +80,22 @@ int stf_isp_init(struct stfcamss *stfcamss)
void stf_isp_stream_on(struct stf_isp_dev *isp_dev,
struct v4l2_subdev_state *sd_state)
{
- struct v4l2_mbus_framefmt *fmt;
+ const struct stf_isp_format_table *fmt_t_src;
+ struct v4l2_mbus_framefmt *fmt, *fmt_src;
struct v4l2_rect *crop;
+ int src;

+ fmt_t_src = &isp_dev->formats[STF_ISP_PAD_SRC];
fmt = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SINK);
+ fmt_src = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SRC);
crop = v4l2_subdev_state_get_crop(sd_state, STF_ISP_PAD_SRC);
+ src = stf_isp_g_index_by_mcode(fmt_t_src, fmt_src->code);

stf_isp_reset(isp_dev);
stf_isp_init_cfg(isp_dev);
stf_isp_settings(isp_dev, crop, fmt->code);
+ stf_isp_config_yuv_out_stride(isp_dev, crop->width,
+ fmt_t_src->fmts[src].bpp);
stf_isp_stream_set(isp_dev);
}

@@ -181,9 +200,6 @@ static int isp_set_format(struct v4l2_subdev *sd,
if (fmt->pad == STF_ISP_PAD_SRC_SCD || fmt->pad == STF_ISP_PAD_SINK_PARAMS)
return 0;

- isp_dev->current_fmt = stf_g_fmt_by_mcode(&isp_dev->formats[fmt->pad],
- fmt->format.code);
-
/* Propagate to in crop */
if (fmt->pad == STF_ISP_PAD_SINK) {
struct v4l2_subdev_selection sel = { 0 };
diff --git a/drivers/staging/media/starfive/camss/stf-isp.h b/drivers/staging/media/starfive/camss/stf-isp.h
index cad202d9ce6d..3eade22c669e 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.h
+++ b/drivers/staging/media/starfive/camss/stf-isp.h
@@ -574,7 +574,6 @@ struct stf_isp_dev {
const struct stf_isp_format_table *formats;
unsigned int nformats;
struct v4l2_subdev *source_subdev;
- const struct stf_isp_format *current_fmt;
};

int stf_isp_reset(struct stf_isp_dev *isp_dev);
@@ -584,6 +583,8 @@ void stf_isp_settings(struct stf_isp_dev *isp_dev,
void stf_isp_stream_set(struct stf_isp_dev *isp_dev);
void stf_isp_stream_on(struct stf_isp_dev *isp_dev,
struct v4l2_subdev_state *sd_state);
+void stf_isp_config_yuv_out_stride(struct stf_isp_dev *isp_dev,
+ u32 width, u8 bpp);
int stf_isp_init(struct stfcamss *stfcamss);
int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev);
int stf_isp_unregister(struct stf_isp_dev *isp_dev);
--
2.25.1


2024-04-10 09:11:37

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 5/8] staging: media: starfive: Add ISP bayer video device

Add bayer video device to capture bayer format data from ISP.

Signed-off-by: Changhuang Liang <[email protected]>
---
.../staging/media/starfive/camss/stf-camss.c | 12 ++++++
.../media/starfive/camss/stf-capture.c | 41 +++++++++++++++++++
.../media/starfive/camss/stf-isp-hw-ops.c | 19 +++++++++
.../staging/media/starfive/camss/stf-isp.h | 1 +
.../staging/media/starfive/camss/stf-video.h | 1 +
5 files changed, 74 insertions(+)

diff --git a/drivers/staging/media/starfive/camss/stf-camss.c b/drivers/staging/media/starfive/camss/stf-camss.c
index 62bf46a69a3e..b2f9892b7663 100644
--- a/drivers/staging/media/starfive/camss/stf-camss.c
+++ b/drivers/staging/media/starfive/camss/stf-camss.c
@@ -125,6 +125,7 @@ static int stfcamss_of_parse_ports(struct stfcamss *stfcamss)

static int stfcamss_register_devs(struct stfcamss *stfcamss)
{
+ struct stf_capture *cap_bayer = &stfcamss->captures[STF_CAPTURE_BAYER];
struct stf_capture *cap_yuv = &stfcamss->captures[STF_CAPTURE_YUV];
struct stf_capture *cap_scd = &stfcamss->captures[STF_CAPTURE_SCD];
struct stf_output *output = &stfcamss->output;
@@ -172,8 +173,17 @@ static int stfcamss_register_devs(struct stfcamss *stfcamss)
if (ret)
goto err_rm_links1;

+ ret = media_create_pad_link(&isp_dev->subdev.entity, STF_ISP_PAD_SRC_BAYER,
+ &cap_bayer->video.vdev.entity, 0, 0);
+ if (ret)
+ goto err_rm_links2;
+
+ cap_bayer->video.source_subdev = &isp_dev->subdev;
+
return ret;

+err_rm_links2:
+ media_entity_remove_links(&output->video.vdev.entity);
err_rm_links1:
media_entity_remove_links(&cap_scd->video.vdev.entity);
err_rm_links0:
@@ -191,6 +201,7 @@ static int stfcamss_register_devs(struct stfcamss *stfcamss)

static void stfcamss_unregister_devs(struct stfcamss *stfcamss)
{
+ struct stf_capture *cap_bayer = &stfcamss->captures[STF_CAPTURE_BAYER];
struct stf_capture *cap_yuv = &stfcamss->captures[STF_CAPTURE_YUV];
struct stf_capture *cap_scd = &stfcamss->captures[STF_CAPTURE_SCD];
struct stf_output *output = &stfcamss->output;
@@ -200,6 +211,7 @@ static void stfcamss_unregister_devs(struct stfcamss *stfcamss)
media_entity_remove_links(&isp_dev->subdev.entity);
media_entity_remove_links(&cap_yuv->video.vdev.entity);
media_entity_remove_links(&cap_scd->video.vdev.entity);
+ media_entity_remove_links(&cap_bayer->video.vdev.entity);

stf_isp_unregister(&stfcamss->isp_dev);
stf_capture_unregister(stfcamss);
diff --git a/drivers/staging/media/starfive/camss/stf-capture.c b/drivers/staging/media/starfive/camss/stf-capture.c
index 328b8c6e351d..21a59259d7a0 100644
--- a/drivers/staging/media/starfive/camss/stf-capture.c
+++ b/drivers/staging/media/starfive/camss/stf-capture.c
@@ -12,6 +12,7 @@
static const char * const stf_cap_names[] = {
"capture_raw",
"capture_yuv",
+ "capture_bayer",
"capture_scd",
};

@@ -56,6 +57,37 @@ static const struct stfcamss_format_info stf_isp_fmts[] = {
},
};

+static const struct stfcamss_format_info stf_isp_bayer_fmts[] = {
+ {
+ .code = MEDIA_BUS_FMT_SRGGB12_1X12,
+ .pixelformat = V4L2_PIX_FMT_SRGGB12,
+ .planes = 1,
+ .vsub = { 1 },
+ .bpp = 12,
+ },
+ {
+ .code = MEDIA_BUS_FMT_SGRBG12_1X12,
+ .pixelformat = V4L2_PIX_FMT_SGRBG12,
+ .planes = 1,
+ .vsub = { 1 },
+ .bpp = 12,
+ },
+ {
+ .code = MEDIA_BUS_FMT_SGBRG12_1X12,
+ .pixelformat = V4L2_PIX_FMT_SGBRG12,
+ .planes = 1,
+ .vsub = { 1 },
+ .bpp = 12,
+ },
+ {
+ .code = MEDIA_BUS_FMT_SBGGR12_1X12,
+ .pixelformat = V4L2_PIX_FMT_SBGGR12,
+ .planes = 1,
+ .vsub = { 1 },
+ .bpp = 12,
+ },
+};
+
/* 3A Statistics Collection Data */
static const struct stfcamss_format_info stf_isp_scd_fmts[] = {
{
@@ -93,6 +125,8 @@ static void stf_init_addrs(struct stfcamss_video *video)
stf_set_raw_addr(video->stfcamss, addr0);
else if (cap->type == STF_CAPTURE_YUV)
stf_set_yuv_addr(video->stfcamss, addr0, addr1);
+ else if (cap->type == STF_CAPTURE_BAYER)
+ stf_set_bayer_addr(video->stfcamss, addr0);
else
stf_set_scd_addr(video->stfcamss, addr0, addr1, TYPE_AWB);
}
@@ -251,6 +285,11 @@ static void stf_capture_init(struct stfcamss *stfcamss, struct stf_capture *cap)
cap->video.formats = stf_isp_fmts;
cap->video.nformats = ARRAY_SIZE(stf_isp_fmts);
cap->video.bpl_alignment = 1;
+ } else if (cap->type == STF_CAPTURE_BAYER) {
+ cap->video.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ cap->video.formats = stf_isp_bayer_fmts;
+ cap->video.nformats = ARRAY_SIZE(stf_isp_bayer_fmts);
+ cap->video.bpl_alignment = 16 * 8;
} else {
cap->video.type = V4L2_BUF_TYPE_META_CAPTURE;
cap->video.formats = stf_isp_scd_fmts;
@@ -377,6 +416,7 @@ static void stf_capture_unregister_one(struct stf_capture *cap)

void stf_capture_unregister(struct stfcamss *stfcamss)
{
+ struct stf_capture *cap_bayer = &stfcamss->captures[STF_CAPTURE_BAYER];
struct stf_capture *cap_raw = &stfcamss->captures[STF_CAPTURE_RAW];
struct stf_capture *cap_yuv = &stfcamss->captures[STF_CAPTURE_YUV];
struct stf_capture *cap_scd = &stfcamss->captures[STF_CAPTURE_SCD];
@@ -384,6 +424,7 @@ void stf_capture_unregister(struct stfcamss *stfcamss)
stf_capture_unregister_one(cap_raw);
stf_capture_unregister_one(cap_yuv);
stf_capture_unregister_one(cap_scd);
+ stf_capture_unregister_one(cap_bayer);
}

int stf_capture_register(struct stfcamss *stfcamss,
diff --git a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
index 44ac472d9dc3..f170fab2bfb4 100644
--- a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
+++ b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
@@ -515,6 +515,11 @@ void stf_set_scd_addr(struct stfcamss *stfcamss,
stf_isp_reg_write(stfcamss, ISP_REG_YHIST_CFG_4, yhist_addr);
}

+void stf_set_bayer_addr(struct stfcamss *stfcamss, dma_addr_t bayer_addr)
+{
+ stf_isp_reg_write(stfcamss, ISP_REG_DUMP_CFG_0, bayer_addr);
+}
+
static void stf_isp_fill_yhist(struct stfcamss *stfcamss, void *vaddr)
{
struct jh7110_isp_sc_buffer *sc = (struct jh7110_isp_sc_buffer *)vaddr;
@@ -596,6 +601,7 @@ static void stf_isp_set_params(struct stfcamss *stfcamss, void *vaddr)
irqreturn_t stf_line_irq_handler(int irq, void *priv)
{
struct stfcamss *stfcamss = priv;
+ struct stf_capture *cap_bayer = &stfcamss->captures[STF_CAPTURE_BAYER];
struct stf_capture *cap = &stfcamss->captures[STF_CAPTURE_YUV];
struct stf_capture *cap_scd = &stfcamss->captures[STF_CAPTURE_SCD];
struct stfcamss_buffer *change_buf;
@@ -623,6 +629,12 @@ irqreturn_t stf_line_irq_handler(int irq, void *priv)
change_buf->addr[1], type_scd);
}
}
+
+ if (value & CSI_DUMP_EN) {
+ change_buf = stf_change_buffer(&cap_bayer->buffers);
+ if (change_buf)
+ stf_set_bayer_addr(stfcamss, change_buf->addr[0]);
+ }
}

stf_isp_reg_set_bit(stfcamss, ISP_REG_CSIINTS,
@@ -640,6 +652,7 @@ irqreturn_t stf_line_irq_handler(int irq, void *priv)
irqreturn_t stf_isp_irq_handler(int irq, void *priv)
{
struct stfcamss *stfcamss = priv;
+ struct stf_capture *cap_bayer = &stfcamss->captures[STF_CAPTURE_BAYER];
struct stf_capture *cap = &stfcamss->captures[STF_CAPTURE_YUV];
struct stf_capture *cap_scd = &stfcamss->captures[STF_CAPTURE_SCD];
struct stf_output *output = &stfcamss->output;
@@ -668,6 +681,12 @@ irqreturn_t stf_isp_irq_handler(int irq, void *priv)
}
}

+ if (status & ISPC_CSI) {
+ ready_buf = stf_buf_done(&cap_bayer->buffers);
+ if (ready_buf)
+ vb2_buffer_done(&ready_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
+ }
+
stf_isp_reg_write(stfcamss, ISP_REG_ISP_CTRL_0,
(status & ~ISPC_INT_ALL_MASK) |
ISPC_ISP | ISPC_CSI | ISPC_SC);
diff --git a/drivers/staging/media/starfive/camss/stf-isp.h b/drivers/staging/media/starfive/camss/stf-isp.h
index f63817b7a235..8505603bdbc5 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.h
+++ b/drivers/staging/media/starfive/camss/stf-isp.h
@@ -592,6 +592,7 @@ int stf_isp_unregister(struct stf_isp_dev *isp_dev);

void stf_set_yuv_addr(struct stfcamss *stfcamss,
dma_addr_t y_addr, dma_addr_t uv_addr);
+void stf_set_bayer_addr(struct stfcamss *stfcamss, dma_addr_t bayer_addr);
void stf_set_scd_addr(struct stfcamss *stfcamss,
dma_addr_t yhist_addr, dma_addr_t scd_addr,
enum stf_isp_type_scd type_scd);
diff --git a/drivers/staging/media/starfive/camss/stf-video.h b/drivers/staging/media/starfive/camss/stf-video.h
index 53a1cf4e59b7..ea7ec92c3ff5 100644
--- a/drivers/staging/media/starfive/camss/stf-video.h
+++ b/drivers/staging/media/starfive/camss/stf-video.h
@@ -37,6 +37,7 @@ enum stf_v_line_id {
enum stf_capture_type {
STF_CAPTURE_RAW = 0,
STF_CAPTURE_YUV,
+ STF_CAPTURE_BAYER,
STF_CAPTURE_SCD,
STF_CAPTURE_NUM,
};
--
2.25.1


2024-04-10 09:11:43

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 2/8] staging: media: starfive: Add bayer pad for ISP

Add bayer pad for ISP, it supported the output of the 12 bit per
pixel bayer format. It actually convert the 10 bit per pixel input
bayer format to the 12 bit per pixel format.

Signed-off-by: Changhuang Liang <[email protected]>
---
drivers/staging/media/starfive/camss/stf-isp.c | 18 +++++++++++++++---
drivers/staging/media/starfive/camss/stf-isp.h | 1 +
2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
index d961e06d9f7a..53b9cd2b49bd 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.c
+++ b/drivers/staging/media/starfive/camss/stf-isp.c
@@ -29,6 +29,13 @@ static const struct stf_isp_format isp_formats_source[] = {
{ MEDIA_BUS_FMT_YUYV8_1_5X8, 8 },
};

+static const struct stf_isp_format isp_formats_source_bayer[] = {
+ { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
+ { MEDIA_BUS_FMT_SGRBG12_1X12, 12 },
+ { MEDIA_BUS_FMT_SGBRG12_1X12, 12 },
+ { MEDIA_BUS_FMT_SBGGR12_1X12, 12 },
+};
+
static const struct stf_isp_format isp_formats_source_scd[] = {
{ MEDIA_BUS_FMT_METADATA_FIXED },
};
@@ -37,6 +44,7 @@ static const struct stf_isp_format_table isp_formats_st7110[] = {
{ isp_formats_sink, ARRAY_SIZE(isp_formats_sink) },
{ isp_formats_sink_params, ARRAY_SIZE(isp_formats_sink_params) },
{ isp_formats_source, ARRAY_SIZE(isp_formats_source) },
+ { isp_formats_source_bayer, ARRAY_SIZE(isp_formats_source_bayer) },
{ isp_formats_source_scd, ARRAY_SIZE(isp_formats_source_scd) },
};

@@ -311,8 +319,11 @@ static int isp_set_selection(struct v4l2_subdev *sd,
crop.target = V4L2_SEL_TGT_CROP;
crop.r = *rect;
isp_set_selection(sd, state, &crop);
+
+ crop.pad = STF_ISP_PAD_SRC_BAYER;
+ isp_set_selection(sd, state, &crop);
} else if (sel->target == V4L2_SEL_TGT_CROP &&
- sel->pad == STF_ISP_PAD_SRC) {
+ (sel->pad == STF_ISP_PAD_SRC || sel->pad == STF_ISP_PAD_SRC_BAYER)) {
struct v4l2_subdev_format fmt = { 0 };

rect = v4l2_subdev_state_get_crop(state, sel->pad);
@@ -324,7 +335,7 @@ static int isp_set_selection(struct v4l2_subdev *sd,

/* Reset source pad format width and height */
fmt.which = sel->which;
- fmt.pad = STF_ISP_PAD_SRC;
+ fmt.pad = sel->pad;
fmt.format.width = rect->width;
fmt.format.height = rect->height;
isp_set_format(sd, state, &fmt);
@@ -368,7 +379,7 @@ static int isp_init_formats(struct v4l2_subdev *sd,
};
int ret;

- /* Init for STF_ISP_PAD_SINK and STF_ISP_PAD_SRC pad */
+ /* Init for STF_ISP_PAD_SINK, STF_ISP_PAD_SRC and STF_ISP_PAD_SRC_BAYER pad */
ret = isp_set_format(sd, sd_state, &format);
if (ret < 0)
return ret;
@@ -422,6 +433,7 @@ int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev)
pads[STF_ISP_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
pads[STF_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
pads[STF_ISP_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE;
+ pads[STF_ISP_PAD_SRC_BAYER].flags = MEDIA_PAD_FL_SOURCE;
pads[STF_ISP_PAD_SRC_SCD].flags = MEDIA_PAD_FL_SOURCE;

sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP;
diff --git a/drivers/staging/media/starfive/camss/stf-isp.h b/drivers/staging/media/starfive/camss/stf-isp.h
index 3eade22c669e..f63817b7a235 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.h
+++ b/drivers/staging/media/starfive/camss/stf-isp.h
@@ -529,6 +529,7 @@ enum stf_isp_pad_id {
STF_ISP_PAD_SINK = 0,
STF_ISP_PAD_SINK_PARAMS,
STF_ISP_PAD_SRC,
+ STF_ISP_PAD_SRC_BAYER,
STF_ISP_PAD_SRC_SCD,
STF_ISP_PAD_MAX
};
--
2.25.1


2024-04-10 09:12:28

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 3/8] staging: media: starfive: Use PAD_SINK instead of PAD_SRC for crop

PAD_SINK crop can be applied to all of the PAD_SRC crop. StarFive ISP
supports multiple ouitput streams, this can avoid getting the crop
for each PAD_SRC.

Signed-off-by: Changhuang Liang <[email protected]>
---
drivers/staging/media/starfive/camss/stf-isp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
index 53b9cd2b49bd..fb48e7a29e8c 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.c
+++ b/drivers/staging/media/starfive/camss/stf-isp.c
@@ -96,7 +96,7 @@ void stf_isp_stream_on(struct stf_isp_dev *isp_dev,
fmt_t_src = &isp_dev->formats[STF_ISP_PAD_SRC];
fmt = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SINK);
fmt_src = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SRC);
- crop = v4l2_subdev_state_get_crop(sd_state, STF_ISP_PAD_SRC);
+ crop = v4l2_subdev_state_get_crop(sd_state, STF_ISP_PAD_SINK);
src = stf_isp_g_index_by_mcode(fmt_t_src, fmt_src->code);

stf_isp_reset(isp_dev);
--
2.25.1


2024-04-10 09:12:39

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 7/8] staging: media: starfive: Move the struct media_pipeline position

Different video capture devices have different media pipeline. The
media pipeline cannot be shared between the "struct stfcamss". Move
it into "struct stfcamss_video" so that each video capture device
has its own independent media pipeline.

Fixes: bba185d141b1 ("media: staging: media: starfive: camss: Add core driver")

Signed-off-by: Changhuang Liang <[email protected]>
---
drivers/staging/media/starfive/camss/stf-camss.h | 1 -
drivers/staging/media/starfive/camss/stf-video.c | 2 +-
drivers/staging/media/starfive/camss/stf-video.h | 1 +
3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/media/starfive/camss/stf-camss.h b/drivers/staging/media/starfive/camss/stf-camss.h
index 6b9215c92cfa..5fbac7e97eaf 100644
--- a/drivers/staging/media/starfive/camss/stf-camss.h
+++ b/drivers/staging/media/starfive/camss/stf-camss.h
@@ -52,7 +52,6 @@ struct stf_isr_data {
struct stfcamss {
struct v4l2_device v4l2_dev;
struct media_device media_dev;
- struct media_pipeline pipe;
struct device *dev;
struct stf_isp_dev isp_dev;
unsigned int isp_stream;
diff --git a/drivers/staging/media/starfive/camss/stf-video.c b/drivers/staging/media/starfive/camss/stf-video.c
index 69e3e4f9e56b..61d9d42fc5a0 100644
--- a/drivers/staging/media/starfive/camss/stf-video.c
+++ b/drivers/staging/media/starfive/camss/stf-video.c
@@ -280,7 +280,7 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count)
struct video_device *vdev = &video->vdev;
int ret;

- ret = video_device_pipeline_start(vdev, &video->stfcamss->pipe);
+ ret = video_device_pipeline_start(vdev, &video->pipe);
if (ret < 0) {
dev_err(video->stfcamss->dev,
"Failed to media_pipeline_start: %d\n", ret);
diff --git a/drivers/staging/media/starfive/camss/stf-video.h b/drivers/staging/media/starfive/camss/stf-video.h
index ea7ec92c3ff5..0699c1716c2f 100644
--- a/drivers/staging/media/starfive/camss/stf-video.h
+++ b/drivers/staging/media/starfive/camss/stf-video.h
@@ -68,6 +68,7 @@ struct stfcamss_video {
struct vb2_queue vb2_q;
struct video_device vdev;
struct media_pad pad;
+ struct media_pipeline pipe;
struct v4l2_format active_fmt;
enum v4l2_buf_type type;
const struct stfcamss_video_ops *ops;
--
2.25.1


2024-04-10 09:14:16

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 6/8] staging: media: starfive: Fix bayer output stride configuration

Add the bayer output stride configuration. And convert set the stride
be a helper function. Improve readability.

Fixes: e57854628f58 ("media: staging: media: starfive: camss: Add ISP driver")

Signed-off-by: Changhuang Liang <[email protected]>
---
.../staging/media/starfive/camss/stf-isp-hw-ops.c | 13 +++++++++----
drivers/staging/media/starfive/camss/stf-isp.c | 12 +++++++++---
drivers/staging/media/starfive/camss/stf-isp.h | 4 ++--
3 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
index f170fab2bfb4..c990dc124f77 100644
--- a/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
+++ b/drivers/staging/media/starfive/camss/stf-isp-hw-ops.c
@@ -408,6 +408,15 @@ void stf_isp_config_yuv_out_stride(struct stf_isp_dev *isp_dev,
stf_isp_reg_write(isp_dev->stfcamss, ISP_REG_STRIDE, val);
}

+void stf_isp_config_bayer_out_stride(struct stf_isp_dev *isp_dev,
+ u32 width, u8 bpp)
+{
+ u32 val = ALIGN(width * bpp / 8, STFCAMSS_FRAME_WIDTH_ALIGN_128);
+
+ stf_isp_reg_write(isp_dev->stfcamss, ISP_REG_DUMP_CFG_1,
+ DUMP_BURST_LEN(3) | val);
+}
+
static void stf_isp_config_raw_fmt(struct stfcamss *stfcamss, u32 mcode)
{
u32 val, val1;
@@ -459,10 +468,6 @@ void stf_isp_settings(struct stf_isp_dev *isp_dev,
stf_isp_config_crop(stfcamss, crop);
stf_isp_config_raw_fmt(stfcamss, mcode);

- stf_isp_reg_set_bit(stfcamss, ISP_REG_DUMP_CFG_1,
- DUMP_BURST_LEN_MASK | DUMP_SD_MASK,
- DUMP_BURST_LEN(3));
-
stf_isp_reg_write(stfcamss, ISP_REG_ITIIWSR,
ITI_HSIZE(IMAGE_MAX_HEIGH) |
ITI_WSIZE(IMAGE_MAX_WIDTH));
diff --git a/drivers/staging/media/starfive/camss/stf-isp.c b/drivers/staging/media/starfive/camss/stf-isp.c
index fb48e7a29e8c..ef07639bf4d1 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.c
+++ b/drivers/staging/media/starfive/camss/stf-isp.c
@@ -88,22 +88,28 @@ int stf_isp_init(struct stfcamss *stfcamss)
void stf_isp_stream_on(struct stf_isp_dev *isp_dev,
struct v4l2_subdev_state *sd_state)
{
- const struct stf_isp_format_table *fmt_t_src;
- struct v4l2_mbus_framefmt *fmt, *fmt_src;
+ const struct stf_isp_format_table *fmt_t_src, *fmt_t_bayer;
+ struct v4l2_mbus_framefmt *fmt, *fmt_src, *fmt_bayer;
struct v4l2_rect *crop;
- int src;
+ int src, bayer;

fmt_t_src = &isp_dev->formats[STF_ISP_PAD_SRC];
+ fmt_t_bayer = &isp_dev->formats[STF_ISP_PAD_SRC_BAYER];
fmt = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SINK);
fmt_src = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SRC);
+ fmt_bayer = v4l2_subdev_state_get_format(sd_state, STF_ISP_PAD_SRC_BAYER);
crop = v4l2_subdev_state_get_crop(sd_state, STF_ISP_PAD_SINK);
src = stf_isp_g_index_by_mcode(fmt_t_src, fmt_src->code);
+ bayer = stf_isp_g_index_by_mcode(fmt_t_bayer, fmt_bayer->code);

stf_isp_reset(isp_dev);
stf_isp_init_cfg(isp_dev);
stf_isp_settings(isp_dev, crop, fmt->code);
stf_isp_config_yuv_out_stride(isp_dev, crop->width,
fmt_t_src->fmts[src].bpp);
+ stf_isp_config_bayer_out_stride(isp_dev, crop->width,
+ fmt_t_bayer->fmts[bayer].bpp);
+
stf_isp_stream_set(isp_dev);
}

diff --git a/drivers/staging/media/starfive/camss/stf-isp.h b/drivers/staging/media/starfive/camss/stf-isp.h
index 8505603bdbc5..546c79332e9a 100644
--- a/drivers/staging/media/starfive/camss/stf-isp.h
+++ b/drivers/staging/media/starfive/camss/stf-isp.h
@@ -77,8 +77,6 @@
#define DUMP_SHT(n) ((n) << 20)
#define DUMP_BURST_LEN(n) ((n) << 16)
#define DUMP_SD(n) ((n) << 0)
-#define DUMP_BURST_LEN_MASK GENMASK(17, 16)
-#define DUMP_SD_MASK GENMASK(15, 0)

#define ISP_REG_DEC_CFG 0x030
#define DEC_V_KEEP(n) ((n) << 24)
@@ -586,6 +584,8 @@ void stf_isp_stream_on(struct stf_isp_dev *isp_dev,
struct v4l2_subdev_state *sd_state);
void stf_isp_config_yuv_out_stride(struct stf_isp_dev *isp_dev,
u32 width, u8 bpp);
+void stf_isp_config_bayer_out_stride(struct stf_isp_dev *isp_dev,
+ u32 width, u8 bpp);
int stf_isp_init(struct stfcamss *stfcamss);
int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev);
int stf_isp_unregister(struct stf_isp_dev *isp_dev);
--
2.25.1


2024-04-10 09:25:24

by Changhuang Liang

[permalink] [raw]
Subject: [PATCH v2 8/8] admin-guide: media: Update documents for StarFive Camera Subsystem

Add ISP capture_bayer video device in documents. It support output bayer
frames by ISP module.

Signed-off-by: Changhuang Liang <[email protected]>
---
.../admin-guide/media/starfive_camss.rst | 8 ++++--
.../media/starfive_camss_graph.dot | 28 ++++++++++---------
2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/Documentation/admin-guide/media/starfive_camss.rst b/Documentation/admin-guide/media/starfive_camss.rst
index 020f1969e67f..ed7fbe08f4a2 100644
--- a/Documentation/admin-guide/media/starfive_camss.rst
+++ b/Documentation/admin-guide/media/starfive_camss.rst
@@ -44,7 +44,7 @@ The Starfive Camera Subsystem hardware consists of::
- Parallel: The parallel interface, receiving data from a parallel sensor.

- ISP: The ISP, processing raw Bayer data from an image sensor and producing
- YUV frames.
+ YUV frames, and also support output 12bit per pixel Bayer format frames.


Topology
@@ -58,20 +58,22 @@ The media controller pipeline graph is as follows:
:alt: starfive_camss_graph.dot
:align: center

-The driver has 4 video devices:
+The driver has 5 video devices:

- output_params: The meta output device, transmitting the parameters to ISP
module.
- capture_raw: The capture device, capturing image data directly from a sensor.
- capture_yuv: The capture device, capturing YUV frame data processed by the
ISP module.
+- capture_bayer: The capture device, capturing 12bit per pixel Bayer frame data
+ processed by the ISP module.
- capture_scd: The meta capture device, capturing 3A statistics collection data
processed by the ISP module.

The driver has 3 subdevices:

- stf_isp: is responsible for all the isp operations, outputs YUV frames
- and 3A statistics collection data.
+ , 3A statistics collection data and Bayer frames.
- cdns_csi2rx: a CSI-2 bridge supporting up to 4 CSI lanes in input, and 4
different pixel streams in output.
- imx219: an image sensor, image data is sent through MIPI CSI-2.
diff --git a/Documentation/admin-guide/media/starfive_camss_graph.dot b/Documentation/admin-guide/media/starfive_camss_graph.dot
index 7961255d3ad6..5255c12c2b15 100644
--- a/Documentation/admin-guide/media/starfive_camss_graph.dot
+++ b/Documentation/admin-guide/media/starfive_camss_graph.dot
@@ -1,16 +1,18 @@
digraph board {
rankdir=TB
- n00000001 [label="{{<port0> 0 | <port1> 1} | stf_isp\n/dev/v4l-subdev0 | {<port2> 2 | <port3> 3}}", shape=Mrecord, style=filled, fillcolor=green]
- n00000001:port2 -> n0000000e
- n00000001:port3 -> n00000012 [style=dashed]
- n00000006 [label="output_params\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
- n00000006 -> n00000001:port1 [style=dashed]
- n0000000a [label="capture_raw\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
- n0000000e [label="capture_yuv\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
- n00000012 [label="capture_scd\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
- n0000001c [label="{{<port0> 0} | cdns_csi2rx.19800000.csi-bridge\n/dev/v4l-subdev1 | {<port1> 1 | <port2> 2 | <port3> 3 | <port4> 4}}", shape=Mrecord, style=filled, fillcolor=green]
- n0000001c:port1 -> n00000001:port0 [style=dashed]
- n0000001c:port1 -> n0000000a [style=dashed]
- n00000026 [label="{{} | imx219 6-0010\n/dev/v4l-subdev2 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
- n00000026:port0 -> n0000001c:port0 [style=bold]
+ n00000001 [label="{{<port0> 0 | <port1> 1} | stf_isp\n/dev/v4l-subdev0 | {<port2> 2 | <port3> 3 | <port4> 4}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000001:port2 -> n0000000f [style=dashed]
+ n00000001:port4 -> n00000017 [style=dashed]
+ n00000001:port3 -> n00000013 [style=dashed]
+ n00000007 [label="output_params\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
+ n00000007 -> n00000001:port1 [style=dashed]
+ n0000000b [label="capture_raw\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
+ n0000000f [label="capture_yuv\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
+ n00000013 [label="capture_bayer\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
+ n00000017 [label="capture_scd\n/dev/video4", shape=box, style=filled, fillcolor=yellow]
+ n00000023 [label="{{<port0> 0} | cdns_csi2rx.19800000.csi\n/dev/v4l-subdev1 | {<port1> 1 | <port2> 2 | <port3> 3 | <port4> 4}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000023:port1 -> n00000001:port0 [style=dashed]
+ n00000023:port1 -> n0000000b [style=dashed]
+ n0000002d [label="{{} | imx219 6-0010\n/dev/v4l-subdev2 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
+ n0000002d:port0 -> n00000023:port0 [style=bold]
}
--
2.25.1