[v3,16/17] media: ipu6/isys: support line-based metadata capture support
Commit Message
From: Bingbu Cao <bingbu.cao@intel.com>
Some camera sensor can output the embedded data in specific
data type. This patch add the support for embedded data capture
in IPU6 IS driver.
It's based on Sakari's line-based metadata capture support change:
<URL:https://git.linuxtv.org/sailus/media_tree.git/log/?h=metadata>
Signed-off-by: Hongju Wang <hongju.wang@intel.com>
Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
---
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 5 +
.../media/pci/intel/ipu6/ipu6-isys-queue.c | 44 ++--
.../media/pci/intel/ipu6/ipu6-isys-subdev.c | 5 +
.../media/pci/intel/ipu6/ipu6-isys-video.c | 201 +++++++++++++++---
.../media/pci/intel/ipu6/ipu6-isys-video.h | 7 +-
5 files changed, 216 insertions(+), 46 deletions(-)
Comments
Hi Bingbu,
Thank you for the update.
On Thu, Jan 11, 2024 at 02:55:30PM +0800, bingbu.cao@intel.com wrote:
> From: Bingbu Cao <bingbu.cao@intel.com>
>
> Some camera sensor can output the embedded data in specific
> data type. This patch add the support for embedded data capture
> in IPU6 IS driver.
>
> It's based on Sakari's line-based metadata capture support change:
> <URL:https://git.linuxtv.org/sailus/media_tree.git/log/?h=metadata>
>
> Signed-off-by: Hongju Wang <hongju.wang@intel.com>
> Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
> ---
> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c | 5 +
> .../media/pci/intel/ipu6/ipu6-isys-queue.c | 44 ++--
> .../media/pci/intel/ipu6/ipu6-isys-subdev.c | 5 +
> .../media/pci/intel/ipu6/ipu6-isys-video.c | 201 +++++++++++++++---
> .../media/pci/intel/ipu6/ipu6-isys-video.h | 7 +-
> 5 files changed, 216 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> index ac9fa3e0d7ab..a6430d531129 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
> @@ -42,6 +42,11 @@ static const u32 csi2_supported_codes[] = {
> MEDIA_BUS_FMT_SGBRG8_1X8,
> MEDIA_BUS_FMT_SGRBG8_1X8,
> MEDIA_BUS_FMT_SRGGB8_1X8,
> + MEDIA_BUS_FMT_META_8,
> + MEDIA_BUS_FMT_META_10,
> + MEDIA_BUS_FMT_META_12,
> + MEDIA_BUS_FMT_META_16,
> + MEDIA_BUS_FMT_META_24,
> 0
> };
>
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
> index 735d2d642d87..15fa7ed22b2f 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-queue.c
> @@ -35,11 +35,14 @@ static int queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
> /* num_planes == 0: we're being called through VIDIOC_REQBUFS */
> if (!*num_planes) {
> use_fmt = true;
> - *num_planes = av->mpix.num_planes;
> + if (av->vfmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + *num_planes = av->vfmt.fmt.pix_mp.num_planes;
> + else if (av->vfmt.type == V4L2_BUF_TYPE_META_CAPTURE)
> + *num_planes = 1;
> }
>
> for (i = 0; i < *num_planes; i++) {
> - size = av->mpix.plane_fmt[i].sizeimage;
> + size = ipu6_get_data_size(&av->vfmt, i);
> if (use_fmt) {
> sizes[i] = size;
> } else if (sizes[i] < size) {
> @@ -59,16 +62,17 @@ static int ipu6_isys_buf_prepare(struct vb2_buffer *vb)
> struct ipu6_isys_queue *aq = vb2_queue_to_isys_queue(vb->vb2_queue);
> struct ipu6_isys_video *av = ipu6_isys_queue_to_video(aq);
> struct device *dev = &av->isys->adev->auxdev.dev;
> + u32 bytesperline = ipu6_get_bytes_per_line(&av->vfmt);
> + u32 height = ipu6_get_frame_height(&av->vfmt);
> + u32 size = ipu6_get_data_size(&av->vfmt, 0);
>
> dev_dbg(dev, "buffer: %s: configured size %u, buffer size %lu\n",
> - av->vdev.name, av->mpix.plane_fmt[0].sizeimage,
> - vb2_plane_size(vb, 0));
> + av->vdev.name, size, vb2_plane_size(vb, 0));
>
> - if (av->mpix.plane_fmt[0].sizeimage > vb2_plane_size(vb, 0))
> + if (size > vb2_plane_size(vb, 0))
> return -EINVAL;
>
> - vb2_set_plane_payload(vb, 0, av->mpix.plane_fmt[0].bytesperline *
> - av->mpix.height);
> + vb2_set_plane_payload(vb, 0, bytesperline * height);
> vb->planes[0].data_offset = 0;
>
> return 0;
> @@ -437,18 +441,22 @@ static int ipu6_isys_link_fmt_validate(struct ipu6_isys_queue *aq)
> return ret;
> }
>
> - if (format.width != av->mpix.width ||
> - format.height != av->mpix.height) {
> - dev_dbg(dev, "wrong width or height %ux%u (%ux%u expected)\n",
> - av->mpix.width, av->mpix.height,
> - format.width, format.height);
> + if (format.width != ipu6_get_frame_width(&av->vfmt) ||
> + format.height != ipu6_get_frame_height(&av->vfmt)) {
> + dev_err(dev, "wrong width or height %ux%u (%ux%u expected)\n",
> + ipu6_get_frame_width(&av->vfmt),
> + ipu6_get_frame_height(&av->vfmt), format.width,
> + format.height);
> return -EINVAL;
> }
>
> - if (format.field != av->mpix.field) {
> - dev_dbg(dev, "wrong field value 0x%8.8x (0x%8.8x expected)\n",
> - av->mpix.field, format.field);
> - return -EINVAL;
> + if (av->vfmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
> + if (format.field != av->vfmt.fmt.pix_mp.field) {
You could merge the if clauses.
Speaking of the field --- is there a need to check this in buf_prepare()?
Isn't this what the driver sets? So I'd address this in an earlier patch
that adds the check.
> + dev_dbg(dev,
> + "wrong field value 0x%8.8x (%8.8x expected)\n",
> + av->vfmt.fmt.pix_mp.field, format.field);
> + return -EINVAL;
> + }
> }
>
> if (format.code != av->pfmt->code) {
> @@ -531,8 +539,8 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
> int nr_queues, ret;
>
> dev_dbg(dev, "stream: %s: width %u, height %u, css pixelformat %u\n",
> - av->vdev.name, av->mpix.width, av->mpix.height,
> - av->pfmt->css_pixelformat);
> + av->vdev.name, ipu6_get_frame_width(&av->vfmt),
> + ipu6_get_frame_height(&av->vfmt), av->pfmt->css_pixelformat);
>
> ret = ipu6_isys_setup_video(av, &source_entity, &nr_queues);
> if (ret < 0) {
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> index 510c5ca34f9f..3c9263ac02a3 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
> @@ -20,25 +20,30 @@ unsigned int ipu6_isys_mbus_code_to_bpp(u32 code)
> {
> switch (code) {
> case MEDIA_BUS_FMT_RGB888_1X24:
> + case MEDIA_BUS_FMT_META_24:
> return 24;
> case MEDIA_BUS_FMT_RGB565_1X16:
> case MEDIA_BUS_FMT_UYVY8_1X16:
> case MEDIA_BUS_FMT_YUYV8_1X16:
> + case MEDIA_BUS_FMT_META_16:
> return 16;
> case MEDIA_BUS_FMT_SBGGR12_1X12:
> case MEDIA_BUS_FMT_SGBRG12_1X12:
> case MEDIA_BUS_FMT_SGRBG12_1X12:
> case MEDIA_BUS_FMT_SRGGB12_1X12:
> + case MEDIA_BUS_FMT_META_12:
> return 12;
> case MEDIA_BUS_FMT_SBGGR10_1X10:
> case MEDIA_BUS_FMT_SGBRG10_1X10:
> case MEDIA_BUS_FMT_SGRBG10_1X10:
> case MEDIA_BUS_FMT_SRGGB10_1X10:
> + case MEDIA_BUS_FMT_META_10:
> return 10;
> case MEDIA_BUS_FMT_SBGGR8_1X8:
> case MEDIA_BUS_FMT_SGBRG8_1X8:
> case MEDIA_BUS_FMT_SGRBG8_1X8:
> case MEDIA_BUS_FMT_SRGGB8_1X8:
> + case MEDIA_BUS_FMT_META_8:
> return 8;
> default:
> WARN_ON(1);
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
> index 847eac26bcd6..1a023bf1e1a6 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.c
> @@ -85,6 +85,11 @@ const struct ipu6_isys_pixelformat ipu6_isys_pfmts[] = {
> IPU6_FW_ISYS_FRAME_FORMAT_RGB565},
> {V4L2_PIX_FMT_BGR24, 24, 24, MEDIA_BUS_FMT_RGB888_1X24,
> IPU6_FW_ISYS_FRAME_FORMAT_RGBA888},
> + {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
> + {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
> + {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
> + {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
> + {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
> };
>
> static int video_open(struct file *file)
> @@ -181,12 +186,12 @@ static int ipu6_isys_vidioc_enum_framesizes(struct file *file, void *fh,
> return 0;
> }
>
> -static int vidioc_g_fmt_vid_cap_mplane(struct file *file, void *fh,
> - struct v4l2_format *fmt)
> +static int vidioc_get_format(struct file *file, void *fh,
> + struct v4l2_format *fmt)
> {
> struct ipu6_isys_video *av = video_drvdata(file);
>
> - fmt->fmt.pix_mp = av->mpix;
> + *fmt = av->vfmt;
>
> return 0;
> }
> @@ -245,30 +250,114 @@ ipu6_isys_video_try_fmt_vid_mplane(struct ipu6_isys_video *av,
> return pfmt;
> }
>
> -static int vidioc_s_fmt_vid_cap_mplane(struct file *file, void *fh,
> - struct v4l2_format *f)
> +static const struct ipu6_isys_pixelformat *
> +ipu6_isys_video_try_fmt_meta(struct ipu6_isys_video *av,
> + struct v4l2_meta_format *meta)
> +{
> + const struct ipu6_isys_pixelformat *pfmt =
> + ipu6_isys_get_pixelformat(meta->dataformat);
> +
> + memset(&av->vfmt, 0, sizeof(av->vfmt));
> + av->vfmt.type = V4L2_BUF_TYPE_META_CAPTURE;
> + av->pfmt = pfmt;
> +
> + meta->dataformat = pfmt->pixelformat;
> + meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
> + IPU6_ISYS_MAX_WIDTH);
> + meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
> + IPU6_ISYS_MAX_HEIGHT);
> +
> + if (pfmt->bpp != pfmt->bpp_packed)
> + meta->bytesperline = meta->width *
> + DIV_ROUND_UP(pfmt->bpp, BITS_PER_BYTE);
> + else
> + meta->bytesperline =
> + DIV_ROUND_UP(meta->width * pfmt->bpp, BITS_PER_BYTE);
> +
> + meta->bytesperline = ALIGN(meta->bytesperline, av->isys->line_align);
> + meta->buffersize =
> + max(max(meta->buffersize, meta->bytesperline * meta->height +
> + max(meta->bytesperline,
> + av->isys->pdata->ipdata->isys_dma_overshoot)), 1U);
> +
> + return pfmt;
> +}
> +
> +static const struct ipu6_isys_pixelformat *
> +ipu6_isys_video_try_fmt(struct ipu6_isys_video *av, struct v4l2_format *f)
> +{
> + if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + return ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
> + else if (f->type == V4L2_BUF_TYPE_META_CAPTURE)
> + return ipu6_isys_video_try_fmt_meta(av, &f->fmt.meta);
> + else
> + return &ipu6_isys_pfmts[0];
> +}
> +
> +static int vidioc_set_format(struct file *file, void *fh,
> + struct v4l2_format *f)
> {
> struct ipu6_isys_video *av = video_drvdata(file);
>
> if (av->aq.vbq.streaming)
> return -EBUSY;
>
> - av->pfmt = ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
> - av->mpix = f->fmt.pix_mp;
> + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
> + f->type != V4L2_BUF_TYPE_META_CAPTURE)
> + return -EINVAL;
> +
> + av->pfmt = ipu6_isys_video_try_fmt(av, f);
> + av->vfmt = *f;
>
> return 0;
> }
>
> -static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *fh,
> - struct v4l2_format *f)
> +static int vidioc_try_format(struct file *file, void *fh,
> + struct v4l2_format *f)
> {
> struct ipu6_isys_video *av = video_drvdata(file);
>
> - ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
> + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
> + f->type != V4L2_BUF_TYPE_META_CAPTURE)
> + return -EINVAL;
> +
> + ipu6_isys_video_try_fmt(av, f);
>
> return 0;
> }
>
> +static int vidioc_request_qbufs(struct file *file, void *priv,
> + struct v4l2_requestbuffers *p)
> +{
> + struct ipu6_isys_video *av = video_drvdata(file);
> + int ret;
> +
> + av->aq.vbq.is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(p->type);
> + av->aq.vbq.is_output = V4L2_TYPE_IS_OUTPUT(p->type);
> +
> + ret = vb2_queue_change_type(&av->aq.vbq, p->type);
> + if (ret)
> + return ret;
> +
> + return vb2_ioctl_reqbufs(file, priv, p);
> +}
> +
> +static int vidioc_create_bufs(struct file *file, void *priv,
> + struct v4l2_create_buffers *p)
> +{
> + struct ipu6_isys_video *av = video_drvdata(file);
> + int ret;
> +
> + av->aq.vbq.is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(p->format.type);
> + av->aq.vbq.is_output = V4L2_TYPE_IS_OUTPUT(p->format.type);
> +
> + ret = vb2_queue_change_type(&av->aq.vbq, p->format.type);
> + if (ret)
> + return ret;
> +
> + return vb2_ioctl_create_bufs(file, priv, p);
> +}
> +
> static int link_validate(struct media_link *link)
> {
> struct ipu6_isys_video *av =
> @@ -279,6 +368,8 @@ static int link_validate(struct media_link *link)
> struct v4l2_mbus_framefmt *s_fmt;
> struct media_pad *s_pad;
> u32 s_stream;
> + u32 height;
> + u32 width;
> int ret = -EPIPE;
>
> if (!link->source->entity)
> @@ -305,11 +396,13 @@ static int link_validate(struct media_link *link)
> goto unlock;
> }
>
> - if (s_fmt->width != av->mpix.width ||
> - s_fmt->height != av->mpix.height || s_fmt->code != av->pfmt->code) {
> + height = ipu6_get_frame_height(&av->vfmt);
> + width = ipu6_get_frame_width(&av->vfmt);
> + if (s_fmt->width != width || s_fmt->height != height ||
> + s_fmt->code != av->pfmt->code) {
> dev_err(dev, "format mismatch %dx%d,%x != %dx%d,%x\n",
> - s_fmt->width, s_fmt->height, s_fmt->code,
> - av->mpix.width, av->mpix.height, av->pfmt->code);
> + s_fmt->width, s_fmt->height, s_fmt->code, width, height,
> + av->pfmt->code);
> goto unlock;
> }
>
> @@ -393,10 +486,10 @@ static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
>
> output_pin = &cfg->output_pins[output_pins];
> output_pin->input_pin_id = input_pins;
> - output_pin->output_res.width = av->mpix.width;
> - output_pin->output_res.height = av->mpix.height;
> + output_pin->output_res.width = ipu6_get_frame_width(&av->vfmt);
> + output_pin->output_res.height = ipu6_get_frame_height(&av->vfmt);
>
> - output_pin->stride = av->mpix.plane_fmt[0].bytesperline;
> + output_pin->stride = ipu6_get_bytes_per_line(&av->vfmt);
> if (av->pfmt->bpp != av->pfmt->bpp_packed)
> output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_RAW_SOC;
> else
> @@ -663,8 +756,8 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
>
> esd = media_entity_to_v4l2_subdev(av->stream->source_entity);
>
> - av->watermark.width = av->mpix.width;
> - av->watermark.height = av->mpix.height;
> + av->watermark.width = ipu6_get_frame_width(&av->vfmt);
> + av->watermark.height = ipu6_get_frame_height(&av->vfmt);
> av->watermark.sram_gran_shift = isys->pdata->ipdata->sram_gran_shift;
> av->watermark.sram_gran_size = isys->pdata->ipdata->sram_gran_size;
>
> @@ -992,11 +1085,15 @@ static const struct v4l2_ioctl_ops ioctl_ops_mplane = {
> .vidioc_querycap = ipu6_isys_vidioc_querycap,
> .vidioc_enum_fmt_vid_cap = ipu6_isys_vidioc_enum_fmt,
> .vidioc_enum_framesizes = ipu6_isys_vidioc_enum_framesizes,
> - .vidioc_g_fmt_vid_cap_mplane = vidioc_g_fmt_vid_cap_mplane,
> - .vidioc_s_fmt_vid_cap_mplane = vidioc_s_fmt_vid_cap_mplane,
> - .vidioc_try_fmt_vid_cap_mplane = vidioc_try_fmt_vid_cap_mplane,
> - .vidioc_reqbufs = vb2_ioctl_reqbufs,
> - .vidioc_create_bufs = vb2_ioctl_create_bufs,
> + .vidioc_g_fmt_vid_cap_mplane = vidioc_get_format,
> + .vidioc_s_fmt_vid_cap_mplane = vidioc_set_format,
> + .vidioc_try_fmt_vid_cap_mplane = vidioc_try_format,
> + .vidioc_enum_fmt_meta_cap = ipu6_isys_vidioc_enum_fmt,
> + .vidioc_g_fmt_meta_cap = vidioc_get_format,
> + .vidioc_s_fmt_meta_cap = vidioc_set_format,
> + .vidioc_try_fmt_meta_cap = vidioc_try_format,
> + .vidioc_reqbufs = vidioc_request_qbufs,
> + .vidioc_create_bufs = vidioc_create_bufs,
> .vidioc_prepare_buf = vb2_ioctl_prepare_buf,
> .vidioc_querybuf = vb2_ioctl_querybuf,
> .vidioc_qbuf = vb2_ioctl_qbuf,
> @@ -1199,7 +1296,8 @@ int ipu6_isys_video_init(struct ipu6_isys_video *av)
>
> mutex_init(&av->mutex);
> av->vdev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_IO_MC |
> - V4L2_CAP_VIDEO_CAPTURE_MPLANE;
> + V4L2_CAP_VIDEO_CAPTURE_MPLANE |
> + V4L2_CAP_META_CAPTURE;
> av->vdev.vfl_dir = VFL_DIR_RX;
>
> ret = ipu6_isys_queue_init(&av->aq);
> @@ -1220,8 +1318,8 @@ int ipu6_isys_video_init(struct ipu6_isys_video *av)
> av->vdev.queue = &av->aq.vbq;
> av->vdev.lock = &av->mutex;
>
> - ipu6_isys_video_try_fmt_vid_mplane(av, &format.fmt.pix_mp);
> - av->mpix = format.fmt.pix_mp;
> + ipu6_isys_video_try_fmt(av, &format);
> + av->vfmt = format;
>
> set_bit(V4L2_FL_USES_V4L2_FH, &av->vdev.flags);
> video_set_drvdata(&av->vdev, av);
> @@ -1251,3 +1349,52 @@ void ipu6_isys_video_cleanup(struct ipu6_isys_video *av)
> media_entity_cleanup(&av->vdev.entity);
> mutex_destroy(&av->mutex);
> }
> +
> +u32 ipu6_get_data_size(struct v4l2_format *vfmt, int plane)
> +{
> + if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + return vfmt->fmt.pix_mp.plane_fmt[plane].sizeimage;
> + else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
Useless use of else. Same below.
> + return vfmt->fmt.meta.buffersize;
> +
> + WARN_ON_ONCE(1);
> +
> + return 0;
> +}
> +
> +u32 ipu6_get_bytes_per_line(struct v4l2_format *vfmt)
> +{
> + if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + return vfmt->fmt.pix_mp.plane_fmt[0].bytesperline;
> + else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
> + return vfmt->fmt.meta.bytesperline;
> +
> + WARN_ON_ONCE(1);
> +
> + return 0;
> +}
> +
> +u32 ipu6_get_frame_width(struct v4l2_format *vfmt)
> +{
> + if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + return vfmt->fmt.pix_mp.width;
> + else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
> + return vfmt->fmt.meta.width;
> +
> + WARN_ON_ONCE(1);
> +
> + return 0;
> +}
> +
> +u32 ipu6_get_frame_height(struct v4l2_format *vfmt)
> +{
> + if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
> + return vfmt->fmt.pix_mp.height;
> + else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
> + return vfmt->fmt.meta.height;
> +
> + WARN_ON_ONCE(1);
> +
> + return 0;
> +}
> +
> diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
> index 21cd33c7e277..2634ec0fd68b 100644
> --- a/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
> +++ b/drivers/media/pci/intel/ipu6/ipu6-isys-video.h
> @@ -90,7 +90,7 @@ struct ipu6_isys_video {
> struct mutex mutex;
> struct media_pad pad;
> struct video_device vdev;
> - struct v4l2_pix_format_mplane mpix;
> + struct v4l2_format vfmt;
> const struct ipu6_isys_pixelformat *pfmt;
> struct ipu6_isys *isys;
> struct ipu6_isys_stream *stream;
> @@ -133,4 +133,9 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
> bool state);
> void ipu6_isys_update_stream_watermark(struct ipu6_isys_video *av, bool state);
>
> +u32 ipu6_get_data_size(struct v4l2_format *vfmt, int plane);
> +u32 ipu6_get_bytes_per_line(struct v4l2_format *vfmt);
> +u32 ipu6_get_frame_width(struct v4l2_format *vfmt);
> +u32 ipu6_get_frame_height(struct v4l2_format *vfmt);
> +
> #endif /* IPU6_ISYS_VIDEO_H */
Hi,
kernel test robot noticed the following build errors:
[auto build test ERROR on media-tree/master]
[also build test ERROR on linuxtv-media-stage/master linus/master v6.7 next-20240111]
[cannot apply to sailus-media-tree/streams]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/bingbu-cao-intel-com/media-intel-ipu6-add-IPU-auxiliary-devices/20240111-155551
base: git://linuxtv.org/media_tree.git master
patch link: https://lore.kernel.org/r/20240111065531.2418836-17-bingbu.cao%40intel.com
patch subject: [PATCH v3 16/17] media: ipu6/isys: support line-based metadata capture support
config: x86_64-buildonly-randconfig-004-20240111 (https://download.01.org/0day-ci/archive/20240112/202401120528.5MY4pum6-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240112/202401120528.5MY4pum6-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401120528.5MY4pum6-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c: In function 'ipu6_isys_mbus_code_to_bpp':
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:23:14: error: 'MEDIA_BUS_FMT_META_24' undeclared (first use in this function); did you mean 'MEDIA_BUS_FMT_VUY8_1X24'?
23 | case MEDIA_BUS_FMT_META_24:
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_VUY8_1X24
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:23:14: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:28:14: error: 'MEDIA_BUS_FMT_META_16' undeclared (first use in this function); did you mean 'MEDIA_BUS_FMT_Y16_1X16'?
28 | case MEDIA_BUS_FMT_META_16:
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y16_1X16
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:34:14: error: 'MEDIA_BUS_FMT_META_12' undeclared (first use in this function); did you mean 'MEDIA_BUS_FMT_UV8_1X8'?
34 | case MEDIA_BUS_FMT_META_12:
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_UV8_1X8
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:40:14: error: 'MEDIA_BUS_FMT_META_10' undeclared (first use in this function); did you mean 'MEDIA_BUS_FMT_Y10_1X10'?
40 | case MEDIA_BUS_FMT_META_10:
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y10_1X10
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:46:14: error: 'MEDIA_BUS_FMT_META_8' undeclared (first use in this function); did you mean 'MEDIA_BUS_FMT_Y8_1X8'?
46 | case MEDIA_BUS_FMT_META_8:
| ^~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y8_1X8
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c: In function 'ipu6_isys_subdev_set_fmt':
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:159:15: error: implicit declaration of function 'v4l2_subdev_state_get_stream_format'; did you mean 'v4l2_subdev_state_get_format'? [-Werror=implicit-function-declaration]
159 | fmt = v4l2_subdev_state_get_stream_format(state, format->pad,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| v4l2_subdev_state_get_format
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:159:13: warning: assignment to 'struct v4l2_mbus_framefmt *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
159 | fmt = v4l2_subdev_state_get_stream_format(state, format->pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:185:16: error: implicit declaration of function 'v4l2_subdev_state_get_stream_crop'; did you mean 'v4l2_subdev_state_get_crop'? [-Werror=implicit-function-declaration]
185 | crop = v4l2_subdev_state_get_stream_crop(state, other_pad,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| v4l2_subdev_state_get_crop
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:185:14: warning: assignment to 'struct v4l2_rect *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
185 | crop = v4l2_subdev_state_get_stream_crop(state, other_pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c: In function 'ipu6_isys_get_stream_pad_fmt':
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:244:13: warning: assignment to 'struct v4l2_mbus_framefmt *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
244 | fmt = v4l2_subdev_state_get_stream_format(state, pad, stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c: In function 'ipu6_isys_get_stream_pad_crop':
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:262:14: warning: assignment to 'struct v4l2_rect *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
262 | rect = v4l2_subdev_state_get_stream_crop(state, pad, stream);
| ^
cc1: some warnings being treated as errors
--
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:45:9: error: 'MEDIA_BUS_FMT_META_8' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y8_1X8'?
45 | MEDIA_BUS_FMT_META_8,
| ^~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y8_1X8
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:46:9: error: 'MEDIA_BUS_FMT_META_10' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y10_1X10'?
46 | MEDIA_BUS_FMT_META_10,
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y10_1X10
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:47:9: error: 'MEDIA_BUS_FMT_META_12' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_UV8_1X8'?
47 | MEDIA_BUS_FMT_META_12,
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_UV8_1X8
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:48:9: error: 'MEDIA_BUS_FMT_META_16' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y16_1X16'?
48 | MEDIA_BUS_FMT_META_16,
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y16_1X16
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:49:9: error: 'MEDIA_BUS_FMT_META_24' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_VUY8_1X24'?
49 | MEDIA_BUS_FMT_META_24,
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_VUY8_1X24
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c: In function 'ipu6_isys_csi2_set_sel':
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:406:20: error: implicit declaration of function 'v4l2_subdev_state_get_stream_format'; did you mean 'v4l2_subdev_state_get_format'? [-Werror=implicit-function-declaration]
406 | src_ffmt = v4l2_subdev_state_get_stream_format(state, sel->pad,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| v4l2_subdev_state_get_format
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:406:18: warning: assignment to 'struct v4l2_mbus_framefmt *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
406 | src_ffmt = v4l2_subdev_state_get_stream_format(state, sel->pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:411:16: error: implicit declaration of function 'v4l2_subdev_state_get_stream_crop'; did you mean 'v4l2_subdev_state_get_crop'? [-Werror=implicit-function-declaration]
411 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| v4l2_subdev_state_get_crop
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:411:14: warning: assignment to 'struct v4l2_rect *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
411 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c: In function 'ipu6_isys_csi2_get_sel':
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:456:14: warning: assignment to 'struct v4l2_rect *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
456 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c: At top level:
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:10: error: 'const struct v4l2_subdev_pad_ops' has no member named 'init_cfg'
483 | .init_cfg = ipu6_isys_subdev_init_cfg,
| ^~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:21: error: positional initialization of field in 'struct' declared with 'designated_init' attribute [-Werror=designated-init]
483 | .init_cfg = ipu6_isys_subdev_init_cfg,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:21: note: (near initialization for 'csi2_sd_pad_ops')
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:21: error: invalid initializer
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:21: note: (near initialization for 'csi2_sd_pad_ops.<anonymous>')
cc1: some warnings being treated as errors
--
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:88:10: error: 'V4L2_META_FMT_GENERIC_8' undeclared here (not in a function); did you mean 'V4L2_META_FMT_VIVID'?
88 | {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
| ^~~~~~~~~~~~~~~~~~~~~~~
| V4L2_META_FMT_VIVID
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:88:41: error: 'MEDIA_BUS_FMT_META_8' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y8_1X8'?
88 | {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
| ^~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y8_1X8
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:89:10: error: 'V4L2_META_FMT_GENERIC_CSI2_10' undeclared here (not in a function)
89 | {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:89:49: error: 'MEDIA_BUS_FMT_META_10' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y10_1X10'?
89 | {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y10_1X10
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:90:10: error: 'V4L2_META_FMT_GENERIC_CSI2_12' undeclared here (not in a function)
90 | {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:90:49: error: 'MEDIA_BUS_FMT_META_12' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_UV8_1X8'?
90 | {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_UV8_1X8
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:91:10: error: 'V4L2_META_FMT_GENERIC_CSI2_16' undeclared here (not in a function)
91 | {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:91:49: error: 'MEDIA_BUS_FMT_META_16' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_Y16_1X16'?
91 | {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_Y16_1X16
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:92:10: error: 'V4L2_META_FMT_GENERIC_CSI2_24' undeclared here (not in a function)
92 | {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:92:49: error: 'MEDIA_BUS_FMT_META_24' undeclared here (not in a function); did you mean 'MEDIA_BUS_FMT_VUY8_1X24'?
92 | {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
| ^~~~~~~~~~~~~~~~~~~~~
| MEDIA_BUS_FMT_VUY8_1X24
drivers/media/pci/intel/ipu6/ipu6-isys-video.c: In function 'ipu6_isys_video_try_fmt_meta':
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:13: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
In file included from include/linux/build_bug.h:5,
from include/linux/bits.h:21,
from drivers/media/pci/intel/ipu6/ipu6-isys-video.c:7:
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/compiler.h:236:55: note: in definition of macro '__is_constexpr'
236 | (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
| ^
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
In file included from include/linux/kernel.h:28,
from arch/x86/include/asm/percpu.h:27,
from arch/x86/include/asm/preempt.h:6,
from include/linux/preempt.h:79,
from include/linux/spinlock.h:56,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/media/pci/intel/ipu6/ipu6-isys-video.c:9:
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/minmax.h:61:11: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/minmax.h:61:35: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/minmax.h:61:58: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/minmax.h:64:16: note: in definition of macro '__clamp_once'
64 | typeof(val) unique_val = (val); \
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/minmax.h:64:35: note: in definition of macro '__clamp_once'
64 | typeof(val) unique_val = (val); \
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/minmax.h:70:9: note: in expansion of macro 'static_assert'
70 | static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:31:31: note: in expansion of macro '__is_constexpr'
31 | __builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
| ^~~~~~~~~~~~~~
include/linux/minmax.h:31:46: note: in expansion of macro 'is_signed_type'
31 | __builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
| ^~~~~~~~~~~~~~
--
| ^~~~
include/linux/minmax.h:71:9: note: in expansion of macro 'static_assert'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:36:53: note: in expansion of macro '__is_signed'
36 | (__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
| ^~~~~~~~~~~
include/linux/minmax.h:41:17: note: in expansion of macro '__is_noneg_int'
41 | __is_noneg_int(x) || __is_noneg_int(y))
| ^~~~~~~~~~~~~~
include/linux/minmax.h:71:23: note: in expansion of macro '__types_ok'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~
include/linux/minmax.h:77:17: note: in expansion of macro '__clamp_once'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:33: error: 'struct v4l2_meta_format' has no member named 'width'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/minmax.h:71:9: note: in expansion of macro 'static_assert'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:41:17: note: in expansion of macro '__is_noneg_int'
41 | __is_noneg_int(x) || __is_noneg_int(y))
| ^~~~~~~~~~~~~~
include/linux/minmax.h:71:23: note: in expansion of macro '__types_ok'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~
include/linux/minmax.h:77:17: note: in expansion of macro '__clamp_once'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
include/linux/minmax.h:36:10: error: first argument to '__builtin_choose_expr' not a constant
36 | (__builtin_choose_expr(__is_constexpr(x) && __is_signed(x), x, -1) >= 0)
| ^~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/minmax.h:71:9: note: in expansion of macro 'static_assert'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:41:17: note: in expansion of macro '__is_noneg_int'
41 | __is_noneg_int(x) || __is_noneg_int(y))
| ^~~~~~~~~~~~~~
include/linux/minmax.h:71:23: note: in expansion of macro '__types_ok'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~
include/linux/minmax.h:77:17: note: in expansion of macro '__clamp_once'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
include/linux/minmax.h:39:9: error: expression in static assertion is not an integer
39 | (__is_signed(x) == __is_signed(y) || \
| ^
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/minmax.h:71:9: note: in expansion of macro 'static_assert'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:71:23: note: in expansion of macro '__types_ok'
71 | static_assert(__types_ok(val, hi), "clamp() 'hi' signedness error"); \
| ^~~~~~~~~~
include/linux/minmax.h:77:17: note: in expansion of macro '__clamp_once'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
include/linux/minmax.h:75:9: error: first argument to '__builtin_choose_expr' not a constant
75 | __builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
| ^~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:23: note: in expansion of macro 'clamp'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ^~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:13: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/compiler.h:236:55: note: in definition of macro '__is_constexpr'
236 | (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
| ^
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/minmax.h:61:11: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/minmax.h:61:35: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/minmax.h:61:58: note: in definition of macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/minmax.h:64:16: note: in definition of macro '__clamp_once'
64 | typeof(val) unique_val = (val); \
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/minmax.h:64:35: note: in definition of macro '__clamp_once'
64 | typeof(val) unique_val = (val); \
| ^~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:24: note: in expansion of macro 'clamp'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:267:34: error: 'struct v4l2_meta_format' has no member named 'height'
267 | meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
| ^~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/minmax.h:70:9: note: in expansion of macro 'static_assert'
70 | static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
| ^~~~~~~~~~~~~
include/linux/minmax.h:31:31: note: in expansion of macro '__is_constexpr'
31 | __builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
| ^~~~~~~~~~~~~~
include/linux/minmax.h:31:46: note: in expansion of macro 'is_signed_type'
31 | __builtin_choose_expr(__is_constexpr(is_signed_type(typeof(x))), \
| ^~~~~~~~~~~~~~
include/linux/minmax.h:39:10: note: in expansion of macro '__is_signed'
39 | (__is_signed(x) == __is_signed(y) || \
| ^~~~~~~~~~~
include/linux/minmax.h:70:23: note: in expansion of macro '__types_ok'
70 | static_assert(__types_ok(val, lo), "clamp() 'lo' signedness error"); \
| ^~~~~~~~~~
include/linux/minmax.h:77:17: note: in expansion of macro '__clamp_once'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~~~~~~~~~~
include/linux/minmax.h:146:28: note: in expansion of macro '__careful_clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
..
vim +23 drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c
18
19 unsigned int ipu6_isys_mbus_code_to_bpp(u32 code)
20 {
21 switch (code) {
22 case MEDIA_BUS_FMT_RGB888_1X24:
> 23 case MEDIA_BUS_FMT_META_24:
24 return 24;
25 case MEDIA_BUS_FMT_RGB565_1X16:
26 case MEDIA_BUS_FMT_UYVY8_1X16:
27 case MEDIA_BUS_FMT_YUYV8_1X16:
> 28 case MEDIA_BUS_FMT_META_16:
29 return 16;
30 case MEDIA_BUS_FMT_SBGGR12_1X12:
31 case MEDIA_BUS_FMT_SGBRG12_1X12:
32 case MEDIA_BUS_FMT_SGRBG12_1X12:
33 case MEDIA_BUS_FMT_SRGGB12_1X12:
> 34 case MEDIA_BUS_FMT_META_12:
35 return 12;
36 case MEDIA_BUS_FMT_SBGGR10_1X10:
37 case MEDIA_BUS_FMT_SGBRG10_1X10:
38 case MEDIA_BUS_FMT_SGRBG10_1X10:
39 case MEDIA_BUS_FMT_SRGGB10_1X10:
> 40 case MEDIA_BUS_FMT_META_10:
41 return 10;
42 case MEDIA_BUS_FMT_SBGGR8_1X8:
43 case MEDIA_BUS_FMT_SGBRG8_1X8:
44 case MEDIA_BUS_FMT_SGRBG8_1X8:
45 case MEDIA_BUS_FMT_SRGGB8_1X8:
> 46 case MEDIA_BUS_FMT_META_8:
47 return 8;
48 default:
49 WARN_ON(1);
50 return 8;
51 }
52 }
53
Hi,
kernel test robot noticed the following build errors:
[auto build test ERROR on media-tree/master]
[also build test ERROR on linuxtv-media-stage/master linus/master v6.7 next-20240111]
[cannot apply to sailus-media-tree/streams]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/bingbu-cao-intel-com/media-intel-ipu6-add-IPU-auxiliary-devices/20240111-155551
base: git://linuxtv.org/media_tree.git master
patch link: https://lore.kernel.org/r/20240111065531.2418836-17-bingbu.cao%40intel.com
patch subject: [PATCH v3 16/17] media: ipu6/isys: support line-based metadata capture support
config: x86_64-allmodconfig (https://download.01.org/0day-ci/archive/20240112/202401121120.4CiWmH5y-lkp@intel.com/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240112/202401121120.4CiWmH5y-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401121120.4CiWmH5y-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:45:2: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_8'
45 | MEDIA_BUS_FMT_META_8,
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:46:2: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_10'
46 | MEDIA_BUS_FMT_META_10,
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:47:2: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_12'
47 | MEDIA_BUS_FMT_META_12,
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:48:2: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_16'
48 | MEDIA_BUS_FMT_META_16,
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:49:2: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_24'
49 | MEDIA_BUS_FMT_META_24,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:406:13: error: call to undeclared function 'v4l2_subdev_state_get_stream_format'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
406 | src_ffmt = v4l2_subdev_state_get_stream_format(state, sel->pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:406:11: error: incompatible integer to pointer conversion assigning to 'struct v4l2_mbus_framefmt *' from 'int' [-Wint-conversion]
406 | src_ffmt = v4l2_subdev_state_get_stream_format(state, sel->pad,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
407 | sel->stream);
| ~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:411:9: error: call to undeclared function 'v4l2_subdev_state_get_stream_crop'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
411 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:411:7: error: incompatible integer to pointer conversion assigning to 'struct v4l2_rect *' from 'int' [-Wint-conversion]
411 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:456:9: error: call to undeclared function 'v4l2_subdev_state_get_stream_crop'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
456 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:456:7: error: incompatible integer to pointer conversion assigning to 'struct v4l2_rect *' from 'int' [-Wint-conversion]
456 | crop = v4l2_subdev_state_get_stream_crop(state, sel->pad, sel->stream);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c:483:3: error: field designator 'init_cfg' does not refer to any field in type 'const struct v4l2_subdev_pad_ops'
483 | .init_cfg = ipu6_isys_subdev_init_cfg,
| ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12 errors generated.
--
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:88:3: error: use of undeclared identifier 'V4L2_META_FMT_GENERIC_8'
88 | {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:88:34: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_8'
88 | {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:89:3: error: use of undeclared identifier 'V4L2_META_FMT_GENERIC_CSI2_10'
89 | {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:89:42: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_10'
89 | {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:90:3: error: use of undeclared identifier 'V4L2_META_FMT_GENERIC_CSI2_12'
90 | {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:90:42: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_12'
90 | {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:91:3: error: use of undeclared identifier 'V4L2_META_FMT_GENERIC_CSI2_16'
91 | {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:91:42: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_16'
91 | {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:92:3: error: use of undeclared identifier 'V4L2_META_FMT_GENERIC_CSI2_24'
92 | {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:92:42: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_24'
92 | {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:122:18: error: invalid application of 'sizeof' to an incomplete type 'const struct ipu6_isys_pixelformat[]'
122 | for (i = 0; i < ARRAY_SIZE(ipu6_isys_pfmts); i++) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/array_size.h:11:32: note: expanded from macro 'ARRAY_SIZE'
11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:148:18: error: invalid application of 'sizeof' to an incomplete type 'const struct ipu6_isys_pixelformat[]'
148 | if (f->index >= ARRAY_SIZE(ipu6_isys_pfmts))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/array_size.h:11:32: note: expanded from macro 'ARRAY_SIZE'
11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
| ^~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:157:18: error: invalid application of 'sizeof' to an incomplete type 'const struct ipu6_isys_pixelformat[]'
157 | for (i = 0; i < ARRAY_SIZE(ipu6_isys_pfmts); i++) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/array_size.h:11:32: note: expanded from macro 'ARRAY_SIZE'
11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
| ^~~~~
>> drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:8: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:28: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
include/linux/minmax.h:146:44: note: expanded from macro 'clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~
include/linux/minmax.h:75:40: note: expanded from macro '__careful_clamp'
75 | __builtin_choose_expr(__is_constexpr((val) - (lo) + (hi)), \
| ^~~
include/linux/compiler.h:236:48: note: expanded from macro '__is_constexpr'
236 | (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:28: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
include/linux/minmax.h:146:44: note: expanded from macro 'clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~
include/linux/minmax.h:76:11: note: expanded from macro '__careful_clamp'
76 | __clamp(val, lo, hi), \
| ^~~
include/linux/minmax.h:61:4: note: expanded from macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:28: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
include/linux/minmax.h:146:44: note: expanded from macro 'clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~
include/linux/minmax.h:76:11: note: expanded from macro '__careful_clamp'
76 | __clamp(val, lo, hi), \
| ^~~
include/linux/minmax.h:61:28: note: expanded from macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:28: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
include/linux/minmax.h:146:44: note: expanded from macro 'clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~
include/linux/minmax.h:76:11: note: expanded from macro '__careful_clamp'
76 | __clamp(val, lo, hi), \
| ^~~
include/linux/minmax.h:61:51: note: expanded from macro '__clamp'
61 | ((val) >= (hi) ? (hi) : ((val) <= (lo) ? (lo) : (val)))
| ^~~
drivers/media/pci/intel/ipu6/ipu6-isys-video.c:265:28: error: no member named 'width' in 'struct v4l2_meta_format'
265 | meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
| ~~~~ ^
include/linux/minmax.h:146:44: note: expanded from macro 'clamp'
146 | #define clamp(val, lo, hi) __careful_clamp(val, lo, hi)
| ^~~
include/linux/minmax.h:77:16: note: expanded from macro '__careful_clamp'
77 | __clamp_once(val, lo, hi, __UNIQUE_ID(__val), \
| ^~~
include/linux/minmax.h:64:9: note: expanded from macro '__clamp_once'
64 | typeof(val) unique_val = (val); \
| ^~~
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
--
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:23:7: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_24'
23 | case MEDIA_BUS_FMT_META_24:
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:28:7: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_16'
28 | case MEDIA_BUS_FMT_META_16:
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:34:7: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_12'
34 | case MEDIA_BUS_FMT_META_12:
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:40:7: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_10'
40 | case MEDIA_BUS_FMT_META_10:
| ^
>> drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:46:7: error: use of undeclared identifier 'MEDIA_BUS_FMT_META_8'
46 | case MEDIA_BUS_FMT_META_8:
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:159:8: error: call to undeclared function 'v4l2_subdev_state_get_stream_format'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
159 | fmt = v4l2_subdev_state_get_stream_format(state, format->pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:159:6: error: incompatible integer to pointer conversion assigning to 'struct v4l2_mbus_framefmt *' from 'int' [-Wint-conversion]
159 | fmt = v4l2_subdev_state_get_stream_format(state, format->pad,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160 | format->stream);
| ~~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:185:9: error: call to undeclared function 'v4l2_subdev_state_get_stream_crop'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
185 | crop = v4l2_subdev_state_get_stream_crop(state, other_pad,
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:185:7: error: incompatible integer to pointer conversion assigning to 'struct v4l2_rect *' from 'int' [-Wint-conversion]
185 | crop = v4l2_subdev_state_get_stream_crop(state, other_pad,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
186 | other_stream);
| ~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:244:8: error: call to undeclared function 'v4l2_subdev_state_get_stream_format'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
244 | fmt = v4l2_subdev_state_get_stream_format(state, pad, stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:244:6: error: incompatible integer to pointer conversion assigning to 'struct v4l2_mbus_framefmt *' from 'int' [-Wint-conversion]
244 | fmt = v4l2_subdev_state_get_stream_format(state, pad, stream);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:262:9: error: call to undeclared function 'v4l2_subdev_state_get_stream_crop'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
262 | rect = v4l2_subdev_state_get_stream_crop(state, pad, stream);
| ^
drivers/media/pci/intel/ipu6/ipu6-isys-subdev.c:262:7: error: incompatible integer to pointer conversion assigning to 'struct v4l2_rect *' from 'int' [-Wint-conversion]
262 | rect = v4l2_subdev_state_get_stream_crop(state, pad, stream);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13 errors generated.
vim +/MEDIA_BUS_FMT_META_8 +45 drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
27
28 static const u32 csi2_supported_codes[] = {
29 MEDIA_BUS_FMT_RGB565_1X16,
30 MEDIA_BUS_FMT_RGB888_1X24,
31 MEDIA_BUS_FMT_UYVY8_1X16,
32 MEDIA_BUS_FMT_YUYV8_1X16,
33 MEDIA_BUS_FMT_SBGGR10_1X10,
34 MEDIA_BUS_FMT_SGBRG10_1X10,
35 MEDIA_BUS_FMT_SGRBG10_1X10,
36 MEDIA_BUS_FMT_SRGGB10_1X10,
37 MEDIA_BUS_FMT_SBGGR12_1X12,
38 MEDIA_BUS_FMT_SGBRG12_1X12,
39 MEDIA_BUS_FMT_SGRBG12_1X12,
40 MEDIA_BUS_FMT_SRGGB12_1X12,
41 MEDIA_BUS_FMT_SBGGR8_1X8,
42 MEDIA_BUS_FMT_SGBRG8_1X8,
43 MEDIA_BUS_FMT_SGRBG8_1X8,
44 MEDIA_BUS_FMT_SRGGB8_1X8,
> 45 MEDIA_BUS_FMT_META_8,
> 46 MEDIA_BUS_FMT_META_10,
> 47 MEDIA_BUS_FMT_META_12,
> 48 MEDIA_BUS_FMT_META_16,
> 49 MEDIA_BUS_FMT_META_24,
50 0
51 };
52
@@ -42,6 +42,11 @@ static const u32 csi2_supported_codes[] = {
MEDIA_BUS_FMT_SGBRG8_1X8,
MEDIA_BUS_FMT_SGRBG8_1X8,
MEDIA_BUS_FMT_SRGGB8_1X8,
+ MEDIA_BUS_FMT_META_8,
+ MEDIA_BUS_FMT_META_10,
+ MEDIA_BUS_FMT_META_12,
+ MEDIA_BUS_FMT_META_16,
+ MEDIA_BUS_FMT_META_24,
0
};
@@ -35,11 +35,14 @@ static int queue_setup(struct vb2_queue *q, unsigned int *num_buffers,
/* num_planes == 0: we're being called through VIDIOC_REQBUFS */
if (!*num_planes) {
use_fmt = true;
- *num_planes = av->mpix.num_planes;
+ if (av->vfmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ *num_planes = av->vfmt.fmt.pix_mp.num_planes;
+ else if (av->vfmt.type == V4L2_BUF_TYPE_META_CAPTURE)
+ *num_planes = 1;
}
for (i = 0; i < *num_planes; i++) {
- size = av->mpix.plane_fmt[i].sizeimage;
+ size = ipu6_get_data_size(&av->vfmt, i);
if (use_fmt) {
sizes[i] = size;
} else if (sizes[i] < size) {
@@ -59,16 +62,17 @@ static int ipu6_isys_buf_prepare(struct vb2_buffer *vb)
struct ipu6_isys_queue *aq = vb2_queue_to_isys_queue(vb->vb2_queue);
struct ipu6_isys_video *av = ipu6_isys_queue_to_video(aq);
struct device *dev = &av->isys->adev->auxdev.dev;
+ u32 bytesperline = ipu6_get_bytes_per_line(&av->vfmt);
+ u32 height = ipu6_get_frame_height(&av->vfmt);
+ u32 size = ipu6_get_data_size(&av->vfmt, 0);
dev_dbg(dev, "buffer: %s: configured size %u, buffer size %lu\n",
- av->vdev.name, av->mpix.plane_fmt[0].sizeimage,
- vb2_plane_size(vb, 0));
+ av->vdev.name, size, vb2_plane_size(vb, 0));
- if (av->mpix.plane_fmt[0].sizeimage > vb2_plane_size(vb, 0))
+ if (size > vb2_plane_size(vb, 0))
return -EINVAL;
- vb2_set_plane_payload(vb, 0, av->mpix.plane_fmt[0].bytesperline *
- av->mpix.height);
+ vb2_set_plane_payload(vb, 0, bytesperline * height);
vb->planes[0].data_offset = 0;
return 0;
@@ -437,18 +441,22 @@ static int ipu6_isys_link_fmt_validate(struct ipu6_isys_queue *aq)
return ret;
}
- if (format.width != av->mpix.width ||
- format.height != av->mpix.height) {
- dev_dbg(dev, "wrong width or height %ux%u (%ux%u expected)\n",
- av->mpix.width, av->mpix.height,
- format.width, format.height);
+ if (format.width != ipu6_get_frame_width(&av->vfmt) ||
+ format.height != ipu6_get_frame_height(&av->vfmt)) {
+ dev_err(dev, "wrong width or height %ux%u (%ux%u expected)\n",
+ ipu6_get_frame_width(&av->vfmt),
+ ipu6_get_frame_height(&av->vfmt), format.width,
+ format.height);
return -EINVAL;
}
- if (format.field != av->mpix.field) {
- dev_dbg(dev, "wrong field value 0x%8.8x (0x%8.8x expected)\n",
- av->mpix.field, format.field);
- return -EINVAL;
+ if (av->vfmt.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ if (format.field != av->vfmt.fmt.pix_mp.field) {
+ dev_dbg(dev,
+ "wrong field value 0x%8.8x (%8.8x expected)\n",
+ av->vfmt.fmt.pix_mp.field, format.field);
+ return -EINVAL;
+ }
}
if (format.code != av->pfmt->code) {
@@ -531,8 +539,8 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
int nr_queues, ret;
dev_dbg(dev, "stream: %s: width %u, height %u, css pixelformat %u\n",
- av->vdev.name, av->mpix.width, av->mpix.height,
- av->pfmt->css_pixelformat);
+ av->vdev.name, ipu6_get_frame_width(&av->vfmt),
+ ipu6_get_frame_height(&av->vfmt), av->pfmt->css_pixelformat);
ret = ipu6_isys_setup_video(av, &source_entity, &nr_queues);
if (ret < 0) {
@@ -20,25 +20,30 @@ unsigned int ipu6_isys_mbus_code_to_bpp(u32 code)
{
switch (code) {
case MEDIA_BUS_FMT_RGB888_1X24:
+ case MEDIA_BUS_FMT_META_24:
return 24;
case MEDIA_BUS_FMT_RGB565_1X16:
case MEDIA_BUS_FMT_UYVY8_1X16:
case MEDIA_BUS_FMT_YUYV8_1X16:
+ case MEDIA_BUS_FMT_META_16:
return 16;
case MEDIA_BUS_FMT_SBGGR12_1X12:
case MEDIA_BUS_FMT_SGBRG12_1X12:
case MEDIA_BUS_FMT_SGRBG12_1X12:
case MEDIA_BUS_FMT_SRGGB12_1X12:
+ case MEDIA_BUS_FMT_META_12:
return 12;
case MEDIA_BUS_FMT_SBGGR10_1X10:
case MEDIA_BUS_FMT_SGBRG10_1X10:
case MEDIA_BUS_FMT_SGRBG10_1X10:
case MEDIA_BUS_FMT_SRGGB10_1X10:
+ case MEDIA_BUS_FMT_META_10:
return 10;
case MEDIA_BUS_FMT_SBGGR8_1X8:
case MEDIA_BUS_FMT_SGBRG8_1X8:
case MEDIA_BUS_FMT_SGRBG8_1X8:
case MEDIA_BUS_FMT_SRGGB8_1X8:
+ case MEDIA_BUS_FMT_META_8:
return 8;
default:
WARN_ON(1);
@@ -85,6 +85,11 @@ const struct ipu6_isys_pixelformat ipu6_isys_pfmts[] = {
IPU6_FW_ISYS_FRAME_FORMAT_RGB565},
{V4L2_PIX_FMT_BGR24, 24, 24, MEDIA_BUS_FMT_RGB888_1X24,
IPU6_FW_ISYS_FRAME_FORMAT_RGBA888},
+ {V4L2_META_FMT_GENERIC_8, 8, 8, MEDIA_BUS_FMT_META_8, 0},
+ {V4L2_META_FMT_GENERIC_CSI2_10, 10, 10, MEDIA_BUS_FMT_META_10, 0},
+ {V4L2_META_FMT_GENERIC_CSI2_12, 12, 12, MEDIA_BUS_FMT_META_12, 0},
+ {V4L2_META_FMT_GENERIC_CSI2_16, 16, 16, MEDIA_BUS_FMT_META_16, 0},
+ {V4L2_META_FMT_GENERIC_CSI2_24, 24, 24, MEDIA_BUS_FMT_META_24, 0},
};
static int video_open(struct file *file)
@@ -181,12 +186,12 @@ static int ipu6_isys_vidioc_enum_framesizes(struct file *file, void *fh,
return 0;
}
-static int vidioc_g_fmt_vid_cap_mplane(struct file *file, void *fh,
- struct v4l2_format *fmt)
+static int vidioc_get_format(struct file *file, void *fh,
+ struct v4l2_format *fmt)
{
struct ipu6_isys_video *av = video_drvdata(file);
- fmt->fmt.pix_mp = av->mpix;
+ *fmt = av->vfmt;
return 0;
}
@@ -245,30 +250,114 @@ ipu6_isys_video_try_fmt_vid_mplane(struct ipu6_isys_video *av,
return pfmt;
}
-static int vidioc_s_fmt_vid_cap_mplane(struct file *file, void *fh,
- struct v4l2_format *f)
+static const struct ipu6_isys_pixelformat *
+ipu6_isys_video_try_fmt_meta(struct ipu6_isys_video *av,
+ struct v4l2_meta_format *meta)
+{
+ const struct ipu6_isys_pixelformat *pfmt =
+ ipu6_isys_get_pixelformat(meta->dataformat);
+
+ memset(&av->vfmt, 0, sizeof(av->vfmt));
+ av->vfmt.type = V4L2_BUF_TYPE_META_CAPTURE;
+ av->pfmt = pfmt;
+
+ meta->dataformat = pfmt->pixelformat;
+ meta->width = clamp(meta->width, IPU6_ISYS_MIN_WIDTH,
+ IPU6_ISYS_MAX_WIDTH);
+ meta->height = clamp(meta->height, IPU6_ISYS_MIN_HEIGHT,
+ IPU6_ISYS_MAX_HEIGHT);
+
+ if (pfmt->bpp != pfmt->bpp_packed)
+ meta->bytesperline = meta->width *
+ DIV_ROUND_UP(pfmt->bpp, BITS_PER_BYTE);
+ else
+ meta->bytesperline =
+ DIV_ROUND_UP(meta->width * pfmt->bpp, BITS_PER_BYTE);
+
+ meta->bytesperline = ALIGN(meta->bytesperline, av->isys->line_align);
+ meta->buffersize =
+ max(max(meta->buffersize, meta->bytesperline * meta->height +
+ max(meta->bytesperline,
+ av->isys->pdata->ipdata->isys_dma_overshoot)), 1U);
+
+ return pfmt;
+}
+
+static const struct ipu6_isys_pixelformat *
+ipu6_isys_video_try_fmt(struct ipu6_isys_video *av, struct v4l2_format *f)
+{
+ if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
+ else if (f->type == V4L2_BUF_TYPE_META_CAPTURE)
+ return ipu6_isys_video_try_fmt_meta(av, &f->fmt.meta);
+ else
+ return &ipu6_isys_pfmts[0];
+}
+
+static int vidioc_set_format(struct file *file, void *fh,
+ struct v4l2_format *f)
{
struct ipu6_isys_video *av = video_drvdata(file);
if (av->aq.vbq.streaming)
return -EBUSY;
- av->pfmt = ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
- av->mpix = f->fmt.pix_mp;
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
+ f->type != V4L2_BUF_TYPE_META_CAPTURE)
+ return -EINVAL;
+
+ av->pfmt = ipu6_isys_video_try_fmt(av, f);
+ av->vfmt = *f;
return 0;
}
-static int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *fh,
- struct v4l2_format *f)
+static int vidioc_try_format(struct file *file, void *fh,
+ struct v4l2_format *f)
{
struct ipu6_isys_video *av = video_drvdata(file);
- ipu6_isys_video_try_fmt_vid_mplane(av, &f->fmt.pix_mp);
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
+ f->type != V4L2_BUF_TYPE_META_CAPTURE)
+ return -EINVAL;
+
+ ipu6_isys_video_try_fmt(av, f);
return 0;
}
+static int vidioc_request_qbufs(struct file *file, void *priv,
+ struct v4l2_requestbuffers *p)
+{
+ struct ipu6_isys_video *av = video_drvdata(file);
+ int ret;
+
+ av->aq.vbq.is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(p->type);
+ av->aq.vbq.is_output = V4L2_TYPE_IS_OUTPUT(p->type);
+
+ ret = vb2_queue_change_type(&av->aq.vbq, p->type);
+ if (ret)
+ return ret;
+
+ return vb2_ioctl_reqbufs(file, priv, p);
+}
+
+static int vidioc_create_bufs(struct file *file, void *priv,
+ struct v4l2_create_buffers *p)
+{
+ struct ipu6_isys_video *av = video_drvdata(file);
+ int ret;
+
+ av->aq.vbq.is_multiplanar = V4L2_TYPE_IS_MULTIPLANAR(p->format.type);
+ av->aq.vbq.is_output = V4L2_TYPE_IS_OUTPUT(p->format.type);
+
+ ret = vb2_queue_change_type(&av->aq.vbq, p->format.type);
+ if (ret)
+ return ret;
+
+ return vb2_ioctl_create_bufs(file, priv, p);
+}
+
static int link_validate(struct media_link *link)
{
struct ipu6_isys_video *av =
@@ -279,6 +368,8 @@ static int link_validate(struct media_link *link)
struct v4l2_mbus_framefmt *s_fmt;
struct media_pad *s_pad;
u32 s_stream;
+ u32 height;
+ u32 width;
int ret = -EPIPE;
if (!link->source->entity)
@@ -305,11 +396,13 @@ static int link_validate(struct media_link *link)
goto unlock;
}
- if (s_fmt->width != av->mpix.width ||
- s_fmt->height != av->mpix.height || s_fmt->code != av->pfmt->code) {
+ height = ipu6_get_frame_height(&av->vfmt);
+ width = ipu6_get_frame_width(&av->vfmt);
+ if (s_fmt->width != width || s_fmt->height != height ||
+ s_fmt->code != av->pfmt->code) {
dev_err(dev, "format mismatch %dx%d,%x != %dx%d,%x\n",
- s_fmt->width, s_fmt->height, s_fmt->code,
- av->mpix.width, av->mpix.height, av->pfmt->code);
+ s_fmt->width, s_fmt->height, s_fmt->code, width, height,
+ av->pfmt->code);
goto unlock;
}
@@ -393,10 +486,10 @@ static int ipu6_isys_fw_pin_cfg(struct ipu6_isys_video *av,
output_pin = &cfg->output_pins[output_pins];
output_pin->input_pin_id = input_pins;
- output_pin->output_res.width = av->mpix.width;
- output_pin->output_res.height = av->mpix.height;
+ output_pin->output_res.width = ipu6_get_frame_width(&av->vfmt);
+ output_pin->output_res.height = ipu6_get_frame_height(&av->vfmt);
- output_pin->stride = av->mpix.plane_fmt[0].bytesperline;
+ output_pin->stride = ipu6_get_bytes_per_line(&av->vfmt);
if (av->pfmt->bpp != av->pfmt->bpp_packed)
output_pin->pt = IPU6_FW_ISYS_PIN_TYPE_RAW_SOC;
else
@@ -663,8 +756,8 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
esd = media_entity_to_v4l2_subdev(av->stream->source_entity);
- av->watermark.width = av->mpix.width;
- av->watermark.height = av->mpix.height;
+ av->watermark.width = ipu6_get_frame_width(&av->vfmt);
+ av->watermark.height = ipu6_get_frame_height(&av->vfmt);
av->watermark.sram_gran_shift = isys->pdata->ipdata->sram_gran_shift;
av->watermark.sram_gran_size = isys->pdata->ipdata->sram_gran_size;
@@ -992,11 +1085,15 @@ static const struct v4l2_ioctl_ops ioctl_ops_mplane = {
.vidioc_querycap = ipu6_isys_vidioc_querycap,
.vidioc_enum_fmt_vid_cap = ipu6_isys_vidioc_enum_fmt,
.vidioc_enum_framesizes = ipu6_isys_vidioc_enum_framesizes,
- .vidioc_g_fmt_vid_cap_mplane = vidioc_g_fmt_vid_cap_mplane,
- .vidioc_s_fmt_vid_cap_mplane = vidioc_s_fmt_vid_cap_mplane,
- .vidioc_try_fmt_vid_cap_mplane = vidioc_try_fmt_vid_cap_mplane,
- .vidioc_reqbufs = vb2_ioctl_reqbufs,
- .vidioc_create_bufs = vb2_ioctl_create_bufs,
+ .vidioc_g_fmt_vid_cap_mplane = vidioc_get_format,
+ .vidioc_s_fmt_vid_cap_mplane = vidioc_set_format,
+ .vidioc_try_fmt_vid_cap_mplane = vidioc_try_format,
+ .vidioc_enum_fmt_meta_cap = ipu6_isys_vidioc_enum_fmt,
+ .vidioc_g_fmt_meta_cap = vidioc_get_format,
+ .vidioc_s_fmt_meta_cap = vidioc_set_format,
+ .vidioc_try_fmt_meta_cap = vidioc_try_format,
+ .vidioc_reqbufs = vidioc_request_qbufs,
+ .vidioc_create_bufs = vidioc_create_bufs,
.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
.vidioc_querybuf = vb2_ioctl_querybuf,
.vidioc_qbuf = vb2_ioctl_qbuf,
@@ -1199,7 +1296,8 @@ int ipu6_isys_video_init(struct ipu6_isys_video *av)
mutex_init(&av->mutex);
av->vdev.device_caps = V4L2_CAP_STREAMING | V4L2_CAP_IO_MC |
- V4L2_CAP_VIDEO_CAPTURE_MPLANE;
+ V4L2_CAP_VIDEO_CAPTURE_MPLANE |
+ V4L2_CAP_META_CAPTURE;
av->vdev.vfl_dir = VFL_DIR_RX;
ret = ipu6_isys_queue_init(&av->aq);
@@ -1220,8 +1318,8 @@ int ipu6_isys_video_init(struct ipu6_isys_video *av)
av->vdev.queue = &av->aq.vbq;
av->vdev.lock = &av->mutex;
- ipu6_isys_video_try_fmt_vid_mplane(av, &format.fmt.pix_mp);
- av->mpix = format.fmt.pix_mp;
+ ipu6_isys_video_try_fmt(av, &format);
+ av->vfmt = format;
set_bit(V4L2_FL_USES_V4L2_FH, &av->vdev.flags);
video_set_drvdata(&av->vdev, av);
@@ -1251,3 +1349,52 @@ void ipu6_isys_video_cleanup(struct ipu6_isys_video *av)
media_entity_cleanup(&av->vdev.entity);
mutex_destroy(&av->mutex);
}
+
+u32 ipu6_get_data_size(struct v4l2_format *vfmt, int plane)
+{
+ if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return vfmt->fmt.pix_mp.plane_fmt[plane].sizeimage;
+ else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
+ return vfmt->fmt.meta.buffersize;
+
+ WARN_ON_ONCE(1);
+
+ return 0;
+}
+
+u32 ipu6_get_bytes_per_line(struct v4l2_format *vfmt)
+{
+ if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return vfmt->fmt.pix_mp.plane_fmt[0].bytesperline;
+ else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
+ return vfmt->fmt.meta.bytesperline;
+
+ WARN_ON_ONCE(1);
+
+ return 0;
+}
+
+u32 ipu6_get_frame_width(struct v4l2_format *vfmt)
+{
+ if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return vfmt->fmt.pix_mp.width;
+ else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
+ return vfmt->fmt.meta.width;
+
+ WARN_ON_ONCE(1);
+
+ return 0;
+}
+
+u32 ipu6_get_frame_height(struct v4l2_format *vfmt)
+{
+ if (vfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return vfmt->fmt.pix_mp.height;
+ else if (vfmt->type == V4L2_BUF_TYPE_META_CAPTURE)
+ return vfmt->fmt.meta.height;
+
+ WARN_ON_ONCE(1);
+
+ return 0;
+}
+
@@ -90,7 +90,7 @@ struct ipu6_isys_video {
struct mutex mutex;
struct media_pad pad;
struct video_device vdev;
- struct v4l2_pix_format_mplane mpix;
+ struct v4l2_format vfmt;
const struct ipu6_isys_pixelformat *pfmt;
struct ipu6_isys *isys;
struct ipu6_isys_stream *stream;
@@ -133,4 +133,9 @@ void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
bool state);
void ipu6_isys_update_stream_watermark(struct ipu6_isys_video *av, bool state);
+u32 ipu6_get_data_size(struct v4l2_format *vfmt, int plane);
+u32 ipu6_get_bytes_per_line(struct v4l2_format *vfmt);
+u32 ipu6_get_frame_width(struct v4l2_format *vfmt);
+u32 ipu6_get_frame_height(struct v4l2_format *vfmt);
+
#endif /* IPU6_ISYS_VIDEO_H */