diff mbox series

media: rkisp1: Add the enum_frame_size ioctl

Message ID 20201206053935.24028-1-sebastian.fricke.linux@gmail.com
State New
Headers show
Series media: rkisp1: Add the enum_frame_size ioctl | expand

Commit Message

Sebastian Fricke Dec. 6, 2020, 5:39 a.m. UTC
Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus
code is valid for the given pad. This call is not available for the
parameter or metadata pads of the RkISP1.

Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>
---

I have tested this patch with the following script:
https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

pad 0 = RKISP1_ISP_PAD_SINK_VIDEO
pad 1 = RKISP1_ISP_PAD_SINK_PARAMS
pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO
pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py 
TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024
TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024
TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024
TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024
TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024
TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024
TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024
TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024
TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024
TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024
TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024
TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024
TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024
TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024
TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024
TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024
TEST 16: pad 1 - code 0x7001 - size /
TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024
TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024
TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024
TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024
TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024
TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024
TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024
TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024
TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024
TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024
TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024
TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024
TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024
TEST 30: pad 3 - code 0x7001 - size /
TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)
TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)
TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)
TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

---

 .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

Helen Mae Koike Fornazier Dec. 7, 2020, 11:33 a.m. UTC | #1
Hi Sebastian,

Thanks for your patch.

On 12/6/20 2:39 AM, Sebastian Fricke wrote:
> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

> code is valid for the given pad. This call is not available for the

> parameter or metadata pads of the RkISP1.

> 

> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

> ---

> 

> I have tested this patch with the following script:

> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

> 

> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

> 

> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

> 

> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py 

> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

> TEST 16: pad 1 - code 0x7001 - size /

> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

> TEST 30: pad 3 - code 0x7001 - size /

> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)


Could you please also run v4l2-compliance ?

> 

> ---

> 

>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>  1 file changed, 39 insertions(+)

> 

> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

> index 889982d8ca41..fa7540155d71 100644

> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>  

>  	return -EINVAL;

>  }


Please add a new line here

> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

> +				      struct v4l2_subdev_pad_config *cfg,

> +				      struct v4l2_subdev_frame_size_enum *fse)

> +{

> +	int i;


unsigned

> +	bool code_match = false;

> +

> +	if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

> +	    fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

> +		return -EINVAL;




> +

> +	if (fse->index > 0)> +		return -EINVAL;

> +

> +	for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

> +		const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];


Can't you use function rkisp1_isp_mbus_info_get() ?

Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

Thanks
Helen

> +

> +		if (fmt->mbus_code == fse->code) {

> +			code_match = true;

> +			if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

> +			    fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

> +				return -EINVAL;

> +			if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

> +			    fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

> +				return -EINVAL;

> +		}

> +	}

> +

> +	if (!code_match)

> +		return -EINVAL;

> +

> +	fse->min_width = RKISP1_ISP_MIN_WIDTH;

> +	fse->max_width = RKISP1_ISP_MAX_WIDTH;

> +	fse->min_height = RKISP1_ISP_MIN_HEIGHT;

> +	fse->max_height = RKISP1_ISP_MAX_HEIGHT;

> +

> +	return 0;

> +}

>  

>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>  				  struct v4l2_subdev_pad_config *cfg)

> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>  

>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>  	.enum_mbus_code = rkisp1_isp_enum_mbus_code,

> +	.enum_frame_size = rkisp1_isp_enum_frame_size,

>  	.get_selection = rkisp1_isp_get_selection,

>  	.set_selection = rkisp1_isp_set_selection,

>  	.init_cfg = rkisp1_isp_init_config,

>
Sebastian Fricke Dec. 7, 2020, 6:01 p.m. UTC | #2
On 07.12.2020 08:33, Helen Koike wrote:
>Hi Sebastian,

>

>Thanks for your patch.


Hello Helen,

I am very grateful for your review.

>

>On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>> code is valid for the given pad. This call is not available for the

>> parameter or metadata pads of the RkISP1.

>>

>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>> ---

>>

>> I have tested this patch with the following script:

>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>

>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>

>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>

>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>> TEST 16: pad 1 - code 0x7001 - size /

>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>> TEST 30: pad 3 - code 0x7001 - size /

>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>

>Could you please also run v4l2-compliance ?


Yes, it finished without errors here is the output.

Greetings,
Sebastian

---

basti@nanopct4:~$ v4l2-compliance 
v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t
v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02

Compliance test for rkisp1 device /dev/video0:

Driver Info:
	Driver name      : rkisp1
	Card type        : rkisp1
	Bus info         : platform:rkisp1
	Driver version   : 5.10.0
	Capabilities     : 0xa4201000
		Video Capture Multiplanar
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x24201000
		Video Capture Multiplanar
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      : rkisp1
	Model            : rkisp1
	Serial           :
	Bus info         : platform:rkisp1
	Media version    : 5.10.0
	Hardware revision: 0x00000000 (0)
	Driver version   : 5.10.0
Interface Info:
	ID               : 0x0300000d
	Type             : V4L Video
Entity Info:
	ID               : 0x0000000c (12)
	Name             : rkisp1_mainpath
	Function         : V4L2 I/O
	Pad 0x0100000f   : 0: Sink
	  Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

Required ioctls:
	test MC information (see 'Media Driver Info' above): OK
	test VIDIOC_QUERYCAP: 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

	test invalid ioctls: 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 VIDIOC_EXPBUF: OK
	test Requests: OK (Not Supported)

Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

>

>>

>> ---

>>

>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>  1 file changed, 39 insertions(+)

>>

>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>> index 889982d8ca41..fa7540155d71 100644

>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>

>>  	return -EINVAL;

>>  }

>

>Please add a new line here

>

>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>> +				      struct v4l2_subdev_pad_config *cfg,

>> +				      struct v4l2_subdev_frame_size_enum *fse)

>> +{

>> +	int i;

>

>unsigned

>

>> +	bool code_match = false;

>> +

>> +	if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>> +	    fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>> +		return -EINVAL;

>

>

>

>> +

>> +	if (fse->index > 0)> +		return -EINVAL;

>> +

>> +	for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>> +		const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>

>Can't you use function rkisp1_isp_mbus_info_get() ?

>

>Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>

>Thanks

>Helen

>

>> +

>> +		if (fmt->mbus_code == fse->code) {

>> +			code_match = true;

>> +			if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>> +			    fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>> +				return -EINVAL;

>> +			if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>> +			    fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>> +				return -EINVAL;

>> +		}

>> +	}

>> +

>> +	if (!code_match)

>> +		return -EINVAL;

>> +

>> +	fse->min_width = RKISP1_ISP_MIN_WIDTH;

>> +	fse->max_width = RKISP1_ISP_MAX_WIDTH;

>> +	fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>> +	fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>> +

>> +	return 0;

>> +}

>>

>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>  				  struct v4l2_subdev_pad_config *cfg)

>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>

>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>  	.enum_mbus_code = rkisp1_isp_enum_mbus_code,

>> +	.enum_frame_size = rkisp1_isp_enum_frame_size,

>>  	.get_selection = rkisp1_isp_get_selection,

>>  	.set_selection = rkisp1_isp_set_selection,

>>  	.init_cfg = rkisp1_isp_init_config,

>>
Helen Mae Koike Fornazier Dec. 9, 2020, 2:22 p.m. UTC | #3
Hi Sebastian,

On 12/7/20 3:01 PM, Sebastian Fricke wrote:
> On 07.12.2020 08:33, Helen Koike wrote:

>> Hi Sebastian,

>>

>> Thanks for your patch.

> 

> Hello Helen,

> 

> I am very grateful for your review.

> 

>>

>> On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>>> code is valid for the given pad. This call is not available for the

>>> parameter or metadata pads of the RkISP1.

>>>

>>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>>> ---

>>>

>>> I have tested this patch with the following script:

>>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>>

>>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>>

>>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>>

>>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>>> TEST 16: pad 1 - code 0x7001 - size /

>>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>>> TEST 30: pad 3 - code 0x7001 - size /

>>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>>

>> Could you please also run v4l2-compliance ?

> 

> Yes, it finished without errors here is the output.

> 

> Greetings,

> Sebastian

> 

> ---

> 

> basti@nanopct4:~$ v4l2-compliance v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t

> v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02


Thanks for running the test.

> 

> Compliance test for rkisp1 device /dev/video0:



This is only testing video0 (rkisp1-capture) but enum_frame_size is in the isp node.
Please run v4l2-compliance in the isp node as well. iirc you can use the -m option
to test the whole tree.

Regards,
Helen

> 

> Driver Info:

>     Driver name      : rkisp1

>     Card type        : rkisp1

>     Bus info         : platform:rkisp1

>     Driver version   : 5.10.0

>     Capabilities     : 0xa4201000

>         Video Capture Multiplanar

>         Streaming

>         Extended Pix Format

>         Device Capabilities

>     Device Caps      : 0x24201000

>         Video Capture Multiplanar

>         Streaming

>         Extended Pix Format

> Media Driver Info:

>     Driver name      : rkisp1

>     Model            : rkisp1

>     Serial           :

>     Bus info         : platform:rkisp1

>     Media version    : 5.10.0

>     Hardware revision: 0x00000000 (0)

>     Driver version   : 5.10.0

> Interface Info:

>     ID               : 0x0300000d

>     Type             : V4L Video

> Entity Info:

>     ID               : 0x0000000c (12)

>     Name             : rkisp1_mainpath

>     Function         : V4L2 I/O

>     Pad 0x0100000f   : 0: Sink

>       Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

> 

> Required ioctls:

>     test MC information (see 'Media Driver Info' above): OK

>     test VIDIOC_QUERYCAP: 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

> 

>     test invalid ioctls: 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 VIDIOC_EXPBUF: OK

>     test Requests: OK (Not Supported)

> 

> Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

> 

>>

>>>

>>> ---

>>>

>>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>>  1 file changed, 39 insertions(+)

>>>

>>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>> index 889982d8ca41..fa7540155d71 100644

>>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>>

>>>      return -EINVAL;

>>>  }

>>

>> Please add a new line here

>>

>>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>>> +                      struct v4l2_subdev_pad_config *cfg,

>>> +                      struct v4l2_subdev_frame_size_enum *fse)

>>> +{

>>> +    int i;

>>

>> unsigned

>>

>>> +    bool code_match = false;

>>> +

>>> +    if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>>> +        fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>>> +        return -EINVAL;

>>

>>

>>

>>> +

>>> +    if (fse->index > 0)> +        return -EINVAL;

>>> +

>>> +    for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>>> +        const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>>

>> Can't you use function rkisp1_isp_mbus_info_get() ?

>>

>> Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>>

>> Thanks

>> Helen

>>

>>> +

>>> +        if (fmt->mbus_code == fse->code) {

>>> +            code_match = true;

>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>>> +                fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>>> +                return -EINVAL;

>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>>> +                fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>>> +                return -EINVAL;

>>> +        }

>>> +    }

>>> +

>>> +    if (!code_match)

>>> +        return -EINVAL;

>>> +

>>> +    fse->min_width = RKISP1_ISP_MIN_WIDTH;

>>> +    fse->max_width = RKISP1_ISP_MAX_WIDTH;

>>> +    fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>>> +    fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>>> +

>>> +    return 0;

>>> +}

>>>

>>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>>                    struct v4l2_subdev_pad_config *cfg)

>>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>>

>>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>>      .enum_mbus_code = rkisp1_isp_enum_mbus_code,

>>> +    .enum_frame_size = rkisp1_isp_enum_frame_size,

>>>      .get_selection = rkisp1_isp_get_selection,

>>>      .set_selection = rkisp1_isp_set_selection,

>>>      .init_cfg = rkisp1_isp_init_config,

>>>
Sebastian Fricke Dec. 10, 2020, 5:03 a.m. UTC | #4
On 09.12.2020 11:22, Helen Koike wrote:
>Hi Sebastian,

>

>On 12/7/20 3:01 PM, Sebastian Fricke wrote:

>> On 07.12.2020 08:33, Helen Koike wrote:

>>> Hi Sebastian,

>>>

>>> Thanks for your patch.

>>

>> Hello Helen,

>>

>> I am very grateful for your review.

>>

>>>

>>> On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>>>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>>>> code is valid for the given pad. This call is not available for the

>>>> parameter or metadata pads of the RkISP1.

>>>>

>>>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>>>> ---

>>>>

>>>> I have tested this patch with the following script:

>>>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>>>

>>>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>>>

>>>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>>>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>>>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>>>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>>>

>>>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>>>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>>>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>>>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>>>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>>>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>>>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>>>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>>>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>>>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>>>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>>>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>>>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>>>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>>>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>>>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>>>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>>>> TEST 16: pad 1 - code 0x7001 - size /

>>>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>>>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>>>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>>>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>>>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>>>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>>>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>>>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>>>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>>>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>>>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>>>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>>>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>>>> TEST 30: pad 3 - code 0x7001 - size /

>>>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>>>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>>>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>>>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>>>

>>> Could you please also run v4l2-compliance ?

>>

>> Yes, it finished without errors here is the output.

>>

>> Greetings,

>> Sebastian

>>

>> ---

>>

>> basti@nanopct4:~$ v4l2-compliance v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t

>> v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02

>

>Thanks for running the test.

>

>>

>> Compliance test for rkisp1 device /dev/video0:

>

>

>This is only testing video0 (rkisp1-capture) but enum_frame_size is in the isp node.

>Please run v4l2-compliance in the isp node as well. iirc you can use the -m option

>to test the whole tree.


Oh, thanks a lot for pointing me to that test, as it actually reports
errors. :(
I am just not sure if these errors are problematic as pad 0 & pad 2
work as intended, while pad 1 & pad 3 report errors.
My goal would actually be if they report that they don't support the
FRAMESIZES.
What do you think?

basti@nanopct4:~$ v4l2-compliance -d /dev/v4l-subdev0
...
Compliance test for rkisp1 device /dev/v4l-subdev0:

Media Driver Info:
	Driver name      : rkisp1
	Model            : rkisp1
	Serial           : 
	Bus info         : platform:rkisp1
	Media version    : 5.10.0
	Hardware revision: 0x00000000 (0)
	Driver version   : 5.10.0
Interface Info:
	ID               : 0x0300002c
	Type             : V4L Sub-Device
Entity Info:
	ID               : 0x00000001 (1)
	Name             : rkisp1_isp
	Function         : Video Pixel Formatter
	Pad 0x01000002   : 0: Sink, Must Connect
	  Link 0x0200001e: from remote pad 0x100001d of entity 'ov13850 1-0010': Data, Enabled
	Pad 0x01000003   : 1: Sink
	  Link 0x02000028: from remote pad 0x1000019 of entity 'rkisp1_params': Data, Enabled, Immutable
	Pad 0x01000004   : 2: Source
	  Link 0x02000020: to remote pad 0x1000007 of entity 'rkisp1_resizer_mainpath': Data, Enabled
	  Link 0x02000024: to remote pad 0x100000a of entity 'rkisp1_resizer_selfpath': Data, Enabled
	Pad 0x01000005   : 3: Source
	  Link 0x0200002a: to remote pad 0x1000015 of entity 'rkisp1_stats': Data, Enabled, Immutable

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

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

	test invalid ioctls: 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):
	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
	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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Sink Pad 1):
		fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)
		fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY
	test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL
		fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536
		fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)
	test Try VIDIOC_SUBDEV_G/S_FMT: FAIL
	test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
		fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)
		fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY
	test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL
		fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536
		fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)
	test Active VIDIOC_SUBDEV_G/S_FMT: FAIL
	test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
	test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 2):
	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
	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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

Sub-Device ioctls (Source Pad 3):
		fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)
		fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY
	test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL
		fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536
		fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)
	test Try VIDIOC_SUBDEV_G/S_FMT: FAIL
	test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
		fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)
		fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY
	test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL
		fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536
		fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)
	test Active VIDIOC_SUBDEV_G/S_FMT: FAIL
	test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)
	test 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 VIDIOC_EXPBUF: OK (Not Supported)
	test Requests: OK (Not Supported)

Total for rkisp1 device /dev/v4l-subdev0: 70, Succeeded: 62, Failed: 8, Warnings: 0


>

>Regards,

>Helen

>

>>

>> Driver Info:

>>     Driver name      : rkisp1

>>     Card type        : rkisp1

>>     Bus info         : platform:rkisp1

>>     Driver version   : 5.10.0

>>     Capabilities     : 0xa4201000

>>         Video Capture Multiplanar

>>         Streaming

>>         Extended Pix Format

>>         Device Capabilities

>>     Device Caps      : 0x24201000

>>         Video Capture Multiplanar

>>         Streaming

>>         Extended Pix Format

>> Media Driver Info:

>>     Driver name      : rkisp1

>>     Model            : rkisp1

>>     Serial           :

>>     Bus info         : platform:rkisp1

>>     Media version    : 5.10.0

>>     Hardware revision: 0x00000000 (0)

>>     Driver version   : 5.10.0

>> Interface Info:

>>     ID               : 0x0300000d

>>     Type             : V4L Video

>> Entity Info:

>>     ID               : 0x0000000c (12)

>>     Name             : rkisp1_mainpath

>>     Function         : V4L2 I/O

>>     Pad 0x0100000f   : 0: Sink

>>       Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

>>

>> Required ioctls:

>>     test MC information (see 'Media Driver Info' above): OK

>>     test VIDIOC_QUERYCAP: 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

>>

>>     test invalid ioctls: 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 VIDIOC_EXPBUF: OK

>>     test Requests: OK (Not Supported)

>>

>> Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

>>

>>>

>>>>

>>>> ---

>>>>

>>>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>>>  1 file changed, 39 insertions(+)

>>>>

>>>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>> index 889982d8ca41..fa7540155d71 100644

>>>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>>>

>>>>      return -EINVAL;

>>>>  }

>>>

>>> Please add a new line here

>>>

>>>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>>>> +                      struct v4l2_subdev_pad_config *cfg,

>>>> +                      struct v4l2_subdev_frame_size_enum *fse)

>>>> +{

>>>> +    int i;

>>>

>>> unsigned

>>>

>>>> +    bool code_match = false;

>>>> +

>>>> +    if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>>>> +        fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>>>> +        return -EINVAL;

>>>

>>>

>>>

>>>> +

>>>> +    if (fse->index > 0)> +        return -EINVAL;

>>>> +

>>>> +    for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>>>> +        const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>>>

>>> Can't you use function rkisp1_isp_mbus_info_get() ?

>>>

>>> Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>>>

>>> Thanks

>>> Helen

>>>

>>>> +

>>>> +        if (fmt->mbus_code == fse->code) {

>>>> +            code_match = true;

>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>>>> +                fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>>>> +                return -EINVAL;

>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>>>> +                fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>>>> +                return -EINVAL;

>>>> +        }

>>>> +    }

>>>> +

>>>> +    if (!code_match)

>>>> +        return -EINVAL;

>>>> +

>>>> +    fse->min_width = RKISP1_ISP_MIN_WIDTH;

>>>> +    fse->max_width = RKISP1_ISP_MAX_WIDTH;

>>>> +    fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>>>> +    fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>>>> +

>>>> +    return 0;

>>>> +}

>>>>

>>>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>>>                    struct v4l2_subdev_pad_config *cfg)

>>>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>>>

>>>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>>>      .enum_mbus_code = rkisp1_isp_enum_mbus_code,

>>>> +    .enum_frame_size = rkisp1_isp_enum_frame_size,

>>>>      .get_selection = rkisp1_isp_get_selection,

>>>>      .set_selection = rkisp1_isp_set_selection,

>>>>      .init_cfg = rkisp1_isp_init_config,

>>>>
Dafna Hirschfeld Dec. 10, 2020, 10:03 a.m. UTC | #5
Hi,

Am 10.12.20 um 06:03 schrieb Sebastian Fricke:
> On 09.12.2020 11:22, Helen Koike wrote:

>> Hi Sebastian,

>>

>> On 12/7/20 3:01 PM, Sebastian Fricke wrote:

>>> On 07.12.2020 08:33, Helen Koike wrote:

>>>> Hi Sebastian,

>>>>

>>>> Thanks for your patch.

>>>

>>> Hello Helen,

>>>

>>> I am very grateful for your review.

>>>

>>>>

>>>> On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>>>>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>>>>> code is valid for the given pad. This call is not available for the

>>>>> parameter or metadata pads of the RkISP1.

>>>>>

>>>>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>>>>> ---

>>>>>

>>>>> I have tested this patch with the following script:

>>>>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>>>>

>>>>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>>>>

>>>>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>>>>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>>>>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>>>>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>>>>

>>>>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>>>>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>>>>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>>>>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>>>>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>>>>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>>>>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>>>>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>>>>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>>>>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>>>>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>>>>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>>>>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>>>>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>>>>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>>>>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>>>>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>>>>> TEST 16: pad 1 - code 0x7001 - size /

>>>>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>>>>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>>>>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>>>>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>>>>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>>>>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>>>>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>>>>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>>>>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>>>>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>>>>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>>>>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>>>>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>>>>> TEST 30: pad 3 - code 0x7001 - size /

>>>>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>>>>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>>>>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>>>>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>>>>

>>>> Could you please also run v4l2-compliance ?

>>>

>>> Yes, it finished without errors here is the output.

>>>

>>> Greetings,

>>> Sebastian

>>>

>>> ---

>>>

>>> basti@nanopct4:~$ v4l2-compliance v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t

>>> v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02

>>

>> Thanks for running the test.

>>

>>>

>>> Compliance test for rkisp1 device /dev/video0:

>>

>>

>> This is only testing video0 (rkisp1-capture) but enum_frame_size is in the isp node.

>> Please run v4l2-compliance in the isp node as well. iirc you can use the -m option

>> to test the whole tree.

> 

> Oh, thanks a lot for pointing me to that test, as it actually reports

> errors. :(

> I am just not sure if these errors are problematic as pad 0 & pad 2

> work as intended, while pad 1 & pad 3 report errors.

> My goal would actually be if they report that they don't support the

> FRAMESIZES.

> What do you think?


Those failures are not related to your patch, you can ignore them.
They should be fixed with this v4l-utils patch:

https://www.spinics.net/lists/linux-media/msg179487.html

So you can just make sure that
the tests for pads 0,2 pass (which they do:) )

Thanks,
Dafna

> 

> basti@nanopct4:~$ v4l2-compliance -d /dev/v4l-subdev0

> ...

> Compliance test for rkisp1 device /dev/v4l-subdev0:

> 

> Media Driver Info:

>      Driver name      : rkisp1

>      Model            : rkisp1

>      Serial           :     Bus info         : platform:rkisp1

>      Media version    : 5.10.0

>      Hardware revision: 0x00000000 (0)

>      Driver version   : 5.10.0

> Interface Info:

>      ID               : 0x0300002c

>      Type             : V4L Sub-Device

> Entity Info:

>      ID               : 0x00000001 (1)

>      Name             : rkisp1_isp

>      Function         : Video Pixel Formatter

>      Pad 0x01000002   : 0: Sink, Must Connect

>        Link 0x0200001e: from remote pad 0x100001d of entity 'ov13850 1-0010': Data, Enabled

>      Pad 0x01000003   : 1: Sink

>        Link 0x02000028: from remote pad 0x1000019 of entity 'rkisp1_params': Data, Enabled, Immutable

>      Pad 0x01000004   : 2: Source

>        Link 0x02000020: to remote pad 0x1000007 of entity 'rkisp1_resizer_mainpath': Data, Enabled

>        Link 0x02000024: to remote pad 0x100000a of entity 'rkisp1_resizer_selfpath': Data, Enabled

>      Pad 0x01000005   : 3: Source

>        Link 0x0200002a: to remote pad 0x1000015 of entity 'rkisp1_stats': Data, Enabled, Immutable

> 

> Required ioctls:

>      test MC information (see 'Media Driver Info' above): OK

> 

> Allow for multiple opens:

>      test second /dev/v4l-subdev0 open: OK

>      test for unlimited opens: OK

> 

>      test invalid ioctls: 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):

>      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

>      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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Sink Pad 1):

>          fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>          fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>      test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>          fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>          fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>      test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>      test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>          fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>          fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>      test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>          fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>          fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>      test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>      test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>      test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Source Pad 2):

>      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

>      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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Source Pad 3):

>          fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>          fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>      test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>          fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>          fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>      test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>      test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>          fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>          fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>      test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>          fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>          fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>      test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>      test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>      test 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 VIDIOC_EXPBUF: OK (Not Supported)

>      test Requests: OK (Not Supported)

> 

> Total for rkisp1 device /dev/v4l-subdev0: 70, Succeeded: 62, Failed: 8, Warnings: 0

> 

> 

>>

>> Regards,

>> Helen

>>

>>>

>>> Driver Info:

>>>     Driver name      : rkisp1

>>>     Card type        : rkisp1

>>>     Bus info         : platform:rkisp1

>>>     Driver version   : 5.10.0

>>>     Capabilities     : 0xa4201000

>>>         Video Capture Multiplanar

>>>         Streaming

>>>         Extended Pix Format

>>>         Device Capabilities

>>>     Device Caps      : 0x24201000

>>>         Video Capture Multiplanar

>>>         Streaming

>>>         Extended Pix Format

>>> Media Driver Info:

>>>     Driver name      : rkisp1

>>>     Model            : rkisp1

>>>     Serial           :

>>>     Bus info         : platform:rkisp1

>>>     Media version    : 5.10.0

>>>     Hardware revision: 0x00000000 (0)

>>>     Driver version   : 5.10.0

>>> Interface Info:

>>>     ID               : 0x0300000d

>>>     Type             : V4L Video

>>> Entity Info:

>>>     ID               : 0x0000000c (12)

>>>     Name             : rkisp1_mainpath

>>>     Function         : V4L2 I/O

>>>     Pad 0x0100000f   : 0: Sink

>>>       Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

>>>

>>> Required ioctls:

>>>     test MC information (see 'Media Driver Info' above): OK

>>>     test VIDIOC_QUERYCAP: 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

>>>

>>>     test invalid ioctls: 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 VIDIOC_EXPBUF: OK

>>>     test Requests: OK (Not Supported)

>>>

>>> Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

>>>

>>>>

>>>>>

>>>>> ---

>>>>>

>>>>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>>>>  1 file changed, 39 insertions(+)

>>>>>

>>>>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> index 889982d8ca41..fa7540155d71 100644

>>>>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>>>>

>>>>>      return -EINVAL;

>>>>>  }

>>>>

>>>> Please add a new line here

>>>>

>>>>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>>>>> +                      struct v4l2_subdev_pad_config *cfg,

>>>>> +                      struct v4l2_subdev_frame_size_enum *fse)

>>>>> +{

>>>>> +    int i;

>>>>

>>>> unsigned

>>>>

>>>>> +    bool code_match = false;

>>>>> +

>>>>> +    if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>>>>> +        fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>>>>> +        return -EINVAL;

>>>>

>>>>

>>>>

>>>>> +

>>>>> +    if (fse->index > 0)> +        return -EINVAL;

>>>>> +

>>>>> +    for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>>>>> +        const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>>>>

>>>> Can't you use function rkisp1_isp_mbus_info_get() ?

>>>>

>>>> Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>>>>

>>>> Thanks

>>>> Helen

>>>>

>>>>> +

>>>>> +        if (fmt->mbus_code == fse->code) {

>>>>> +            code_match = true;

>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>>>>> +                fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>>>>> +                return -EINVAL;

>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>>>>> +                fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>>>>> +                return -EINVAL;

>>>>> +        }

>>>>> +    }

>>>>> +

>>>>> +    if (!code_match)

>>>>> +        return -EINVAL;

>>>>> +

>>>>> +    fse->min_width = RKISP1_ISP_MIN_WIDTH;

>>>>> +    fse->max_width = RKISP1_ISP_MAX_WIDTH;

>>>>> +    fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>>>>> +    fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>>>>> +

>>>>> +    return 0;

>>>>> +}

>>>>>

>>>>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>>>>                    struct v4l2_subdev_pad_config *cfg)

>>>>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>>>>

>>>>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>>>>      .enum_mbus_code = rkisp1_isp_enum_mbus_code,

>>>>> +    .enum_frame_size = rkisp1_isp_enum_frame_size,

>>>>>      .get_selection = rkisp1_isp_get_selection,

>>>>>      .set_selection = rkisp1_isp_set_selection,

>>>>>      .init_cfg = rkisp1_isp_init_config,

>>>>>
Helen Mae Koike Fornazier Dec. 10, 2020, 12:06 p.m. UTC | #6
On 12/10/20 2:03 AM, Sebastian Fricke wrote:
> On 09.12.2020 11:22, Helen Koike wrote:

>> Hi Sebastian,

>>

>> On 12/7/20 3:01 PM, Sebastian Fricke wrote:

>>> On 07.12.2020 08:33, Helen Koike wrote:

>>>> Hi Sebastian,

>>>>

>>>> Thanks for your patch.

>>>

>>> Hello Helen,

>>>

>>> I am very grateful for your review.

>>>

>>>>

>>>> On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>>>>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>>>>> code is valid for the given pad. This call is not available for the

>>>>> parameter or metadata pads of the RkISP1.

>>>>>

>>>>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>>>>> ---

>>>>>

>>>>> I have tested this patch with the following script:

>>>>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>>>>

>>>>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>>>>

>>>>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>>>>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>>>>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>>>>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>>>>

>>>>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>>>>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>>>>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>>>>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>>>>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>>>>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>>>>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>>>>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>>>>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>>>>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>>>>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>>>>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>>>>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>>>>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>>>>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>>>>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>>>>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>>>>> TEST 16: pad 1 - code 0x7001 - size /

>>>>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>>>>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>>>>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>>>>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>>>>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>>>>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>>>>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>>>>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>>>>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>>>>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>>>>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>>>>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>>>>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>>>>> TEST 30: pad 3 - code 0x7001 - size /

>>>>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>>>>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>>>>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>>>>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>>>>

>>>> Could you please also run v4l2-compliance ?

>>>

>>> Yes, it finished without errors here is the output.

>>>

>>> Greetings,

>>> Sebastian

>>>

>>> ---

>>>

>>> basti@nanopct4:~$ v4l2-compliance v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t

>>> v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02

>>

>> Thanks for running the test.

>>

>>>

>>> Compliance test for rkisp1 device /dev/video0:

>>

>>

>> This is only testing video0 (rkisp1-capture) but enum_frame_size is in the isp node.

>> Please run v4l2-compliance in the isp node as well. iirc you can use the -m option

>> to test the whole tree.

> 

> Oh, thanks a lot for pointing me to that test, as it actually reports

> errors. :(

> I am just not sure if these errors are problematic as pad 0 & pad 2

> work as intended, while pad 1 & pad 3 report errors.

> My goal would actually be if they report that they don't support the

> FRAMESIZES.

> What do you think?


Try returning -ENOTTY to indicate it isn't supported:
https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/gen-errors.html?highlight=enotty

> 

> basti@nanopct4:~$ v4l2-compliance -d /dev/v4l-subdev0

> ...

> Compliance test for rkisp1 device /dev/v4l-subdev0:

> 

> Media Driver Info:

>     Driver name      : rkisp1

>     Model            : rkisp1

>     Serial           :     Bus info         : platform:rkisp1

>     Media version    : 5.10.0

>     Hardware revision: 0x00000000 (0)

>     Driver version   : 5.10.0

> Interface Info:

>     ID               : 0x0300002c

>     Type             : V4L Sub-Device

> Entity Info:

>     ID               : 0x00000001 (1)

>     Name             : rkisp1_isp

>     Function         : Video Pixel Formatter

>     Pad 0x01000002   : 0: Sink, Must Connect

>       Link 0x0200001e: from remote pad 0x100001d of entity 'ov13850 1-0010': Data, Enabled

>     Pad 0x01000003   : 1: Sink

>       Link 0x02000028: from remote pad 0x1000019 of entity 'rkisp1_params': Data, Enabled, Immutable

>     Pad 0x01000004   : 2: Source

>       Link 0x02000020: to remote pad 0x1000007 of entity 'rkisp1_resizer_mainpath': Data, Enabled

>       Link 0x02000024: to remote pad 0x100000a of entity 'rkisp1_resizer_selfpath': Data, Enabled

>     Pad 0x01000005   : 3: Source

>       Link 0x0200002a: to remote pad 0x1000015 of entity 'rkisp1_stats': Data, Enabled, Immutable

> 

> Required ioctls:

>     test MC information (see 'Media Driver Info' above): OK

> 

> Allow for multiple opens:

>     test second /dev/v4l-subdev0 open: OK

>     test for unlimited opens: OK

> 

>     test invalid ioctls: 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):

>     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

>     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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Sink Pad 1):

>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>     test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>     test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>     test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>     test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>     test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>     test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>     test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Source Pad 2):

>     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

>     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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

> 

> Sub-Device ioctls (Source Pad 3):

>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>     test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>     test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>     test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>     test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>     test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>     test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>     test 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 VIDIOC_EXPBUF: OK (Not Supported)

>     test Requests: OK (Not Supported)

> 

> Total for rkisp1 device /dev/v4l-subdev0: 70, Succeeded: 62, Failed: 8, Warnings: 0

> 

> 

>>

>> Regards,

>> Helen

>>

>>>

>>> Driver Info:

>>>     Driver name      : rkisp1

>>>     Card type        : rkisp1

>>>     Bus info         : platform:rkisp1

>>>     Driver version   : 5.10.0

>>>     Capabilities     : 0xa4201000

>>>         Video Capture Multiplanar

>>>         Streaming

>>>         Extended Pix Format

>>>         Device Capabilities

>>>     Device Caps      : 0x24201000

>>>         Video Capture Multiplanar

>>>         Streaming

>>>         Extended Pix Format

>>> Media Driver Info:

>>>     Driver name      : rkisp1

>>>     Model            : rkisp1

>>>     Serial           :

>>>     Bus info         : platform:rkisp1

>>>     Media version    : 5.10.0

>>>     Hardware revision: 0x00000000 (0)

>>>     Driver version   : 5.10.0

>>> Interface Info:

>>>     ID               : 0x0300000d

>>>     Type             : V4L Video

>>> Entity Info:

>>>     ID               : 0x0000000c (12)

>>>     Name             : rkisp1_mainpath

>>>     Function         : V4L2 I/O

>>>     Pad 0x0100000f   : 0: Sink

>>>       Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

>>>

>>> Required ioctls:

>>>     test MC information (see 'Media Driver Info' above): OK

>>>     test VIDIOC_QUERYCAP: 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

>>>

>>>     test invalid ioctls: 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 VIDIOC_EXPBUF: OK

>>>     test Requests: OK (Not Supported)

>>>

>>> Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

>>>

>>>>

>>>>>

>>>>> ---

>>>>>

>>>>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>>>>  1 file changed, 39 insertions(+)

>>>>>

>>>>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> index 889982d8ca41..fa7540155d71 100644

>>>>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>>>>

>>>>>      return -EINVAL;

>>>>>  }

>>>>

>>>> Please add a new line here

>>>>

>>>>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>>>>> +                      struct v4l2_subdev_pad_config *cfg,

>>>>> +                      struct v4l2_subdev_frame_size_enum *fse)

>>>>> +{

>>>>> +    int i;

>>>>

>>>> unsigned

>>>>

>>>>> +    bool code_match = false;

>>>>> +

>>>>> +    if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>>>>> +        fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>>>>> +        return -EINVAL;


I mean here.

Regards,
Helen

>>>>

>>>>

>>>>

>>>>> +

>>>>> +    if (fse->index > 0)> +        return -EINVAL;

>>>>> +

>>>>> +    for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>>>>> +        const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>>>>

>>>> Can't you use function rkisp1_isp_mbus_info_get() ?

>>>>

>>>> Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>>>>

>>>> Thanks

>>>> Helen

>>>>

>>>>> +

>>>>> +        if (fmt->mbus_code == fse->code) {

>>>>> +            code_match = true;

>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>>>>> +                fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>>>>> +                return -EINVAL;

>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>>>>> +                fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>>>>> +                return -EINVAL;

>>>>> +        }

>>>>> +    }

>>>>> +

>>>>> +    if (!code_match)

>>>>> +        return -EINVAL;

>>>>> +

>>>>> +    fse->min_width = RKISP1_ISP_MIN_WIDTH;

>>>>> +    fse->max_width = RKISP1_ISP_MAX_WIDTH;

>>>>> +    fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>>>>> +    fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>>>>> +

>>>>> +    return 0;

>>>>> +}

>>>>>

>>>>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>>>>                    struct v4l2_subdev_pad_config *cfg)

>>>>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>>>>

>>>>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>>>>      .enum_mbus_code = rkisp1_isp_enum_mbus_code,

>>>>> +    .enum_frame_size = rkisp1_isp_enum_frame_size,

>>>>>      .get_selection = rkisp1_isp_get_selection,

>>>>>      .set_selection = rkisp1_isp_set_selection,

>>>>>      .init_cfg = rkisp1_isp_init_config,

>>>>>
Sebastian Fricke Dec. 10, 2020, 1:06 p.m. UTC | #7
On 10.12.2020 09:06, Helen Koike wrote:
>

>

>On 12/10/20 2:03 AM, Sebastian Fricke wrote:

>> On 09.12.2020 11:22, Helen Koike wrote:

>>> Hi Sebastian,

>>>

>>> On 12/7/20 3:01 PM, Sebastian Fricke wrote:

>>>> On 07.12.2020 08:33, Helen Koike wrote:

>>>>> Hi Sebastian,

>>>>>

>>>>> Thanks for your patch.

>>>>

>>>> Hello Helen,

>>>>

>>>> I am very grateful for your review.

>>>>

>>>>>

>>>>> On 12/6/20 2:39 AM, Sebastian Fricke wrote:

>>>>>> Implement the VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl, check if the mbus

>>>>>> code is valid for the given pad. This call is not available for the

>>>>>> parameter or metadata pads of the RkISP1.

>>>>>>

>>>>>> Signed-off-by: Sebastian Fricke <sebastian.fricke.linux@gmail.com>

>>>>>> ---

>>>>>>

>>>>>> I have tested this patch with the following script:

>>>>>> https://github.com/initBasti/Linux_kernel_media_tree_fork/commit/efc4b399cff53fb36fadde999594961a3d84073e

>>>>>>

>>>>>> The results on my NanoPC-T4 (Linux nanopct4 5.10.0-rc6-rockchip64):

>>>>>>

>>>>>> pad 0 = RKISP1_ISP_PAD_SINK_VIDEO

>>>>>> pad 1 = RKISP1_ISP_PAD_SINK_PARAMS

>>>>>> pad 2 = RKISP1_ISP_PAD_SOURCE_VIDEO

>>>>>> pad 3 = RKISP1_ISP_PAD_SOURCE_STATS

>>>>>>

>>>>>> basti@nanopct4:~$ python3 rkisp1_enum_frame_size_test.py

>>>>>> TEST  0: pad 0 - code 0x300f - size 32x32 - 4032x3024

>>>>>> TEST  1: pad 0 - code 0x3007 - size 32x32 - 4032x3024

>>>>>> TEST  2: pad 0 - code 0x300e - size 32x32 - 4032x3024

>>>>>> TEST  3: pad 0 - code 0x300a - size 32x32 - 4032x3024

>>>>>> TEST  4: pad 0 - code 0x3012 - size 32x32 - 4032x3024

>>>>>> TEST  5: pad 0 - code 0x3008 - size 32x32 - 4032x3024

>>>>>> TEST  6: pad 0 - code 0x3010 - size 32x32 - 4032x3024

>>>>>> TEST  7: pad 0 - code 0x3011 - size 32x32 - 4032x3024

>>>>>> TEST  8: pad 0 - code 0x3014 - size 32x32 - 4032x3024

>>>>>> TEST  9: pad 0 - code 0x3001 - size 32x32 - 4032x3024

>>>>>> TEST 10: pad 0 - code 0x3013 - size 32x32 - 4032x3024

>>>>>> TEST 11: pad 0 - code 0x3002 - size 32x32 - 4032x3024

>>>>>> TEST 12: pad 0 - code 0x2011 - size 32x32 - 4032x3024

>>>>>> TEST 13: pad 0 - code 0x2012 - size 32x32 - 4032x3024

>>>>>> TEST 14: pad 0 - code 0x200f - size 32x32 - 4032x3024

>>>>>> TEST 15: pad 0 - code 0x2010 - size 32x32 - 4032x3024

>>>>>> TEST 16: pad 1 - code 0x7001 - size /

>>>>>> TEST 17: pad 2 - code 0x2008 - size 32x32 - 4032x3024

>>>>>> TEST 18: pad 2 - code 0x300f - size 32x32 - 4032x3024

>>>>>> TEST 19: pad 2 - code 0x3007 - size 32x32 - 4032x3024

>>>>>> TEST 20: pad 2 - code 0x300e - size 32x32 - 4032x3024

>>>>>> TEST 21: pad 2 - code 0x300a - size 32x32 - 4032x3024

>>>>>> TEST 22: pad 2 - code 0x3012 - size 32x32 - 4032x3024

>>>>>> TEST 23: pad 2 - code 0x3008 - size 32x32 - 4032x3024

>>>>>> TEST 24: pad 2 - code 0x3010 - size 32x32 - 4032x3024

>>>>>> TEST 25: pad 2 - code 0x3011 - size 32x32 - 4032x3024

>>>>>> TEST 26: pad 2 - code 0x3014 - size 32x32 - 4032x3024

>>>>>> TEST 27: pad 2 - code 0x3001 - size 32x32 - 4032x3024

>>>>>> TEST 28: pad 2 - code 0x3013 - size 32x32 - 4032x3024

>>>>>> TEST 29: pad 2 - code 0x3002 - size 32x32 - 4032x3024

>>>>>> TEST 30: pad 3 - code 0x7001 - size /

>>>>>> TEST 31: pad 0 - code 0xdead - size / (test with an invalid media bus code)

>>>>>> TEST 32: pad 6 - code 0x300f - size / (test with an invalid pad)

>>>>>> TEST 33: pad 0 - code 0x2008 - size / (test with a format that is not supported by the pad)

>>>>>> TEST 34: pad 2 - code 0x2010 - size / (test with a format that is not supported by the pad)

>>>>>

>>>>> Could you please also run v4l2-compliance ?

>>>>

>>>> Yes, it finished without errors here is the output.

>>>>

>>>> Greetings,

>>>> Sebastian

>>>>

>>>> ---

>>>>

>>>> basti@nanopct4:~$ v4l2-compliance v4l2-compliance 1.21.0-4683, 64 bits, 64-bit time_t

>>>> v4l2-compliance SHA: 0aee9991e0c0 2020-12-01 09:48:02

>>>

>>> Thanks for running the test.

>>>

>>>>

>>>> Compliance test for rkisp1 device /dev/video0:

>>>

>>>

>>> This is only testing video0 (rkisp1-capture) but enum_frame_size is in the isp node.

>>> Please run v4l2-compliance in the isp node as well. iirc you can use the -m option

>>> to test the whole tree.

>>

>> Oh, thanks a lot for pointing me to that test, as it actually reports

>> errors. :(

>> I am just not sure if these errors are problematic as pad 0 & pad 2

>> work as intended, while pad 1 & pad 3 report errors.

>> My goal would actually be if they report that they don't support the

>> FRAMESIZES.

>> What do you think?

>

>Try returning -ENOTTY to indicate it isn't supported:

>https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/gen-errors.html?highlight=enotty


Ah great, I will include that in v3. Do you think that v2 requires any
other changes? Because if that is not the case, I can create v3 this
afternoon.

Thank you and greetings,
Sebastian

>

>>

>> basti@nanopct4:~$ v4l2-compliance -d /dev/v4l-subdev0

>> ...

>> Compliance test for rkisp1 device /dev/v4l-subdev0:

>>

>> Media Driver Info:

>>     Driver name      : rkisp1

>>     Model            : rkisp1

>>     Serial           :     Bus info         : platform:rkisp1

>>     Media version    : 5.10.0

>>     Hardware revision: 0x00000000 (0)

>>     Driver version   : 5.10.0

>> Interface Info:

>>     ID               : 0x0300002c

>>     Type             : V4L Sub-Device

>> Entity Info:

>>     ID               : 0x00000001 (1)

>>     Name             : rkisp1_isp

>>     Function         : Video Pixel Formatter

>>     Pad 0x01000002   : 0: Sink, Must Connect

>>       Link 0x0200001e: from remote pad 0x100001d of entity 'ov13850 1-0010': Data, Enabled

>>     Pad 0x01000003   : 1: Sink

>>       Link 0x02000028: from remote pad 0x1000019 of entity 'rkisp1_params': Data, Enabled, Immutable

>>     Pad 0x01000004   : 2: Source

>>       Link 0x02000020: to remote pad 0x1000007 of entity 'rkisp1_resizer_mainpath': Data, Enabled

>>       Link 0x02000024: to remote pad 0x100000a of entity 'rkisp1_resizer_selfpath': Data, Enabled

>>     Pad 0x01000005   : 3: Source

>>       Link 0x0200002a: to remote pad 0x1000015 of entity 'rkisp1_stats': Data, Enabled, Immutable

>>

>> Required ioctls:

>>     test MC information (see 'Media Driver Info' above): OK

>>

>> Allow for multiple opens:

>>     test second /dev/v4l-subdev0 open: OK

>>     test for unlimited opens: OK

>>

>>     test invalid ioctls: 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):

>>     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

>>     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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

>>

>> Sub-Device ioctls (Sink Pad 1):

>>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>>     test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>>     test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>>     test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>>     test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>>     test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>>     test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>>     test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

>>

>> Sub-Device ioctls (Source Pad 2):

>>     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

>>     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 VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported)

>>

>> Sub-Device ioctls (Source Pad 3):

>>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>>     test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>>     test Try VIDIOC_SUBDEV_G/S_FMT: FAIL

>>     test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>>         fail: v4l2-test-subdevs.cpp(139): doioctl(node, VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fse)

>>         fail: v4l2-test-subdevs.cpp(240): ret && ret != ENOTTY

>>     test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: FAIL

>>         fail: v4l2-test-subdevs.cpp(303): fmt.width == 0 || fmt.width > 65536

>>         fail: v4l2-test-subdevs.cpp(348): checkMBusFrameFmt(node, fmt.format)

>>     test Active VIDIOC_SUBDEV_G/S_FMT: FAIL

>>     test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported)

>>     test 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 VIDIOC_EXPBUF: OK (Not Supported)

>>     test Requests: OK (Not Supported)

>>

>> Total for rkisp1 device /dev/v4l-subdev0: 70, Succeeded: 62, Failed: 8, Warnings: 0

>>

>>

>>>

>>> Regards,

>>> Helen

>>>

>>>>

>>>> Driver Info:

>>>>     Driver name      : rkisp1

>>>>     Card type        : rkisp1

>>>>     Bus info         : platform:rkisp1

>>>>     Driver version   : 5.10.0

>>>>     Capabilities     : 0xa4201000

>>>>         Video Capture Multiplanar

>>>>         Streaming

>>>>         Extended Pix Format

>>>>         Device Capabilities

>>>>     Device Caps      : 0x24201000

>>>>         Video Capture Multiplanar

>>>>         Streaming

>>>>         Extended Pix Format

>>>> Media Driver Info:

>>>>     Driver name      : rkisp1

>>>>     Model            : rkisp1

>>>>     Serial           :

>>>>     Bus info         : platform:rkisp1

>>>>     Media version    : 5.10.0

>>>>     Hardware revision: 0x00000000 (0)

>>>>     Driver version   : 5.10.0

>>>> Interface Info:

>>>>     ID               : 0x0300000d

>>>>     Type             : V4L Video

>>>> Entity Info:

>>>>     ID               : 0x0000000c (12)

>>>>     Name             : rkisp1_mainpath

>>>>     Function         : V4L2 I/O

>>>>     Pad 0x0100000f   : 0: Sink

>>>>       Link 0x02000022: from remote pad 0x1000008 of entity 'rkisp1_resizer_mainpath': Data, Enabled, Immutable

>>>>

>>>> Required ioctls:

>>>>     test MC information (see 'Media Driver Info' above): OK

>>>>     test VIDIOC_QUERYCAP: 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

>>>>

>>>>     test invalid ioctls: 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 VIDIOC_EXPBUF: OK

>>>>     test Requests: OK (Not Supported)

>>>>

>>>> Total for rkisp1 device /dev/video0: 46, Succeeded: 46, Failed: 0, Warnings: 0

>>>>

>>>>>

>>>>>>

>>>>>> ---

>>>>>>

>>>>>>  .../platform/rockchip/rkisp1/rkisp1-isp.c     | 39 +++++++++++++++++++

>>>>>>  1 file changed, 39 insertions(+)

>>>>>>

>>>>>> diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>>> index 889982d8ca41..fa7540155d71 100644

>>>>>> --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>>> +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

>>>>>> @@ -599,6 +599,44 @@ static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,

>>>>>>

>>>>>>      return -EINVAL;

>>>>>>  }

>>>>>

>>>>> Please add a new line here

>>>>>

>>>>>> +static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,

>>>>>> +                      struct v4l2_subdev_pad_config *cfg,

>>>>>> +                      struct v4l2_subdev_frame_size_enum *fse)

>>>>>> +{

>>>>>> +    int i;

>>>>>

>>>>> unsigned

>>>>>

>>>>>> +    bool code_match = false;

>>>>>> +

>>>>>> +    if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||

>>>>>> +        fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)

>>>>>> +        return -EINVAL;

>

>I mean here.

>

>Regards,

>Helen

>

>>>>>

>>>>>

>>>>>

>>>>>> +

>>>>>> +    if (fse->index > 0)> +        return -EINVAL;

>>>>>> +

>>>>>> +    for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {

>>>>>> +        const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];

>>>>>

>>>>> Can't you use function rkisp1_isp_mbus_info_get() ?

>>>>>

>>>>> Check how rkisp1_isp_set_src_fmt() checks for a valid mbus code.

>>>>>

>>>>> Thanks

>>>>> Helen

>>>>>

>>>>>> +

>>>>>> +        if (fmt->mbus_code == fse->code) {

>>>>>> +            code_match = true;

>>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&

>>>>>> +                fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)

>>>>>> +                return -EINVAL;

>>>>>> +            if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&

>>>>>> +                fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)

>>>>>> +                return -EINVAL;

>>>>>> +        }

>>>>>> +    }

>>>>>> +

>>>>>> +    if (!code_match)

>>>>>> +        return -EINVAL;

>>>>>> +

>>>>>> +    fse->min_width = RKISP1_ISP_MIN_WIDTH;

>>>>>> +    fse->max_width = RKISP1_ISP_MAX_WIDTH;

>>>>>> +    fse->min_height = RKISP1_ISP_MIN_HEIGHT;

>>>>>> +    fse->max_height = RKISP1_ISP_MAX_HEIGHT;

>>>>>> +

>>>>>> +    return 0;

>>>>>> +}

>>>>>>

>>>>>>  static int rkisp1_isp_init_config(struct v4l2_subdev *sd,

>>>>>>                    struct v4l2_subdev_pad_config *cfg)

>>>>>> @@ -880,6 +918,7 @@ static int rkisp1_subdev_link_validate(struct media_link *link)

>>>>>>

>>>>>>  static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {

>>>>>>      .enum_mbus_code = rkisp1_isp_enum_mbus_code,

>>>>>> +    .enum_frame_size = rkisp1_isp_enum_frame_size,

>>>>>>      .get_selection = rkisp1_isp_get_selection,

>>>>>>      .set_selection = rkisp1_isp_set_selection,

>>>>>>      .init_cfg = rkisp1_isp_init_config,

>>>>>>
diff mbox series

Patch

diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
index 889982d8ca41..fa7540155d71 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
@@ -599,6 +599,44 @@  static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,
 
 	return -EINVAL;
 }
+static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_size_enum *fse)
+{
+	int i;
+	bool code_match = false;
+
+	if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||
+	    fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)
+		return -EINVAL;
+
+	if (fse->index > 0)
+		return -EINVAL;
+
+	for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
+		const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
+
+		if (fmt->mbus_code == fse->code) {
+			code_match = true;
+			if (!(fmt->direction & RKISP1_ISP_SD_SINK) &&
+			    fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)
+				return -EINVAL;
+			if (!(fmt->direction & RKISP1_ISP_SD_SRC) &&
+			    fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
+				return -EINVAL;
+		}
+	}
+
+	if (!code_match)
+		return -EINVAL;
+
+	fse->min_width = RKISP1_ISP_MIN_WIDTH;
+	fse->max_width = RKISP1_ISP_MAX_WIDTH;
+	fse->min_height = RKISP1_ISP_MIN_HEIGHT;
+	fse->max_height = RKISP1_ISP_MAX_HEIGHT;
+
+	return 0;
+}
 
 static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
 				  struct v4l2_subdev_pad_config *cfg)
@@ -880,6 +918,7 @@  static int rkisp1_subdev_link_validate(struct media_link *link)
 
 static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
 	.enum_mbus_code = rkisp1_isp_enum_mbus_code,
+	.enum_frame_size = rkisp1_isp_enum_frame_size,
 	.get_selection = rkisp1_isp_get_selection,
 	.set_selection = rkisp1_isp_set_selection,
 	.init_cfg = rkisp1_isp_init_config,