Re: [PATCH v8 05/14] media: rkisp1: add Rockchip ISP1 subdev driver
From: Dafna Hirschfeld <hidden>
Date: 2020-03-25 08:52:11
Also in:
linux-devicetree, linux-media, linux-rockchip, lkml
On Wed, Mar 25, 2020 at 8:12 AM Laurent Pinchart [off-list ref] wrote:
Hi Dafna, On Wed, Mar 25, 2020 at 07:34:37AM +0100, Dafna Hirschfeld wrote:quoted
On Thu, Aug 15, 2019 at 10:17 PM Laurent Pinchart wrote:quoted
On Wed, Aug 07, 2019 at 12:39:17PM +0200, Hans Verkuil wrote:quoted
On 8/6/19 8:51 PM, Helen Koike wrote:quoted
On 7/30/19 3:42 PM, Helen Koike wrote:quoted
From: Jacob Chen <redacted> Add the subdev driver for rockchip isp1. Signed-off-by: Jacob Chen <redacted> Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com> Signed-off-by: Yichong Zhong <redacted> Signed-off-by: Jacob Chen <redacted> Signed-off-by: Eddie Cai <redacted> Signed-off-by: Jeffy Chen <redacted> Signed-off-by: Allon Huang <redacted> Signed-off-by: Tomasz Figa <tfiga@chromium.org> [fixed unknown entity type / switched to PIXEL_RATE] Signed-off-by: Ezequiel Garcia <redacted> [update for upstream] Signed-off-by: Helen Koike <redacted> --- Changes in v8: None Changes in v7: - fixed warning because of unknown entity type - fixed v4l2-compliance errors regarding rkisp1 formats, try formats and default values - fix typo riksp1/rkisp1 - redesign: remove mipi/csi subdevice, sensors connect directly to the isp subdevice in the media topology now. As a consequence, remove the hack in mipidphy_g_mbus_config() where information from the sensor was being propagated through the topology. - From the old dphy: * cache get_remote_sensor() in s_stream * use V4L2_CID_PIXEL_RATE instead of V4L2_CID_LINK_FREQ - Replace stream state with a boolean - code styling and checkpatch fixes - fix stop_stream (return after calling stop, do not reenable the stream) - fix rkisp1_isp_sd_get_selection when V4L2_SUBDEV_FORMAT_TRY is set - fix get format in output (isp_sd->out_fmt.mbus_code was being ignored) - s/intput/input - remove #define sd_to_isp_sd(_sd), add a static inline as it will be reused by the capture drivers/media/platform/rockchip/isp1/rkisp1.c | 1286 +++++++++++++++++ drivers/media/platform/rockchip/isp1/rkisp1.h | 111 ++ 2 files changed, 1397 insertions(+) create mode 100644 drivers/media/platform/rockchip/isp1/rkisp1.c create mode 100644 drivers/media/platform/rockchip/isp1/rkisp1.hdiff --git a/drivers/media/platform/rockchip/isp1/rkisp1.c b/drivers/media/platform/rockchip/isp1/rkisp1.c new file mode 100644 index 000000000000..6d0c0ffb5e03 --- /dev/null +++ b/drivers/media/platform/rockchip/isp1/rkisp1.c@@ -0,0 +1,1286 @@<snip>quoted
quoted
+static int rkisp1_isp_sd_get_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *fmt) +{ + struct rkisp1_isp_subdev *isp_sd = sd_to_isp_sd(sd); + struct v4l2_mbus_framefmt *mf = &fmt->format; + + if ((fmt->pad != RKISP1_ISP_PAD_SINK) && + (fmt->pad != RKISP1_ISP_PAD_SOURCE_PATH)) { + fmt->format.code = MEDIA_BUS_FMT_FIXED; + /* + * NOTE: setting a format here doesn't make much sense + * but v4l2-compliance complains + */ + fmt->format.width = RKISP1_DEFAULT_WIDTH; + fmt->format.height = RKISP1_DEFAULT_HEIGHT;As I had mentioned to you, this is called for the isp pads connected to the DMA engines for statistics and parameters (meta data). If I remove those, I get the following errors: Sub-Device ioctls (Sink Pad 1): test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK fail: v4l2-test-subdevs.cpp(311): fmt.width == 0 || fmt.width > 65536 fail: v4l2-test-subdevs.cpp(356): checkMBusFrameFmt(node, fmt.format) test Try VIDIOC_SUBDEV_G/S_FMT: FAIL test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK fail: v4l2-test-subdevs.cpp(311): fmt.width == 0 || fmt.width > 65536 fail: v4l2-test-subdevs.cpp(356): checkMBusFrameFmt(node, fmt.format) test Active VIDIOC_SUBDEV_G/S_FMT: FAIL test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported) Here is the full log: http://ix.io/1QNt Is this a bug in v4l2-compliance?Yes and no :-) Currently v4l2-compliance assumes that only video is transferred over a media bus. But that's not the case here, and testing the code field doesn't help v4l2-compliance since MEDIA_BUS_FMT_FIXED is also still used by some older subdev drivers for video. I think we need a new bus format: MEDIA_BUS_FMT_FIXED_METADATA. Then v4l2-compliance can tell it apart from the regular fixed video bus format.Wouldn't a pad flag that identifies the type of data transmitted by a pad be a better, backward-compatible option ? This could be useful for audio as well.Hi, Can you explain what pad flag do you mean? Do you mean adding a flag in the 'MEDIA_LNK_FL_*' list ?I meant MEDIA_PAD_FL_*. We could reserve a few bits in media_pad_desc.flags to tell what type of data is being transported.
So the idea is that when the MBUS format is MEDIA_BUS_FMT_FIXED, then userspace should look at the flags of the pad to see what format is it? So if I add a flag 'MEDIA_PAD_FL_METADATA' it knows it is a metadata ? What makes is more backward-comaptible ?
quoted
Also, some valid value should be set to 'fmt->format.code' so with the flags solution that you suggest it should stay MEDIA_BUS_FMT_FIXED ?Correct.quoted
quoted
quoted
If I do a 'git grep MEDIA_BUS_FMT_FIXED' then I see that it is also in use by vsp1 for histogram information, so that should also be converted to use the new FIXED_METADATA format, although that might be too late (there might be userspace complications).Yes, probably not a good idea.quoted
quoted
quoted
+ fmt->format.field = V4L2_FIELD_NONE; + return 0; + } + + if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { + mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); + fmt->format = *mf; + return 0; + } + + if (fmt->pad == RKISP1_ISP_PAD_SINK) { + *mf = isp_sd->in_frm; + } else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_PATH) { + /* format of source pad */ + *mf = isp_sd->in_frm; + mf->code = isp_sd->out_fmt.mbus_code; + /* window size of source pad */ + mf->width = isp_sd->out_crop.width; + mf->height = isp_sd->out_crop.height; + mf->quantization = isp_sd->quantization; + } + mf->field = V4L2_FIELD_NONE; + + return 0; +}-- Regards, Laurent Pinchart
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel