[PATCH v4 12/12] intel-ipu3: imgu top level pci device
Zhi, Yong
yong.zhi at intel.com
Tue Oct 24 00:57:08 UTC 2017
Hi, Sakari,
> -----Original Message-----
> From: linux-media-owner at vger.kernel.org [mailto:linux-media-
> owner at vger.kernel.org] On Behalf Of Sakari Ailus
> Sent: Friday, October 20, 2017 4:15 AM
> To: Zhi, Yong <yong.zhi at intel.com>
> Cc: linux-media at vger.kernel.org; sakari.ailus at linux.intel.com; Zheng, Jian
> Xu <jian.xu.zheng at intel.com>; Mani, Rajmohan
> <rajmohan.mani at intel.com>; Toivonen, Tuukka
> <tuukka.toivonen at intel.com>; Hu, Jerry W <jerry.w.hu at intel.com>;
> arnd at arndb.de; hch at lst.de; robin.murphy at arm.com; iommu at lists.linux-
> foundation.org; Tomasz Figa <tfiga at chromium.org>
> Subject: Re: [PATCH v4 12/12] intel-ipu3: imgu top level pci device
>
> On Tue, Oct 17, 2017 at 10:55:59PM -0500, Yong Zhi wrote:
> > This patch adds support for the Intel IPU v3 as found on Skylake and
> > Kaby Lake SoCs. The driver has a dependency on the firmware binary to
> > function properly.
> >
> > Signed-off-by: Yong Zhi <yong.zhi at intel.com>
> > Signed-off-by: Tomasz Figa <tfiga at chromium.org>
> > ---
> > drivers/media/pci/intel/ipu3/Kconfig | 17 +
> > drivers/media/pci/intel/ipu3/Makefile | 6 +
> > drivers/media/pci/intel/ipu3/ipu3.c | 882
> ++++++++++++++++++++++++++++++++++
> > drivers/media/pci/intel/ipu3/ipu3.h | 186 +++++++
> > 4 files changed, 1091 insertions(+)
> > create mode 100644 drivers/media/pci/intel/ipu3/ipu3.c
> > create mode 100644 drivers/media/pci/intel/ipu3/ipu3.h
> >
(snip)
> > +/*
> > + * imgu_mem2mem2_ops - used by v4l2 and vb2 */ static const struct
> > +ipu3_mem2mem2_ops imgu_mem2mem2_ops = {
> > + .s_stream = imgu_mem2mem2_s_stream,
>
> You have a single instance of this. How about just using
> imgu_mem2mem2_s_stream instead?
>
Yes, we can remove another level of indirectness.
(snip)
> > +++ b/drivers/media/pci/intel/ipu3/ipu3.h
> > @@ -0,0 +1,186 @@
> > +/*
> > + * Copyright (c) 2017 Intel Corporation.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License
> > +version
> > + * 2 as published by the Free Software Foundation.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +
> > +#ifndef __IPU3_H
> > +#define __IPU3_H
> > +
> > +#include <linux/iova.h>
> > +#include <linux/pci.h>
> > +#include <media/v4l2-device.h>
> > +#include <media/videobuf2-v4l2.h>
> > +#include "ipu3-css.h"
> > +
> > +/*
> > + * The semantics of the driver is that whenever there is a buffer
> > +available in
> > + * master queue, the driver queues a buffer also to all other active nodes.
> > + * If user space hasn't provided a buffer to all other video nodes
> > +first,
> > + * the driver gets an internal dummy buffer and queues it.
> > + */
> > +#define IMGU_QUEUE_MASTER IPU3_CSS_QUEUE_IN
> > +#define IMGU_QUEUE_FIRST_INPUT IPU3_CSS_QUEUE_OUT
> > +#define IMGU_MAX_QUEUE_DEPTH (2 + 2)
> > +
> > +#define IMGU_NODE_IN 0 /* Input RAW image */
> > +#define IMGU_NODE_PARAMS 1 /* Input parameters */
> > +#define IMGU_NODE_OUT 2 /* Main output for still or
> video */
> > +#define IMGU_NODE_VF 3 /* Preview */
> > +#define IMGU_NODE_PV 4 /* Postview for still capture
> */
> > +#define IMGU_NODE_STAT_3A 5 /* 3A statistics */
> > +#define IMGU_NODE_STAT_DVS 6 /* DVS statistics */
> > +#define IMGU_NODE_STAT_LACE 7 /* Lace statistics */
> > +#define IMGU_NODE_NUM 8
> > +
> > +#define file_to_intel_ipu3_node(__file) \
> > + container_of(video_devdata(__file), struct imgu_video_device, vdev)
> > +
> > +#define IPU3_INPUT_MIN_WIDTH 0U
> > +#define IPU3_INPUT_MIN_HEIGHT 0U
> > +#define IPU3_INPUT_MAX_WIDTH 5120U
> > +#define IPU3_INPUT_MAX_HEIGHT 38404U
> > +#define IPU3_OUTPUT_MIN_WIDTH 2U
> > +#define IPU3_OUTPUT_MIN_HEIGHT 2U
> > +#define IPU3_OUTPUT_MAX_WIDTH 4480U
> > +#define IPU3_OUTPUT_MAX_HEIGHT 34004U
> > +
> > +struct ipu3_mem2mem2_buffer {
> > + /* Public fields */
> > + struct vb2_v4l2_buffer vbb; /* Must be the first field */
> > +
> > + /* Private fields */
> > + struct list_head list;
> > +};
> > +
> > +struct imgu_buffer {
> > + struct ipu3_mem2mem2_buffer m2m2_buf; /* Must be the first
> field */
> > + struct ipu3_css_buffer css_buf;
> > + struct ipu3_css_map map;
> > +};
> > +
> > +struct imgu_node_mapping {
> > + int css_queue;
> > + const char *name;
> > +};
> > +
> > +/**
> > + * struct imgu_video_device
> > + * each node registers as video device and maintains its
> > + * own vb2_queue.
> > + */
> > +struct imgu_video_device {
> > + const char *name;
> > + bool output; /* Frames to the driver? */
> > + bool immutable; /* Can not be enabled/disabled */
> > + bool enabled;
> > + int queued; /* Buffers already queued */
> > + struct v4l2_format vdev_fmt; /* Currently set format */
> > +
> > + /* Private fields */
> > + struct video_device vdev;
> > + struct media_pad vdev_pad;
> > + struct v4l2_mbus_framefmt pad_fmt;
> > + struct vb2_queue vbq;
> > + struct list_head buffers;
> > + /* Protect vb2_queue and vdev structs*/
> > + struct mutex lock;
> > + atomic_t sequence;
> > +};
> > +
> > +/**
> > + * struct ipu3_mem2mem2_device - mem2mem device
> > + * this is the top level helper struct used by parent PCI device
> > + * to bind everything together for media operations.
> > + */
> > +struct ipu3_mem2mem2_device {
>
> There's always 1:1 mapping between ipu3_mem2mem2_device and
> imgu_device.
> Could you merge the two?
>
You mean remove the hierarchy relationship between ipu3_mem2mem2_device and imgu_video_device? in other word, remove imgu_video_device and let ipu3_mem2mem2_device directly own nodes' member data(with redundancy removed)? Just want to have a clear picture before attempt to change, thanks!!
> > + /* Public fields, fill before registering */
> > + const char *name;
> > + const char *model;
> > + struct device *dev;
> > + int num_nodes;
> > + struct imgu_video_device *nodes;
> > + struct device *vb2_alloc_dev;
> > + const struct ipu3_mem2mem2_ops *ops;
> > + const struct vb2_mem_ops *vb2_mem_ops;
> > + unsigned int buf_struct_size;
> > + bool streaming; /* Public read only */
> > + struct v4l2_ctrl_handler *ctrl_handler;
> > +
> > + /* Private fields */
> > + struct v4l2_device v4l2_dev;
> > + struct media_device media_dev;
> > + struct media_pipeline pipeline;
> > + struct v4l2_subdev subdev;
> > + struct media_pad *subdev_pads;
> > + struct v4l2_file_operations v4l2_file_ops; };
> > +
> > +/**
> > + * struct ipu3_mem2mem2_ops - mem2mem2 ops
> > + * defines driver specific callback APIs like
> > + * start stream.
> > + */
> > +struct ipu3_mem2mem2_ops {
> > + int (*s_stream)(struct ipu3_mem2mem2_device *m2m2_dev, int
> enable);
> > +};
> > +
> > +/*
> > + * imgu_device -- ImgU (Imaging Unit) driver */ struct imgu_device {
> > + struct pci_dev *pci_dev;
> > + void __iomem *base;
> > +
> > + /* Internally enabled queues */
> > + struct {
> > + struct ipu3_css_map dmap;
> > + struct ipu3_css_buffer
> dummybufs[IMGU_MAX_QUEUE_DEPTH];
> > + } queues[IPU3_CSS_QUEUES];
> > + struct imgu_video_device mem2mem2_nodes[IMGU_NODE_NUM];
> > + bool queue_enabled[IMGU_NODE_NUM];
> > +
> > + /* Delegate v4l2 support */
> > + struct ipu3_mem2mem2_device mem2mem2;
> > + /* MMU driver for css */
> > + struct device *mmu;
> > + struct iommu_domain *domain;
> > + struct iova_domain iova_domain;
> > + /* css - Camera Sub-System */
> > + struct ipu3_css css;
> > +
> > + /*
> > + * Coarse-grained lock to protect
> > + * m2m2_buf.list and css->queue
> > + */
> > + struct mutex lock;
> > + /* Forbit streaming and buffer queuing during system suspend. */
> > + struct mutex qbuf_lock;
> > + struct {
> > + struct v4l2_rect eff; /* effective resolution */
> > + struct v4l2_rect bds; /* bayer-domain scaled resolution*/
> > + struct v4l2_rect gdc; /* gdc output resolution */
> > + } rect;
> > + /* Indicate if system suspend take place while imgu is streaming. */
> > + bool suspend_in_stream;
> > + /* Used to wait for FW buffer queue drain. */
> > + wait_queue_head_t buf_drain_wq;
> > +};
> > +
> > +int imgu_node_to_queue(int node);
> > +int imgu_map_node(struct imgu_device *imgu, int css_queue); int
> > +imgu_queue_buffers(struct imgu_device *imgu, bool initial);
> > +
> > +int ipu3_v4l2_register(struct imgu_device *dev); int
> > +ipu3_v4l2_unregister(struct imgu_device *dev); void
> > +ipu3_v4l2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state
> > +state);
> > +
> > +#endif
> > --
> > 2.7.4
> >
>
> --
> Sakari Ailus
> e-mail: sakari.ailus at iki.fi
More information about the iommu
mailing list