Message ID | 20201205134125.11115-1-sebastian.fricke.linux@gmail.com |
---|---|
State | Not Applicable |
Headers | show |
Series |
|
Related | show |
Sorry for polluting the mailing list! I send this to the correct receiver now. On 05.12.2020 14:41, 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) > >--- > > .../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; > } >+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, >-- >2.20.1 >
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,
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(+)