cron job: media_tree daily build: ERRORS

2018-06-22 Thread Hans Verkuil
This message is generated daily by a cron job that builds media_tree for
the kernels and architectures in the list below.

Results of the daily build of media_tree:

date:   Sat Jun 23 05:00:18 CEST 2018
media-tree git hash:f2809d20b9250c675fca8268a0f6274277cca7ff
media_build git hash:   26d102795c91f8593a4f74f96b955f9a8b81dbc3
v4l-utils git hash: 393a5336e7988ce057f9c14fbe56e334c75a7939
gcc version:i686-linux-gcc (GCC) 8.1.0
sparse version: 0.5.2
smatch version: 0.5.1
host hardware:  x86_64
host os:4.16.0-1-amd64

linux-git-arm-at91: OK
linux-git-arm-davinci: OK
linux-git-arm-multi: OK
linux-git-arm-pxa: OK
linux-git-arm-stm32: OK
linux-git-arm64: OK
linux-git-i686: OK
linux-git-mips: OK
linux-git-powerpc64: OK
linux-git-sh: OK
linux-git-x86_64: OK
Check COMPILE_TEST: OK
linux-2.6.36.4-i686: OK
linux-2.6.36.4-x86_64: OK
linux-2.6.37.6-i686: OK
linux-2.6.37.6-x86_64: OK
linux-2.6.38.8-i686: OK
linux-2.6.38.8-x86_64: OK
linux-2.6.39.4-i686: OK
linux-2.6.39.4-x86_64: OK
linux-3.0.101-i686: OK
linux-3.0.101-x86_64: OK
linux-3.1.10-i686: OK
linux-3.1.10-x86_64: OK
linux-3.2.101-i686: OK
linux-3.2.101-x86_64: OK
linux-3.3.8-i686: OK
linux-3.3.8-x86_64: OK
linux-3.4.113-i686: OK
linux-3.4.113-x86_64: OK
linux-3.5.7-i686: OK
linux-3.5.7-x86_64: OK
linux-3.6.11-i686: OK
linux-3.6.11-x86_64: OK
linux-3.7.10-i686: OK
linux-3.7.10-x86_64: OK
linux-3.8.13-i686: OK
linux-3.8.13-x86_64: OK
linux-3.9.11-i686: OK
linux-3.9.11-x86_64: OK
linux-3.10.108-i686: OK
linux-3.10.108-x86_64: OK
linux-3.11.10-i686: OK
linux-3.11.10-x86_64: OK
linux-3.12.74-i686: OK
linux-3.12.74-x86_64: OK
linux-3.13.11-i686: OK
linux-3.13.11-x86_64: OK
linux-3.14.79-i686: OK
linux-3.14.79-x86_64: OK
linux-3.15.10-i686: OK
linux-3.15.10-x86_64: OK
linux-3.16.56-i686: OK
linux-3.16.56-x86_64: OK
linux-3.17.8-i686: OK
linux-3.17.8-x86_64: OK
linux-3.18.102-i686: OK
linux-3.18.102-x86_64: OK
linux-3.19.8-i686: OK
linux-3.19.8-x86_64: OK
linux-4.0.9-i686: OK
linux-4.0.9-x86_64: OK
linux-4.1.51-i686: OK
linux-4.1.51-x86_64: OK
linux-4.2.8-i686: OK
linux-4.2.8-x86_64: OK
linux-4.3.6-i686: OK
linux-4.3.6-x86_64: OK
linux-4.4.109-i686: OK
linux-4.4.109-x86_64: OK
linux-4.5.7-i686: OK
linux-4.5.7-x86_64: OK
linux-4.6.7-i686: OK
linux-4.6.7-x86_64: OK
linux-4.7.10-i686: OK
linux-4.7.10-x86_64: OK
linux-4.8.17-i686: OK
linux-4.8.17-x86_64: OK
linux-4.9.91-i686: OK
linux-4.9.91-x86_64: OK
linux-4.10.17-i686: OK
linux-4.10.17-x86_64: OK
linux-4.11.12-i686: OK
linux-4.11.12-x86_64: OK
linux-4.12.14-i686: OK
linux-4.12.14-x86_64: OK
linux-4.13.16-i686: OK
linux-4.13.16-x86_64: OK
linux-4.14.42-i686: OK
linux-4.14.42-x86_64: OK
linux-4.15.14-i686: OK
linux-4.15.14-x86_64: OK
linux-4.16.8-i686: OK
linux-4.16.8-x86_64: OK
linux-4.17.2-i686: OK
linux-4.17.2-x86_64: OK
linux-4.18-rc1-i686: ERRORS
linux-4.18-rc1-x86_64: ERRORS
apps: OK
spec-git: OK
sparse: WARNINGS

Detailed results are available here:

http://www.xs4all.nl/~hverkuil/logs/Saturday.log

Full logs are available here:

http://www.xs4all.nl/~hverkuil/logs/Saturday.tar.bz2

The Media Infrastructure API from this daily build is here:

http://www.xs4all.nl/~hverkuil/spec/index.html


Re: [PATCH 16/16] media: imx: add mem2mem device

2018-06-22 Thread kbuild test robot
Hi Philipp,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v4.18-rc1 next-20180622]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:
https://github.com/0day-ci/linux/commits/Philipp-Zabel/i-MX-media-mem2mem-scaler/20180623-024533
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.1.0
reproduce:
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=8.1.0 make.cross ARCH=ia64 

All warnings (new ones prefixed by >>):

   drivers/staging/media/imx/imx-media-mem2mem.c: In function 'vidioc_querycap':
>> drivers/staging/media/imx/imx-media-mem2mem.c:160:2: warning: 'strncpy' 
>> output truncated copying 15 bytes from a string of length 17 
>> [-Wstringop-truncation]
 strncpy(cap->driver, "imx-media-mem2mem", sizeof(cap->driver) - 1);
 ^~

vim +/strncpy +160 drivers/staging/media/imx/imx-media-mem2mem.c

   153  
   154  /*
   155   * Video ioctls
   156   */
   157  static int vidioc_querycap(struct file *file, void *priv,
   158 struct v4l2_capability *cap)
   159  {
 > 160  strncpy(cap->driver, "imx-media-mem2mem", sizeof(cap->driver) - 
 > 1);
   161  strncpy(cap->card, "imx-media-mem2mem", sizeof(cap->card) - 1);
   162  strncpy(cap->bus_info, "platform:imx-media-mem2mem",
   163  sizeof(cap->bus_info) - 1);
   164  cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
   165  cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
   166  
   167  return 0;
   168  }
   169  

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: application/gzip


RE: [v1, 2/2] dt-bindings: at24: Add address-width property

2018-06-22 Thread Shevchenko, Andriy
> And I think you may missed to create a cover page. Please follow my BKM. 
> Thanks.
> git format-patch --cover --subject-prefix  -o  HEAD~n

-v will do the job in a less error prone way.


Re: [PATCH 16/16] media: imx: add mem2mem device

2018-06-22 Thread Nicolas Dufresne
Le vendredi 22 juin 2018 à 17:52 +0200, Philipp Zabel a écrit :
> Add a single imx-media mem2mem video device that uses the IPU IC PP
> (image converter post processing) task for scaling and colorspace
> conversion.
> On i.MX6Q/DL SoCs with two IPUs currently only the first IPU is used.
> 
> The hardware only supports writing to destination buffers up to
> 1024x1024 pixels in a single pass, so the mem2mem video device is
> limited to this resolution. After fixing the tiling code it should
> be possible to extend this to arbitrary sizes by rendering multiple
> tiles per frame.
> 
> Signed-off-by: Philipp Zabel 

Tested-by: Nicolas Dufresne 

> ---
>  drivers/staging/media/imx/Kconfig |   1 +
>  drivers/staging/media/imx/Makefile|   1 +
>  drivers/staging/media/imx/imx-media-dev.c |  11 +
>  drivers/staging/media/imx/imx-media-mem2mem.c | 953
> ++
>  drivers/staging/media/imx/imx-media.h |  10 +
>  5 files changed, 976 insertions(+)
>  create mode 100644 drivers/staging/media/imx/imx-media-mem2mem.c
> 
> diff --git a/drivers/staging/media/imx/Kconfig
> b/drivers/staging/media/imx/Kconfig
> index bfc17de56b17..07013cb3cb66 100644
> --- a/drivers/staging/media/imx/Kconfig
> +++ b/drivers/staging/media/imx/Kconfig
> @@ -6,6 +6,7 @@ config VIDEO_IMX_MEDIA
>   depends on HAS_DMA
>   select VIDEOBUF2_DMA_CONTIG
>   select V4L2_FWNODE
> + select V4L2_MEM2MEM_DEV
>   ---help---
> Say yes here to enable support for video4linux media
> controller
> driver for the i.MX5/6 SOC.
> diff --git a/drivers/staging/media/imx/Makefile
> b/drivers/staging/media/imx/Makefile
> index 698a4210316e..f2e722d0fa19 100644
> --- a/drivers/staging/media/imx/Makefile
> +++ b/drivers/staging/media/imx/Makefile
> @@ -6,6 +6,7 @@ imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o
> imx-ic-prpencvf.o
>  obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media.o
>  obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-common.o
>  obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-capture.o
> +obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-mem2mem.o
>  obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-vdic.o
>  obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-ic.o
>  
> diff --git a/drivers/staging/media/imx/imx-media-dev.c
> b/drivers/staging/media/imx/imx-media-dev.c
> index 289d775c4820..7a9aabcae3ee 100644
> --- a/drivers/staging/media/imx/imx-media-dev.c
> +++ b/drivers/staging/media/imx/imx-media-dev.c
> @@ -359,6 +359,17 @@ static int imx_media_probe_complete(struct
> v4l2_async_notifier *notifier)
>   goto unlock;
>  
>   ret = v4l2_device_register_subdev_nodes(&imxmd->v4l2_dev);
> + if (ret)
> + goto unlock;
> +
> + /* TODO: check whether we have IC subdevices first */
> + imxmd->m2m_vdev = imx_media_mem2mem_device_init(imxmd);
> + if (IS_ERR(imxmd->m2m_vdev)) {
> + ret = PTR_ERR(imxmd->m2m_vdev);
> + goto unlock;
> + }
> +
> + ret = imx_media_mem2mem_device_register(imxmd->m2m_vdev);
>  unlock:
>   mutex_unlock(&imxmd->mutex);
>   if (ret)
> diff --git a/drivers/staging/media/imx/imx-media-mem2mem.c
> b/drivers/staging/media/imx/imx-media-mem2mem.c
> new file mode 100644
> index ..8830f77f0407
> --- /dev/null
> +++ b/drivers/staging/media/imx/imx-media-mem2mem.c
> @@ -0,0 +1,953 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * i.MX IPUv3 mem2mem Scaler/CSC driver
> + *
> + * Copyright (C) 2011 Pengutronix, Sascha Hauer
> + * Copyright (C) 2018 Pengutronix, Philipp Zabel
> + *
> + * This program is free software; you can redistribute it and/or
> modify
> + * it under the terms of the GNU General Public License as published
> by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include "imx-media.h"
> +
> +#define MIN_W 16
> +#define MIN_H 16
> +#define MAX_W 4096
> +#define MAX_H 4096
> +
> +#define fh_to_ctx(__fh)  container_of(__fh, struct
> mem2mem_ctx, fh)
> +
> +enum {
> + V4L2_M2M_SRC = 0,
> + V4L2_M2M_DST = 1,
> +};
> +
> +struct mem2mem_priv {
> + struct imx_media_video_dev vdev;
> +
> + struct v4l2_m2m_dev   *m2m_dev;
> + struct device *dev;
> +
> + struct imx_media_dev  *md;
> +
> + struct mutex  mutex;   /* mem2mem device mutex
> */
> +
> + atomic_t  num_inst;
> +};
> +
> +#define to_mem2mem_priv(v) container_of(v, struct mem2mem_priv,
> vdev)
> +
> +/* Per-queue, driver-specific private data */
> +struct mem2mem_q_data {
> + struct v4l2_pix_format  cur_fmt;
> + struct v4l2_rectrect;
> +};
> +
> +struct mem2mem_ctx {
> + struct mem2mem_priv *priv;
> +
> + struct v4l2_fh  fh;
> + struct mem2mem_q_data   q_data[2];
> + int

Re: [PATCH 3/3] [media] dvb-frontends/cxd2099: fix boilerplate whitespace

2018-06-22 Thread Jasmin J.
You can add my Acked-by: Jasmin Jessich 

On 06/19/2018 08:51 PM, Daniel Scheller wrote:
> From: Daniel Scheller 
> 
> There's a superfluous whitespace in the boilerplate license text in both
> .c and .h files. Fix this.
> 
> Cc: Ralph Metzler 
> Cc: Manfred Voelkel 
> Signed-off-by: Daniel Scheller 
> ---
>  drivers/media/dvb-frontends/cxd2099.c | 2 +-
>  drivers/media/dvb-frontends/cxd2099.h | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/dvb-frontends/cxd2099.c 
> b/drivers/media/dvb-frontends/cxd2099.c
> index 5264e873850e..5d8884ed64ef 100644
> --- a/drivers/media/dvb-frontends/cxd2099.c
> +++ b/drivers/media/dvb-frontends/cxd2099.c
> @@ -10,7 +10,7 @@
>   *
>   * 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
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>   * GNU General Public License for more details.
>   */
>  
> diff --git a/drivers/media/dvb-frontends/cxd2099.h 
> b/drivers/media/dvb-frontends/cxd2099.h
> index 0c101bdef01d..30787095843a 100644
> --- a/drivers/media/dvb-frontends/cxd2099.h
> +++ b/drivers/media/dvb-frontends/cxd2099.h
> @@ -10,7 +10,7 @@
>   *
>   * 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
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>   * GNU General Public License for more details.
>   */
>  
> 


Re: [PATCH 1/3] [media] dvb-frontends/cxd2099: fix MODULE_LICENSE to 'GPL v2'

2018-06-22 Thread Jasmin J.
You can add my Acked-by: Jasmin Jessich 

On 06/19/2018 08:51 PM, Daniel Scheller wrote:
> From: Daniel Scheller 
> 
> In commit 3db30defab4b ("use correct MODULE_LINCESE for GPL v2 only
> according to notice in header") in the upstream repository for the
> mentioned driver at https://github.com/DigitalDevices/dddvb.git, the
> MODULE_LICENSE was fixed to "GPL v2" and is now in sync with the GPL
> copyright boilerplate. Apply this change to the kernel tree driver
> aswell.
> 
> Cc: Ralph Metzler 
> Cc: Manfred Voelkel 
> Signed-off-by: Daniel Scheller 
> ---
>  drivers/media/dvb-frontends/cxd2099.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/media/dvb-frontends/cxd2099.c 
> b/drivers/media/dvb-frontends/cxd2099.c
> index 4a0ce3037fd6..42de3d0badba 100644
> --- a/drivers/media/dvb-frontends/cxd2099.c
> +++ b/drivers/media/dvb-frontends/cxd2099.c
> @@ -701,4 +701,4 @@ module_i2c_driver(cxd2099_driver);
>  
>  MODULE_DESCRIPTION("Sony CXD2099AR Common Interface controller driver");
>  MODULE_AUTHOR("Ralph Metzler");
> -MODULE_LICENSE("GPL");
> +MODULE_LICENSE("GPL v2");
> 


Re: [PATCH 2/3] [media] dvb-frontends/cxd2099: add SPDX license identifier

2018-06-22 Thread Jasmin J.
You can add my Acked-by: Jasmin Jessich 

On 06/19/2018 08:51 PM, Daniel Scheller wrote:
> From: Daniel Scheller 
> 
> As both the MODULE_LICENSE and the boilerplates are now in sync and clear
> that the driver is licensed under the terms of the GPLv2-only, add a
> matching SPDX license identifier tag.
> 
> Cc: Ralph Metzler 
> Cc: Manfred Voelkel 
> Signed-off-by: Daniel Scheller 
> ---
>  drivers/media/dvb-frontends/cxd2099.c | 1 +
>  drivers/media/dvb-frontends/cxd2099.h | 1 +
>  2 files changed, 2 insertions(+)
> 
> diff --git a/drivers/media/dvb-frontends/cxd2099.c 
> b/drivers/media/dvb-frontends/cxd2099.c
> index 42de3d0badba..5264e873850e 100644
> --- a/drivers/media/dvb-frontends/cxd2099.c
> +++ b/drivers/media/dvb-frontends/cxd2099.c
> @@ -1,3 +1,4 @@
> +// SPDX-License-Identifier: GPL-2.0
>  /*
>   * cxd2099.c: Driver for the Sony CXD2099AR Common Interface Controller
>   *
> diff --git a/drivers/media/dvb-frontends/cxd2099.h 
> b/drivers/media/dvb-frontends/cxd2099.h
> index ec1910dec3f3..0c101bdef01d 100644
> --- a/drivers/media/dvb-frontends/cxd2099.h
> +++ b/drivers/media/dvb-frontends/cxd2099.h
> @@ -1,3 +1,4 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
>  /*
>   * cxd2099.h: Driver for the Sony CXD2099AR Common Interface Controller
>   *
> 


Re: [PATCH v2 1/2] media: add helpers for memory-to-memory media controller

2018-06-22 Thread Ezequiel Garcia
On Fri, 2018-06-22 at 08:58 +0200, Hans Verkuil wrote:
> On 06/21/2018 10:38 PM, Ezequiel Garcia wrote:
> > A memory-to-memory pipeline device consists in three
> > entities: two DMA engine and one video processing entities.
> > The DMA engine entities are linked to a V4L interface.
> > 
> > This commit add a new v4l2_m2m_{un}register_media_controller
> > API to register this topology.
> > 
> > For instance, a typical mem2mem device topology would
> > look like this:
> > 
> > Device topology
> > - entity 1: source (1 pad, 1 link)
> > type Node subtype V4L flags 0
> > pad0: Source
> > -> "proc":1 [ENABLED,IMMUTABLE]
> > 
> > - entity 3: proc (2 pads, 2 links)
> > type Node subtype Unknown flags 0
> > pad0: Source
> > -> "sink":0 [ENABLED,IMMUTABLE]
> > pad1: Sink
> > <- "source":0 [ENABLED,IMMUTABLE]
> > 
> > - entity 6: sink (1 pad, 1 link)
> > type Node subtype V4L flags 0
> > pad0: Sink
> > <- "proc":0 [ENABLED,IMMUTABLE]
> > 
> > Suggested-by: Laurent Pinchart 
> > Suggested-by: Hans Verkuil 
> > Signed-off-by: Ezequiel Garcia 
> > ---
> >  drivers/media/v4l2-core/v4l2-dev.c |  13 +-
> >  drivers/media/v4l2-core/v4l2-mem2mem.c | 174
> > +
> >  include/media/v4l2-mem2mem.h   |  19 +++
> >  include/uapi/linux/media.h |   3 +
> >  4 files changed, 204 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/media/v4l2-core/v4l2-dev.c
> > b/drivers/media/v4l2-core/v4l2-dev.c
> > index 4ffd7d60a901..c1996d73ca74 100644
> > --- a/drivers/media/v4l2-core/v4l2-dev.c
> > +++ b/drivers/media/v4l2-core/v4l2-dev.c
> > @@ -202,7 +202,7 @@ static void v4l2_device_release(struct device
> > *cd)
> > mutex_unlock(&videodev_lock);
> >  
> >  #if defined(CONFIG_MEDIA_CONTROLLER)
> > -   if (v4l2_dev->mdev) {
> > +   if (v4l2_dev->mdev && vdev->vfl_dir != VFL_DIR_M2M) {
> > /* Remove interfaces and interface links */
> > media_devnode_remove(vdev->intf_devnode);
> > if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN)
> > @@ -733,19 +733,22 @@ static void determine_valid_ioctls(struct
> > video_device *vdev)
> > BASE_VIDIOC_PRIVATE);
> >  }
> >  
> > -static int video_register_media_controller(struct video_device
> > *vdev, int type)
> > +static int video_register_media_controller(struct video_device
> > *vdev)
> >  {
> >  #if defined(CONFIG_MEDIA_CONTROLLER)
> > u32 intf_type;
> > int ret;
> >  
> > -   if (!vdev->v4l2_dev->mdev)
> > +   /* Memory-to-memory devices are more complex and use
> > +* their own function to register its mc entities.
> > +*/
> > +   if (!vdev->v4l2_dev->mdev || vdev->vfl_dir == VFL_DIR_M2M)
> > return 0;
> >  
> > vdev->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;
> > vdev->entity.function = MEDIA_ENT_F_UNKNOWN;
> >  
> > -   switch (type) {
> > +   switch (vdev->vfl_type) {
> > case VFL_TYPE_GRABBER:
> > intf_type = MEDIA_INTF_T_V4L_VIDEO;
> > vdev->entity.function = MEDIA_ENT_F_IO_V4L;
> > @@ -993,7 +996,7 @@ int __video_register_device(struct video_device
> > *vdev,
> > v4l2_device_get(vdev->v4l2_dev);
> >  
> > /* Part 5: Register the entity. */
> > -   ret = video_register_media_controller(vdev, type);
> > +   ret = video_register_media_controller(vdev);
> >  
> > /* Part 6: Activate this minor. The char device can now be
> > used. */
> > set_bit(V4L2_FL_REGISTERED, &vdev->flags);
> > diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c
> > b/drivers/media/v4l2-core/v4l2-mem2mem.c
> > index c4f963d96a79..e0e7262b7e75 100644
> > --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
> > +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
> > @@ -17,9 +17,11 @@
> >  #include 
> >  #include 
> >  
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  
> > @@ -50,6 +52,19 @@ module_param(debug, bool, 0644);
> >   * offsets but for different queues */
> >  #define DST_QUEUE_OFF_BASE (1 << 30)
> >  
> > +enum v4l2_m2m_entity_type {
> > +   MEM2MEM_ENT_TYPE_SOURCE,
> > +   MEM2MEM_ENT_TYPE_SINK,
> > +   MEM2MEM_ENT_TYPE_PROC,
> > +   MEM2MEM_ENT_TYPE_MAX
> > +};
> > +
> > +static const char * const m2m_entity_name[] = {
> > +   "source",
> > +   "sink",
> > +   "proc"
> > +};
> > +
> >  
> >  /**
> >   * struct v4l2_m2m_dev - per-device context
> > @@ -60,6 +75,15 @@ module_param(debug, bool, 0644);
> >   */
> >  struct v4l2_m2m_dev {
> > struct v4l2_m2m_ctx *curr_ctx;
> > +#ifdef CONFIG_MEDIA_CONTROLLER
> > +   struct media_entity *source;
> > +   struct media_padsource_pad;
> > +   struct media_entity sink;
> > +   struct media_padsink_pad;
> > +   struct media_entity proc;
> > +   struct media_padproc_pads[2];
> > +   struct media_intf_devnode *intf_devnode;
> > +#endif
> >  
> > struct list_headjob_queue;
> > 

[PATCH 05/16] gpu: ipu-v3: image-convert: store tile top/left position

2018-06-22 Thread Philipp Zabel
Store tile top/left position in pixels in the tile structure.
This will allow overlapping tiles with different sizes later.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 27 ++
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 3907fb7dae13..c3358e83bcc1 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -84,6 +84,8 @@ struct ipu_image_convert_dma_chan {
 struct ipu_image_tile {
u32 width;
u32 height;
+   u32 left;
+   u32 top;
/* size and strides are in bytes */
u32 size;
u32 stride;
@@ -427,13 +429,17 @@ static int calc_image_resize_coefficients(struct 
ipu_image_convert_ctx *ctx,
 static void calc_tile_dimensions(struct ipu_image_convert_ctx *ctx,
 struct ipu_image_convert_image *image)
 {
-   int i;
+   unsigned int i;
 
for (i = 0; i < ctx->num_tiles; i++) {
struct ipu_image_tile *tile = &image->tile[i];
+   const unsigned int row = i / image->num_cols;
+   const unsigned int col = i % image->num_cols;
 
tile->height = image->base.pix.height / image->num_rows;
tile->width = image->base.pix.width / image->num_cols;
+   tile->left = col * tile->width;
+   tile->top = row * tile->height;
tile->size = ((tile->height * image->fmt->bpp) >> 3) *
tile->width;
 
@@ -529,7 +535,7 @@ static void calc_tile_offsets_planar(struct 
ipu_image_convert_ctx *ctx,
struct ipu_image_convert_priv *priv = chan->priv;
const struct ipu_image_pixfmt *fmt = image->fmt;
unsigned int row, col, tile = 0;
-   u32 H, w, h, y_stride, uv_stride;
+   u32 H, top, y_stride, uv_stride;
u32 uv_row_off, uv_col_off, uv_off, u_off, v_off, tmp;
u32 y_row_off, y_col_off, y_off;
u32 y_size, uv_size;
@@ -546,13 +552,12 @@ static void calc_tile_offsets_planar(struct 
ipu_image_convert_ctx *ctx,
uv_size = y_size / (fmt->uv_width_dec * fmt->uv_height_dec);
 
for (row = 0; row < image->num_rows; row++) {
-   w = image->tile[tile].width;
-   h = image->tile[tile].height;
-   y_row_off = row * h * y_stride;
-   uv_row_off = (row * h * uv_stride) / fmt->uv_height_dec;
+   top = image->tile[tile].top;
+   y_row_off = top * y_stride;
+   uv_row_off = (top * uv_stride) / fmt->uv_height_dec;
 
for (col = 0; col < image->num_cols; col++) {
-   y_col_off = col * w;
+   y_col_off = image->tile[tile].left;
uv_col_off = y_col_off / fmt->uv_width_dec;
if (fmt->uv_packed)
uv_col_off *= 2;
@@ -589,7 +594,7 @@ static void calc_tile_offsets_packed(struct 
ipu_image_convert_ctx *ctx,
struct ipu_image_convert_priv *priv = chan->priv;
const struct ipu_image_pixfmt *fmt = image->fmt;
unsigned int row, col, tile = 0;
-   u32 w, h, bpp, stride;
+   u32 bpp, stride;
u32 row_off, col_off;
 
/* setup some convenience vars */
@@ -597,12 +602,10 @@ static void calc_tile_offsets_packed(struct 
ipu_image_convert_ctx *ctx,
bpp = fmt->bpp;
 
for (row = 0; row < image->num_rows; row++) {
-   w = image->tile[tile].width;
-   h = image->tile[tile].height;
-   row_off = row * h * stride;
+   row_off = image->tile[tile].top * stride;
 
for (col = 0; col < image->num_cols; col++) {
-   col_off = (col * w * bpp) >> 3;
+   col_off = (image->tile[tile].left * bpp) >> 3;
 
image->tile[tile].offset = row_off + col_off;
image->tile[tile].u_off = 0;
-- 
2.17.1



[PATCH 06/16] gpu: ipu-v3: image-convert: calculate tile dimensions and offsets outside fill_image

2018-06-22 Thread Philipp Zabel
This will allow to calculate seam positions after initializing the
ipu_image base structure but before calculating tile dimensions.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 17 ++---
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index c3358e83bcc1..06d65c63262d 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1447,9 +1447,6 @@ static int fill_image(struct ipu_image_convert_ctx *ctx,
else
ic_image->stride  = ic_image->base.pix.bytesperline;
 
-   calc_tile_dimensions(ctx, ic_image);
-   calc_tile_offsets(ctx, ic_image);
-
return 0;
 }
 
@@ -1654,10 +1651,6 @@ ipu_image_convert_prepare(struct ipu_soc *ipu, enum 
ipu_ic_task ic_task,
ctx->num_tiles = d_image->num_cols * d_image->num_rows;
ctx->rot_mode = rot_mode;
 
-   ret = calc_image_resize_coefficients(ctx, in, out);
-   if (ret)
-   goto out_free;
-
ret = fill_image(ctx, s_image, in, IMAGE_CONVERT_IN);
if (ret)
goto out_free;
@@ -1665,6 +1658,16 @@ ipu_image_convert_prepare(struct ipu_soc *ipu, enum 
ipu_ic_task ic_task,
if (ret)
goto out_free;
 
+   ret = calc_image_resize_coefficients(ctx, in, out);
+   if (ret)
+   goto out_free;
+
+   calc_tile_dimensions(ctx, s_image);
+   calc_tile_offsets(ctx, s_image);
+
+   calc_tile_dimensions(ctx, d_image);
+   calc_tile_offsets(ctx, d_image);
+
calc_out_tile_map(ctx);
calc_tile_resize_coefficients(ctx);
 
-- 
2.17.1



[PATCH 07/16] gpu: ipu-v3: image-convert: move tile alignment helpers

2018-06-22 Thread Philipp Zabel
Move tile_width_align and tile_height_align up so they
can be used by the tile edge position calculation code.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 54 +-
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 06d65c63262d..da6f18475b6b 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -426,6 +426,33 @@ static int calc_image_resize_coefficients(struct 
ipu_image_convert_ctx *ctx,
return 0;
 }
 
+/*
+ * We have to adjust the tile width such that the tile physaddrs and
+ * U and V plane offsets are multiples of 8 bytes as required by
+ * the IPU DMA Controller. For the planar formats, this corresponds
+ * to a pixel alignment of 16 (but use a more formal equation since
+ * the variables are available). For all the packed formats, 8 is
+ * good enough.
+ */
+static inline u32 tile_width_align(const struct ipu_image_pixfmt *fmt)
+{
+   return fmt->planar ? 8 * fmt->uv_width_dec : 8;
+}
+
+/*
+ * For tile height alignment, we have to ensure that the output tile
+ * heights are multiples of 8 lines if the IRT is required by the
+ * given rotation mode (the IRT performs rotations on 8x8 blocks
+ * at a time). If the IRT is not used, or for input image tiles,
+ * 2 lines are good enough.
+ */
+static inline u32 tile_height_align(enum ipu_image_convert_type type,
+   enum ipu_rotate_mode rot_mode)
+{
+   return (type == IMAGE_CONVERT_OUT &&
+   ipu_rot_mode_is_irt(rot_mode)) ? 8 : 2;
+}
+
 static void calc_tile_dimensions(struct ipu_image_convert_ctx *ctx,
 struct ipu_image_convert_image *image)
 {
@@ -1467,33 +1494,6 @@ static unsigned int clamp_align(unsigned int x, unsigned 
int min,
return x;
 }
 
-/*
- * We have to adjust the tile width such that the tile physaddrs and
- * U and V plane offsets are multiples of 8 bytes as required by
- * the IPU DMA Controller. For the planar formats, this corresponds
- * to a pixel alignment of 16 (but use a more formal equation since
- * the variables are available). For all the packed formats, 8 is
- * good enough.
- */
-static inline u32 tile_width_align(const struct ipu_image_pixfmt *fmt)
-{
-   return fmt->planar ? 8 * fmt->uv_width_dec : 8;
-}
-
-/*
- * For tile height alignment, we have to ensure that the output tile
- * heights are multiples of 8 lines if the IRT is required by the
- * given rotation mode (the IRT performs rotations on 8x8 blocks
- * at a time). If the IRT is not used, or for input image tiles,
- * 2 lines are good enough.
- */
-static inline u32 tile_height_align(enum ipu_image_convert_type type,
-   enum ipu_rotate_mode rot_mode)
-{
-   return (type == IMAGE_CONVERT_OUT &&
-   ipu_rot_mode_is_irt(rot_mode)) ? 8 : 2;
-}
-
 /* Adjusts input/output images to IPU restrictions */
 void ipu_image_convert_adjust(struct ipu_image *in, struct ipu_image *out,
  enum ipu_rotate_mode rot_mode)
-- 
2.17.1



[PATCH 02/16] gpu: ipu-v3: image-convert: prepare for per-tile configuration

2018-06-22 Thread Philipp Zabel
Let convert_start start from a given tile index, allocate intermediate
tile with maximum tile size.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 60 +++---
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 524a717ab28e..7eef51decc97 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -605,7 +605,8 @@ static void init_idmac_channel(struct ipu_image_convert_ctx 
*ctx,
   struct ipuv3_channel *channel,
   struct ipu_image_convert_image *image,
   enum ipu_rotate_mode rot_mode,
-  bool rot_swap_width_height)
+  bool rot_swap_width_height,
+  unsigned int tile)
 {
struct ipu_image_convert_chan *chan = ctx->chan;
unsigned int burst_size;
@@ -615,23 +616,23 @@ static void init_idmac_channel(struct 
ipu_image_convert_ctx *ctx,
unsigned int tile_idx[2];
 
if (image->type == IMAGE_CONVERT_OUT) {
-   tile_idx[0] = ctx->out_tile_map[0];
+   tile_idx[0] = ctx->out_tile_map[tile];
tile_idx[1] = ctx->out_tile_map[1];
} else {
-   tile_idx[0] = 0;
+   tile_idx[0] = tile;
tile_idx[1] = 1;
}
 
if (rot_swap_width_height) {
-   width = image->tile[0].height;
-   height = image->tile[0].width;
-   stride = image->tile[0].rot_stride;
+   width = image->tile[tile_idx[0]].height;
+   height = image->tile[tile_idx[0]].width;
+   stride = image->tile[tile_idx[0]].rot_stride;
addr0 = ctx->rot_intermediate[0].phys;
if (ctx->double_buffering)
addr1 = ctx->rot_intermediate[1].phys;
} else {
-   width = image->tile[0].width;
-   height = image->tile[0].height;
+   width = image->tile[tile_idx[0]].width;
+   height = image->tile[tile_idx[0]].height;
stride = image->stride;
addr0 = image->base.phys0 +
image->tile[tile_idx[0]].offset;
@@ -681,7 +682,7 @@ static void init_idmac_channel(struct ipu_image_convert_ctx 
*ctx,
ipu_idmac_set_double_buffer(channel, ctx->double_buffering);
 }
 
-static int convert_start(struct ipu_image_convert_run *run)
+static int convert_start(struct ipu_image_convert_run *run, unsigned int tile)
 {
struct ipu_image_convert_ctx *ctx = run->ctx;
struct ipu_image_convert_chan *chan = ctx->chan;
@@ -689,28 +690,29 @@ static int convert_start(struct ipu_image_convert_run 
*run)
struct ipu_image_convert_image *s_image = &ctx->in;
struct ipu_image_convert_image *d_image = &ctx->out;
enum ipu_color_space src_cs, dest_cs;
+   unsigned int dst_tile = ctx->out_tile_map[tile];
unsigned int dest_width, dest_height;
int ret;
 
-   dev_dbg(priv->ipu->dev, "%s: task %u: starting ctx %p run %p\n",
-   __func__, chan->ic_task, ctx, run);
+   dev_dbg(priv->ipu->dev, "%s: task %u: starting ctx %p run %p tile %u -> 
%u\n",
+   __func__, chan->ic_task, ctx, run, tile, dst_tile);
 
src_cs = ipu_pixelformat_to_colorspace(s_image->fmt->fourcc);
dest_cs = ipu_pixelformat_to_colorspace(d_image->fmt->fourcc);
 
if (ipu_rot_mode_is_irt(ctx->rot_mode)) {
/* swap width/height for resizer */
-   dest_width = d_image->tile[0].height;
-   dest_height = d_image->tile[0].width;
+   dest_width = d_image->tile[dst_tile].height;
+   dest_height = d_image->tile[dst_tile].width;
} else {
-   dest_width = d_image->tile[0].width;
-   dest_height = d_image->tile[0].height;
+   dest_width = d_image->tile[dst_tile].width;
+   dest_height = d_image->tile[dst_tile].height;
}
 
/* setup the IC resizer and CSC */
ret = ipu_ic_task_init(chan->ic,
-  s_image->tile[0].width,
-  s_image->tile[0].height,
+  s_image->tile[tile].width,
+  s_image->tile[tile].height,
   dest_width,
   dest_height,
   src_cs, dest_cs);
@@ -721,27 +723,27 @@ static int convert_start(struct ipu_image_convert_run 
*run)
 
/* init the source MEM-->IC PP IDMAC channel */
init_idmac_channel(ctx, chan->in_chan, s_image,
-  IPU_ROTATE_NONE, false);
+  IPU_ROTATE_NONE, false, tile);
 
if (ipu_rot_mode_is_irt(ctx->rot_mode)) {
 

[PATCH 12/16] gpu: ipu-v3: image-convert: relax output alignment restrictions

2018-06-22 Thread Philipp Zabel
If we allow different tile sizes, the output tile with / height
alignment doesn't need to be multiplied by number of columns / rows.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 04113b1c7a92..3eb74d41733f 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1852,9 +1852,8 @@ void ipu_image_convert_adjust(struct ipu_image *in, 
struct ipu_image *out,
}
 
/* align output width/height */
-   w_align = ilog2(tile_width_align(outfmt) * num_out_cols);
-   h_align = ilog2(tile_height_align(IMAGE_CONVERT_OUT, rot_mode) *
-   num_out_rows);
+   w_align = ilog2(tile_width_align(outfmt));
+   h_align = ilog2(tile_height_align(IMAGE_CONVERT_OUT, rot_mode));
out->pix.width = clamp_align(out->pix.width, MIN_W, MAX_W, w_align);
out->pix.height = clamp_align(out->pix.height, MIN_H, MAX_H, h_align);
 
-- 
2.17.1



[PATCH 16/16] media: imx: add mem2mem device

2018-06-22 Thread Philipp Zabel
Add a single imx-media mem2mem video device that uses the IPU IC PP
(image converter post processing) task for scaling and colorspace
conversion.
On i.MX6Q/DL SoCs with two IPUs currently only the first IPU is used.

The hardware only supports writing to destination buffers up to
1024x1024 pixels in a single pass, so the mem2mem video device is
limited to this resolution. After fixing the tiling code it should
be possible to extend this to arbitrary sizes by rendering multiple
tiles per frame.

Signed-off-by: Philipp Zabel 
---
 drivers/staging/media/imx/Kconfig |   1 +
 drivers/staging/media/imx/Makefile|   1 +
 drivers/staging/media/imx/imx-media-dev.c |  11 +
 drivers/staging/media/imx/imx-media-mem2mem.c | 953 ++
 drivers/staging/media/imx/imx-media.h |  10 +
 5 files changed, 976 insertions(+)
 create mode 100644 drivers/staging/media/imx/imx-media-mem2mem.c

diff --git a/drivers/staging/media/imx/Kconfig 
b/drivers/staging/media/imx/Kconfig
index bfc17de56b17..07013cb3cb66 100644
--- a/drivers/staging/media/imx/Kconfig
+++ b/drivers/staging/media/imx/Kconfig
@@ -6,6 +6,7 @@ config VIDEO_IMX_MEDIA
depends on HAS_DMA
select VIDEOBUF2_DMA_CONTIG
select V4L2_FWNODE
+   select V4L2_MEM2MEM_DEV
---help---
  Say yes here to enable support for video4linux media controller
  driver for the i.MX5/6 SOC.
diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 698a4210316e..f2e722d0fa19 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -6,6 +6,7 @@ imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o 
imx-ic-prpencvf.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-common.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-capture.o
+obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-mem2mem.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-vdic.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-ic.o
 
diff --git a/drivers/staging/media/imx/imx-media-dev.c 
b/drivers/staging/media/imx/imx-media-dev.c
index 289d775c4820..7a9aabcae3ee 100644
--- a/drivers/staging/media/imx/imx-media-dev.c
+++ b/drivers/staging/media/imx/imx-media-dev.c
@@ -359,6 +359,17 @@ static int imx_media_probe_complete(struct 
v4l2_async_notifier *notifier)
goto unlock;
 
ret = v4l2_device_register_subdev_nodes(&imxmd->v4l2_dev);
+   if (ret)
+   goto unlock;
+
+   /* TODO: check whether we have IC subdevices first */
+   imxmd->m2m_vdev = imx_media_mem2mem_device_init(imxmd);
+   if (IS_ERR(imxmd->m2m_vdev)) {
+   ret = PTR_ERR(imxmd->m2m_vdev);
+   goto unlock;
+   }
+
+   ret = imx_media_mem2mem_device_register(imxmd->m2m_vdev);
 unlock:
mutex_unlock(&imxmd->mutex);
if (ret)
diff --git a/drivers/staging/media/imx/imx-media-mem2mem.c 
b/drivers/staging/media/imx/imx-media-mem2mem.c
new file mode 100644
index ..8830f77f0407
--- /dev/null
+++ b/drivers/staging/media/imx/imx-media-mem2mem.c
@@ -0,0 +1,953 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * i.MX IPUv3 mem2mem Scaler/CSC driver
+ *
+ * Copyright (C) 2011 Pengutronix, Sascha Hauer
+ * Copyright (C) 2018 Pengutronix, Philipp Zabel
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "imx-media.h"
+
+#define MIN_W 16
+#define MIN_H 16
+#define MAX_W 4096
+#define MAX_H 4096
+
+#define fh_to_ctx(__fh)container_of(__fh, struct mem2mem_ctx, fh)
+
+enum {
+   V4L2_M2M_SRC = 0,
+   V4L2_M2M_DST = 1,
+};
+
+struct mem2mem_priv {
+   struct imx_media_video_dev vdev;
+
+   struct v4l2_m2m_dev   *m2m_dev;
+   struct device *dev;
+
+   struct imx_media_dev  *md;
+
+   struct mutex  mutex;   /* mem2mem device mutex */
+
+   atomic_t  num_inst;
+};
+
+#define to_mem2mem_priv(v) container_of(v, struct mem2mem_priv, vdev)
+
+/* Per-queue, driver-specific private data */
+struct mem2mem_q_data {
+   struct v4l2_pix_format  cur_fmt;
+   struct v4l2_rectrect;
+};
+
+struct mem2mem_ctx {
+   struct mem2mem_priv *priv;
+
+   struct v4l2_fh  fh;
+   struct mem2mem_q_data   q_data[2];
+   int error;
+   struct ipu_image_convert_ctx *icc;
+
+   struct v4l2_ctrl_handler ctrl_hdlr;
+   int rotate;
+   bool hflip;
+   bool vflip;
+   enum ipu_rotate_moderot_mode;
+};
+
+static struct mem2mem_q_data *get_q_data(struct mem2mem_ctx *ctx,
+enum v

[PATCH 08/16] gpu: ipu-v3: image-convert: select optimal seam positions

2018-06-22 Thread Philipp Zabel
Select seam positions that minimize distortions during seam hiding while
satifying input and output IDMAC, rotator, and image format constraints.

This code looks for aligned output seam positions that minimize the
difference between the fractional corresponding ideal input positions
and the input positions rounded to alignment requirements.

Since now tiles can be sized differently, alignment restrictions of the
complete image can be relaxed in the next step.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 315 -
 1 file changed, 309 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index da6f18475b6b..fbb46d296170 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -426,6 +426,115 @@ static int calc_image_resize_coefficients(struct 
ipu_image_convert_ctx *ctx,
return 0;
 }
 
+#define round_closest(x, y) round_down((x) + (y)/2, (y))
+
+/*
+ * Find the best aligned seam position in the inverval [out_start, out_end].
+ * Rotation and image offsets are out of scope.
+ *
+ * @out_start: start of inverval, must be within 1024 pixels / lines
+ * of out_end
+ * @out_end: output right / bottom edge, end of interval
+ * @in_align: input alignment, either horizontal 8-byte line start address
+ *alignment, or pixel alignment due to image format
+ * @out_align: output alignment, either horizontal 8-byte line start address
+ * alignment, or pixel alignment due to image format or rotator
+ * block size
+ * @out_burst: horizontal output burst size or rotator block size
+ * @downsize_coeff: downsizing section coefficient
+ * @resize_coeff: main processing section resizing coefficient
+ * @allow_overshoot: ignore out_burst if true
+ * @_in_seam: aligned input seam position return value
+ * @_out_seam: aligned output seam position return value
+ */
+static void find_best_seam(struct ipu_image_convert_ctx *ctx,
+  unsigned int out_start,
+  unsigned int out_end,
+  unsigned int in_align,
+  unsigned int out_align,
+  unsigned int out_burst,
+  unsigned int downsize_coeff,
+  unsigned int resize_coeff,
+  bool allow_overshoot,
+  u32 *_in_seam,
+  u32 *_out_seam)
+{
+   struct device *dev = ctx->chan->priv->ipu->dev;
+   unsigned int out_pos;
+   /* Input / output seam position candidates */
+   unsigned int out_seam = 0;
+   unsigned int in_seam = 0;
+   unsigned int min_diff = UINT_MAX;
+
+   /*
+* Output tiles must start at a multiple of 8 bytes horizontally and
+* possibly at an even line horizontally depending on the pixel format.
+* Only consider output aligned positions for the seam.
+*/
+   out_start = round_up(out_start, out_align);
+   for (out_pos = out_start; out_pos < out_end; out_pos += out_align) {
+   unsigned int in_pos;
+   unsigned int in_pos_aligned;
+   unsigned int abs_diff;
+
+   /*
+* Tiles in the right row / bottom column may not be allowed to
+* overshoot horizontally / vertically. out_burst may be the
+* actual DMA burst size, or the rotator block size.
+*/
+   if (!allow_overshoot && (out_end - out_pos) % out_burst)
+   continue;
+
+   /*
+* Input sample position, corresponding to out_pos, 19.13 fixed
+* point.
+*/
+   in_pos = (out_pos * resize_coeff) << downsize_coeff;
+   /*
+* The closest input sample position that we could actually
+* start the input tile at, 19.13 fixed point.
+*/
+   in_pos_aligned = round_closest(in_pos, 8192U * in_align);
+
+   if (in_pos < in_pos_aligned)
+   abs_diff = in_pos_aligned - in_pos;
+   else
+   abs_diff = in_pos - in_pos_aligned;
+
+   if (abs_diff < min_diff) {
+   in_seam = in_pos_aligned;
+   out_seam = out_pos;
+   min_diff = abs_diff;
+   }
+   }
+
+   *_out_seam = out_seam;
+   /* Convert 19.13 fixed point to integer seam position */
+   *_in_seam = DIV_ROUND_CLOSEST(in_seam, 8192U);
+
+   dev_dbg(dev, "%s: out_seam %u in [%u, %u], in_seam %u diff %u.%03u\n",
+   __func__, out_seam, out_start, out_end, *_in_seam,
+   min_diff / 8192,
+   DIV_ROUND_CLOSEST(min_diff % 8192 * 1000, 8192));
+}
+
+/*
+ * Tile left edges are required to be aligned

[PATCH 03/16] gpu: ipu-v3: image-convert: calculate per-tile resize coefficients

2018-06-22 Thread Philipp Zabel
Slightly modifying resize coefficients per-tile allows to completely
hide the seams between tiles and to sample the correct input pixels at
the bottom and right edges of the image.

Tiling requires a bilinear interpolator reset at each tile start, which
causes the image to be slightly shifted if the starting pixel should not
have been sampled from an integer pixel position in the source image
according to the full image resizing ratio. To work around this
hardware limitation, calculate per-tile resizing coefficients that make
sure that the correct input pixels are sampled at the tile end.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 236 -
 1 file changed, 234 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 7eef51decc97..12da0772bff0 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -135,6 +135,12 @@ struct ipu_image_convert_ctx {
struct ipu_image_convert_image in;
struct ipu_image_convert_image out;
enum ipu_rotate_mode rot_mode;
+   u32 downsize_coeff_h;
+   u32 downsize_coeff_v;
+   u32 image_resize_coeff_h;
+   u32 image_resize_coeff_v;
+   u32 resize_coeffs_h[MAX_STRIPES_W];
+   u32 resize_coeffs_v[MAX_STRIPES_H];
 
/* intermediate buffer for rotation */
struct ipu_image_convert_dma_buf rot_intermediate[2];
@@ -355,6 +361,69 @@ static inline int num_stripes(int dim)
return 4;
 }
 
+/*
+ * Calculate downsizing coefficients, which are the same for all tiles,
+ * and bilinear resizing coefficients, which are used to find the best
+ * seam positions.
+ */
+static int calc_image_resize_coefficients(struct ipu_image_convert_ctx *ctx,
+ struct ipu_image *in,
+ struct ipu_image *out)
+{
+   u32 downsized_width = in->rect.width;
+   u32 downsized_height = in->rect.height;
+   u32 downsize_coeff_v = 0;
+   u32 downsize_coeff_h = 0;
+   u32 resized_width = out->rect.width;
+   u32 resized_height = out->rect.height;
+   u32 resize_coeff_h;
+   u32 resize_coeff_v;
+
+   if (ipu_rot_mode_is_irt(ctx->rot_mode)) {
+   resized_width = out->rect.height;
+   resized_height = out->rect.width;
+   }
+
+   /* Do not let invalid input lead to an endless loop below */
+   if (WARN_ON(resized_width == 0 || resized_height == 0))
+   return -EINVAL;
+
+   while (downsized_width >= resized_width * 2) {
+   downsized_width >>= 1;
+   downsize_coeff_h++;
+   }
+
+   while (downsized_height >= resized_height * 2) {
+   downsized_height >>= 1;
+   downsize_coeff_v++;
+   }
+
+   /*
+* Calculate the bilinear resizing coefficients that could be used if
+* we were converting with a single tile. The bottom right output pixel
+* should sample as close as possible to the bottom right input pixel
+* out of the decimator, but not overshoot it:
+*/
+   resize_coeff_h = 8192 * (downsized_width - 1) / (resized_width - 1);
+   resize_coeff_v = 8192 * (downsized_height - 1) / (resized_height - 1);
+
+   dev_dbg(ctx->chan->priv->ipu->dev,
+   "%s: hscale: >>%u, *8192/%u vscale: >>%u, *8192/%u, %ux%u 
tiles\n",
+   __func__, downsize_coeff_h, resize_coeff_h, downsize_coeff_v,
+   resize_coeff_v, ctx->in.num_cols, ctx->in.num_rows);
+
+   if (downsize_coeff_h > 2 || downsize_coeff_v  > 2 ||
+   resize_coeff_h > 0x3fff || resize_coeff_v > 0x3fff)
+   return -EINVAL;
+
+   ctx->downsize_coeff_h = downsize_coeff_h;
+   ctx->downsize_coeff_v = downsize_coeff_v;
+   ctx->image_resize_coeff_h = resize_coeff_h;
+   ctx->image_resize_coeff_v = resize_coeff_v;
+
+   return 0;
+}
+
 static void calc_tile_dimensions(struct ipu_image_convert_ctx *ctx,
 struct ipu_image_convert_image *image)
 {
@@ -558,6 +627,149 @@ static void calc_tile_offsets(struct 
ipu_image_convert_ctx *ctx,
calc_tile_offsets_packed(ctx, image);
 }
 
+/*
+ * Calculate the resizing ratio for the IC main processing section given input
+ * size, fixed downsizing coefficient, and output size.
+ * Either round to closest for the next tile's first pixel to minimize seams
+ * and distortion (for all but right column / bottom row), or round down to
+ * avoid sampling beyond the edges of the input image for this tile's last
+ * pixel.
+ * Returns the resizing coefficient, resizing ratio is 8192.0 / resize_coeff.
+ */
+static u32 calc_resize_coeff(u32 input_size, u32 downsize_coeff,
+u32 output_size, bool allow_overshoot)
+{
+   u32 downsized = input_size >> downsize_coeff;
+
+   if (allow_oversh

[PATCH 01/16] gpu: ipu-v3: ipu-ic: allow to manually set resize coefficients

2018-06-22 Thread Philipp Zabel
For tiled scaling, we want to compute the scaling coefficients
externally in such a way that the interpolation overshoots tile
boundaries and samples up to the first pixel of the next tile.
Prepare to override the resizing coefficients from the image
conversion code.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-ic.c | 52 +++--
 include/video/imx-ipu-v3.h  |  6 +
 2 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-ic.c b/drivers/gpu/ipu-v3/ipu-ic.c
index 67cc820253a9..594c3cbc8291 100644
--- a/drivers/gpu/ipu-v3/ipu-ic.c
+++ b/drivers/gpu/ipu-v3/ipu-ic.c
@@ -442,36 +442,40 @@ int ipu_ic_task_graphics_init(struct ipu_ic *ic,
 }
 EXPORT_SYMBOL_GPL(ipu_ic_task_graphics_init);
 
-int ipu_ic_task_init(struct ipu_ic *ic,
-int in_width, int in_height,
-int out_width, int out_height,
-enum ipu_color_space in_cs,
-enum ipu_color_space out_cs)
+int ipu_ic_task_init_rsc(struct ipu_ic *ic,
+int in_width, int in_height,
+int out_width, int out_height,
+enum ipu_color_space in_cs,
+enum ipu_color_space out_cs,
+u32 rsc)
 {
struct ipu_ic_priv *priv = ic->priv;
-   u32 reg, downsize_coeff, resize_coeff;
+   u32 downsize_coeff, resize_coeff;
unsigned long flags;
int ret = 0;
 
-   /* Setup vertical resizing */
-   ret = calc_resize_coeffs(ic, in_height, out_height,
-&resize_coeff, &downsize_coeff);
-   if (ret)
-   return ret;
+   if (!rsc) {
+   /* Setup vertical resizing */
 
-   reg = (downsize_coeff << 30) | (resize_coeff << 16);
+   ret = calc_resize_coeffs(ic, in_height, out_height,
+&resize_coeff, &downsize_coeff);
+   if (ret)
+   return ret;
+
+   rsc = (downsize_coeff << 30) | (resize_coeff << 16);
 
-   /* Setup horizontal resizing */
-   ret = calc_resize_coeffs(ic, in_width, out_width,
-&resize_coeff, &downsize_coeff);
-   if (ret)
-   return ret;
+   /* Setup horizontal resizing */
+   ret = calc_resize_coeffs(ic, in_width, out_width,
+&resize_coeff, &downsize_coeff);
+   if (ret)
+   return ret;
 
-   reg |= (downsize_coeff << 14) | resize_coeff;
+   rsc |= (downsize_coeff << 14) | resize_coeff;
+   }
 
spin_lock_irqsave(&priv->lock, flags);
 
-   ipu_ic_write(ic, reg, ic->reg->rsc);
+   ipu_ic_write(ic, rsc, ic->reg->rsc);
 
/* Setup color space conversion */
ic->in_cs = in_cs;
@@ -487,6 +491,16 @@ int ipu_ic_task_init(struct ipu_ic *ic,
spin_unlock_irqrestore(&priv->lock, flags);
return ret;
 }
+
+int ipu_ic_task_init(struct ipu_ic *ic,
+int in_width, int in_height,
+int out_width, int out_height,
+enum ipu_color_space in_cs,
+enum ipu_color_space out_cs)
+{
+   return ipu_ic_task_init_rsc(ic, in_width, in_height, out_width,
+   out_height, in_cs, out_cs, 0);
+}
 EXPORT_SYMBOL_GPL(ipu_ic_task_init);
 
 int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index abbad94e14a1..94f0eec821c8 100644
--- a/include/video/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -387,6 +387,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
 int out_width, int out_height,
 enum ipu_color_space in_cs,
 enum ipu_color_space out_cs);
+int ipu_ic_task_init_rsc(struct ipu_ic *ic,
+int in_width, int in_height,
+int out_width, int out_height,
+enum ipu_color_space in_cs,
+enum ipu_color_space out_cs,
+u32 rsc);
 int ipu_ic_task_graphics_init(struct ipu_ic *ic,
  enum ipu_color_space in_g_cs,
  bool galpha_en, u32 galpha,
-- 
2.17.1



[PATCH 09/16] gpu: ipu-v3: image-convert: fix debug output for varying tile sizes

2018-06-22 Thread Philipp Zabel
Since tile dimensions now vary between tiles, add debug output for each
tile's position and dimensions.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index fbb46d296170..edd59c935710 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -302,12 +302,11 @@ static void dump_format(struct ipu_image_convert_ctx *ctx,
struct ipu_image_convert_priv *priv = chan->priv;
 
dev_dbg(priv->ipu->dev,
-   "task %u: ctx %p: %s format: %dx%d (%dx%d tiles of size %dx%d), 
%c%c%c%c\n",
+   "task %u: ctx %p: %s format: %dx%d (%dx%d tiles), %c%c%c%c\n",
chan->ic_task, ctx,
ic_image->type == IMAGE_CONVERT_OUT ? "Output" : "Input",
ic_image->base.pix.width, ic_image->base.pix.height,
ic_image->num_cols, ic_image->num_rows,
-   ic_image->tile[0].width, ic_image->tile[0].height,
ic_image->fmt->fourcc & 0xff,
(ic_image->fmt->fourcc >> 8) & 0xff,
(ic_image->fmt->fourcc >> 16) & 0xff,
@@ -755,6 +754,8 @@ static void find_seams(struct ipu_image_convert_ctx *ctx,
 static void calc_tile_dimensions(struct ipu_image_convert_ctx *ctx,
 struct ipu_image_convert_image *image)
 {
+   struct ipu_image_convert_chan *chan = ctx->chan;
+   struct ipu_image_convert_priv *priv = chan->priv;
unsigned int i;
 
for (i = 0; i < ctx->num_tiles; i++) {
@@ -779,6 +780,13 @@ static void calc_tile_dimensions(struct 
ipu_image_convert_ctx *ctx,
tile->rot_stride =
(image->fmt->bpp * tile->height) >> 3;
}
+
+   dev_dbg(priv->ipu->dev,
+   "task %u: ctx %p: %s@[%u,%u]: %ux%u@%u,%u\n",
+   chan->ic_task, ctx,
+   image->type == IMAGE_CONVERT_IN ? "Input" : "Output",
+   row, col,
+   tile->width, tile->height, tile->left, tile->top);
}
 }
 
-- 
2.17.1



[PATCH 00/16] i.MX media mem2mem scaler

2018-06-22 Thread Philipp Zabel
Hi,

we have image conversion code for scaling and colorspace conversion in
the IPUv3 base driver for a while. Since the IC hardware can only write
up to 1024x1024 pixel buffers, it scales to larger output buffers by
splitting the input and output frame into similarly sized tiles.

This causes the issue that the bilinear interpolation resets at the tile
boundary: instead of smoothly interpolating across the seam, there is a
jump in the input sample position that is very apparent for high
upscaling factors. This can be avoided by slightly changing the scaling
coefficients to let the left/top tiles overshoot their input sampling
into the first pixel / line of their right / bottom neighbors. The error
can be further reduced by letting tiles be differently sized and by
selecting seam positions that minimize the input sampling position error
at tile boundaries.
This is complicated by different DMA start address, burst size, and
rotator block size alignment requirements, depending on the input and
output pixel formats, and the fact that flipping happens in different
places depending on the rotation.

This series implements optimal seam position selection and seam hiding
with per-tile resizing coefficients and adds a scaling mem2mem device
to the imx-media driver.

regards
Philipp

Philipp Zabel (16):
  gpu: ipu-v3: ipu-ic: allow to manually set resize coefficients
  gpu: ipu-v3: image-convert: prepare for per-tile configuration
  gpu: ipu-v3: image-convert: calculate per-tile resize coefficients
  gpu: ipu-v3: image-convert: reconfigure IC per tile
  gpu: ipu-v3: image-convert: store tile top/left position
  gpu: ipu-v3: image-convert: calculate tile dimensions and offsets
outside fill_image
  gpu: ipu-v3: image-convert: move tile alignment helpers
  gpu: ipu-v3: image-convert: select optimal seam positions
  gpu: ipu-v3: image-convert: fix debug output for varying tile sizes
  gpu: ipu-v3: image-convert: relax tile width alignment for NV12 and
NV16
  gpu: ipu-v3: image-convert: relax input alignment restrictions
  gpu: ipu-v3: image-convert: relax output alignment restrictions
  gpu: ipu-v3: image-convert: fix bytesperline adjustment
  gpu: ipu-v3: image-convert: add some ASCII art to the exposition
  gpu: ipu-v3: image-convert: disable double buffering if necessary
  media: imx: add mem2mem device

 drivers/gpu/ipu-v3/ipu-ic.c   |  52 +-
 drivers/gpu/ipu-v3/ipu-image-convert.c| 865 +---
 drivers/staging/media/imx/Kconfig |   1 +
 drivers/staging/media/imx/Makefile|   1 +
 drivers/staging/media/imx/imx-media-dev.c |  11 +
 drivers/staging/media/imx/imx-media-mem2mem.c | 953 ++
 drivers/staging/media/imx/imx-media.h |  10 +
 include/video/imx-ipu-v3.h|   6 +
 8 files changed, 1760 insertions(+), 139 deletions(-)
 create mode 100644 drivers/staging/media/imx/imx-media-mem2mem.c

-- 
2.17.1



[PATCH 11/16] gpu: ipu-v3: image-convert: relax input alignment restrictions

2018-06-22 Thread Philipp Zabel
If we allow the 8-pixel DMA bursts to overshoot the end of the line, the
only input alignment restrictions are dictated by the pixel format and
8-byte aligned line start address.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 7 ---
 1 file changed, 7 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 68d84fae9b9d..04113b1c7a92 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1851,13 +1851,6 @@ void ipu_image_convert_adjust(struct ipu_image *in, 
struct ipu_image *out,
num_in_cols = num_out_cols;
}
 
-   /* align input width/height */
-   w_align = ilog2(tile_width_align(infmt) * num_in_cols);
-   h_align = ilog2(tile_height_align(IMAGE_CONVERT_IN, rot_mode) *
-   num_in_rows);
-   in->pix.width = clamp_align(in->pix.width, MIN_W, MAX_W, w_align);
-   in->pix.height = clamp_align(in->pix.height, MIN_H, MAX_H, h_align);
-
/* align output width/height */
w_align = ilog2(tile_width_align(outfmt) * num_out_cols);
h_align = ilog2(tile_height_align(IMAGE_CONVERT_OUT, rot_mode) *
-- 
2.17.1



[PATCH 15/16] gpu: ipu-v3: image-convert: disable double buffering if necessary

2018-06-22 Thread Philipp Zabel
Double-buffering only works if tile sizes are the same and the resizing
coefficient does not change between tiles, even for non-planar formats.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 27 --
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index c6050cf12885..0fbffc0b058a 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1934,6 +1934,7 @@ ipu_image_convert_prepare(struct ipu_soc *ipu, enum 
ipu_ic_task ic_task,
struct ipu_image_convert_chan *chan;
struct ipu_image_convert_ctx *ctx;
unsigned long flags;
+   unsigned int i;
bool get_res;
int ret;
 
@@ -2017,15 +2018,37 @@ ipu_image_convert_prepare(struct ipu_soc *ipu, enum 
ipu_ic_task ic_task,
 * for every tile, and therefore would have to be updated for
 * each buffer which is not possible. So double-buffering is
 * impossible when either the source or destination images are
-* a planar format (YUV420, YUV422P, etc.).
+* a planar format (YUV420, YUV422P, etc.). Further, differently
+* sized tiles or different resizing coefficients per tile
+* prevent double-buffering as well.
 */
ctx->double_buffering = (ctx->num_tiles > 1 &&
 !s_image->fmt->planar &&
 !d_image->fmt->planar);
+   for (i = 1; i < ctx->num_tiles; i++) {
+   if (ctx->in.tile[i].width != ctx->in.tile[0].width ||
+   ctx->in.tile[i].height != ctx->in.tile[0].height ||
+   ctx->out.tile[i].width != ctx->out.tile[0].width ||
+   ctx->out.tile[i].height != ctx->out.tile[0].height) {
+   ctx->double_buffering = false;
+   break;
+   }
+   }
+   for (i = 1; i < ctx->in.num_cols; i++) {
+   if (ctx->resize_coeffs_h[i] != ctx->resize_coeffs_h[0]) {
+   ctx->double_buffering = false;
+   break;
+   }
+   }
+   for (i = 1; i < ctx->in.num_rows; i++) {
+   if (ctx->resize_coeffs_v[i] != ctx->resize_coeffs_v[0]) {
+   ctx->double_buffering = false;
+   break;
+   }
+   }
 
if (ipu_rot_mode_is_irt(ctx->rot_mode)) {
unsigned long intermediate_size = d_image->tile[0].size;
-   unsigned int i;
 
for (i = 1; i < ctx->num_tiles; i++) {
if (d_image->tile[i].size > intermediate_size)
-- 
2.17.1



[PATCH 10/16] gpu: ipu-v3: image-convert: relax tile width alignment for NV12 and NV16

2018-06-22 Thread Philipp Zabel
For the planar but U/V-packed formats NV12 and NV16, 8 pixel width
alignment is good enough to fulfill the 8 byte stride requirement.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index edd59c935710..68d84fae9b9d 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -544,7 +544,7 @@ static inline u32 tile_top_align(const struct 
ipu_image_pixfmt *fmt)
  */
 static inline u32 tile_width_align(const struct ipu_image_pixfmt *fmt)
 {
-   return fmt->planar ? 8 * fmt->uv_width_dec : 8;
+   return (fmt->planar && !fmt->uv_packed) ? 8 * fmt->uv_width_dec : 8;
 }
 
 /*
-- 
2.17.1



[PATCH 04/16] gpu: ipu-v3: image-convert: reconfigure IC per tile

2018-06-22 Thread Philipp Zabel
For differently sized tiles or if the resizing coefficients change,
we have to stop, reconfigure, and restart the IC between tiles.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 65 +-
 1 file changed, 44 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 12da0772bff0..3907fb7dae13 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1131,6 +1131,24 @@ static irqreturn_t do_bh(int irq, void *dev_id)
return IRQ_HANDLED;
 }
 
+static bool ic_settings_changed(struct ipu_image_convert_ctx *ctx)
+{
+   unsigned int cur_tile = ctx->next_tile - 1;
+   unsigned int next_tile = ctx->next_tile;
+
+   if (ctx->resize_coeffs_h[cur_tile % ctx->in.num_cols] !=
+   ctx->resize_coeffs_h[next_tile % ctx->in.num_cols] ||
+   ctx->resize_coeffs_v[cur_tile / ctx->in.num_cols] !=
+   ctx->resize_coeffs_v[next_tile / ctx->in.num_cols] ||
+   ctx->in.tile[cur_tile].width != ctx->in.tile[next_tile].width ||
+   ctx->in.tile[cur_tile].height != ctx->in.tile[next_tile].height ||
+   ctx->out.tile[cur_tile].width != ctx->out.tile[next_tile].width ||
+   ctx->out.tile[cur_tile].height != ctx->out.tile[next_tile].height)
+   return true;
+
+   return false;
+}
+
 /* hold irqlock when calling */
 static irqreturn_t do_irq(struct ipu_image_convert_run *run)
 {
@@ -1174,27 +1192,32 @@ static irqreturn_t do_irq(struct ipu_image_convert_run 
*run)
 * not done, place the next tile buffers.
 */
if (!ctx->double_buffering) {
-
-   src_tile = &s_image->tile[ctx->next_tile];
-   dst_idx = ctx->out_tile_map[ctx->next_tile];
-   dst_tile = &d_image->tile[dst_idx];
-
-   ipu_cpmem_set_buffer(chan->in_chan, 0,
-s_image->base.phys0 + src_tile->offset);
-   ipu_cpmem_set_buffer(outch, 0,
-d_image->base.phys0 + dst_tile->offset);
-   if (s_image->fmt->planar)
-   ipu_cpmem_set_uv_offset(chan->in_chan,
-   src_tile->u_off,
-   src_tile->v_off);
-   if (d_image->fmt->planar)
-   ipu_cpmem_set_uv_offset(outch,
-   dst_tile->u_off,
-   dst_tile->v_off);
-
-   ipu_idmac_select_buffer(chan->in_chan, 0);
-   ipu_idmac_select_buffer(outch, 0);
-
+   if (ic_settings_changed(ctx)) {
+   convert_stop(run);
+   convert_start(run, ctx->next_tile);
+   } else {
+   src_tile = &s_image->tile[ctx->next_tile];
+   dst_idx = ctx->out_tile_map[ctx->next_tile];
+   dst_tile = &d_image->tile[dst_idx];
+
+   ipu_cpmem_set_buffer(chan->in_chan, 0,
+s_image->base.phys0 +
+src_tile->offset);
+   ipu_cpmem_set_buffer(outch, 0,
+d_image->base.phys0 +
+dst_tile->offset);
+   if (s_image->fmt->planar)
+   ipu_cpmem_set_uv_offset(chan->in_chan,
+   src_tile->u_off,
+   src_tile->v_off);
+   if (d_image->fmt->planar)
+   ipu_cpmem_set_uv_offset(outch,
+   dst_tile->u_off,
+   dst_tile->v_off);
+
+   ipu_idmac_select_buffer(chan->in_chan, 0);
+   ipu_idmac_select_buffer(outch, 0);
+   }
} else if (ctx->next_tile < ctx->num_tiles - 1) {
 
src_tile = &s_image->tile[ctx->next_tile + 1];
-- 
2.17.1



[PATCH 14/16] gpu: ipu-v3: image-convert: add some ASCII art to the exposition

2018-06-22 Thread Philipp Zabel
Visualize the scaling and rotation pipeline with some ASCII art
diagrams. Remove the FIXME comment about missing seam prevention.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 39 +++---
 1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 43eaa512e8c2..c6050cf12885 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -37,17 +37,36 @@
  * when double_buffering boolean is set).
  *
  * Note that the input frame must be split up into the same number
- * of tiles as the output frame.
+ * of tiles as the output frame:
  *
- * FIXME: at this point there is no attempt to deal with visible seams
- * at the tile boundaries when upscaling. The seams are caused by a reset
- * of the bilinear upscale interpolation when starting a new tile. The
- * seams are barely visible for small upscale factors, but become
- * increasingly visible as the upscale factor gets larger, since more
- * interpolated pixels get thrown out at the tile boundaries. A possilble
- * fix might be to overlap tiles of different sizes, but this must be done
- * while also maintaining the IDMAC dma buffer address alignment and 8x8 IRT
- * alignment restrictions of each tile.
+ *   +-+-+
+ *   +-+---+ |  A  | B   |
+ *   | A   | B | | | |
+ *   +-+---+   -->   +-+-+
+ *   | C   | D | |  C  | D   |
+ *   +-+---+ | | |
+ *   +-+-+
+ *
+ * Clockwise 90° rotations are handled by first rescaling into a
+ * reusable temporary tile buffer and then rotating with the 8x8
+ * block rotator, writing to the correct destination:
+ *
+ * +-+-+
+ * | | |
+ *   +-+---+ +-+   | C   | A   |
+ *   | A   | B | | A,B, |  |   | | |
+ *   +-+---+   -->   | C,D  |  |  -->  | | |
+ *   | C   | D | +-+   +-+-+
+ *   +-+---+   | D   | B   |
+ * | | |
+ * +-+-+
+ *
+ * If the 8x8 block rotator is used, horizontal or vertical flipping
+ * is done during the rotation step, otherwise flipping is done
+ * during the scaling step.
+ * With rotation or flipping, tile order changes between input and
+ * output image. Tiles are numbered row major from top left to bottom
+ * right for both input and output image.
  */
 
 #define MAX_STRIPES_W4
-- 
2.17.1



[PATCH 13/16] gpu: ipu-v3: image-convert: fix bytesperline adjustment

2018-06-22 Thread Philipp Zabel
For planar formats, bytesperline does not depend on BPP. It must always
be larger than width and aligned to tile width alignment restrictions.

Signed-off-by: Philipp Zabel 
---
 drivers/gpu/ipu-v3/ipu-image-convert.c | 17 +
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
index 3eb74d41733f..43eaa512e8c2 100644
--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
+++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
@@ -1858,10 +1858,19 @@ void ipu_image_convert_adjust(struct ipu_image *in, 
struct ipu_image *out,
out->pix.height = clamp_align(out->pix.height, MIN_H, MAX_H, h_align);
 
/* set input/output strides and image sizes */
-   in->pix.bytesperline = (in->pix.width * infmt->bpp) >> 3;
-   in->pix.sizeimage = in->pix.height * in->pix.bytesperline;
-   out->pix.bytesperline = (out->pix.width * outfmt->bpp) >> 3;
-   out->pix.sizeimage = out->pix.height * out->pix.bytesperline;
+   in->pix.bytesperline = infmt->planar ?
+   clamp_align(in->pix.width,
+   in->pix.bytesperline, MAX_W, w_align) :
+   clamp_align((in->pix.width * infmt->bpp) >> 3,
+   in->pix.bytesperline, MAX_W, w_align);
+   in->pix.sizeimage = infmt->planar ?
+   (in->pix.height * in->pix.bytesperline * infmt->bpp) >> 3 :
+   in->pix.height * in->pix.bytesperline;
+   out->pix.bytesperline = outfmt->planar ? out->pix.width :
+   (out->pix.width * outfmt->bpp) >> 3;
+   out->pix.sizeimage = outfmt->planar ?
+   (out->pix.height * out->pix.bytesperline * outfmt->bpp) >> 3 :
+   out->pix.height * out->pix.bytesperline;
 }
 EXPORT_SYMBOL_GPL(ipu_image_convert_adjust);
 
-- 
2.17.1



Re: kernel patch 2018-05-28 media: gspca_zc3xx: Implement proper autogain and exposure control for OV7648

2018-06-22 Thread Hans Verkuil
On 22/06/18 01:49, safocl wrote:
> This patch makes it impossible to configure the exposure on webcams, 
> specifically a4tech, with others was not checked. Seen from several users.
> link to the Russian forum archlinux: 
> https://archlinux.org.ru/forum/topic/18581/?page=1
> 
> was checked on webcam a4tech pk-910h idVendor = 0ac8, idProduct = 3500, 
> bcdDevice = 10.07
> 
> with the kernel before this commit, exposure adjustment is possible.
> 
> commit link: 
> https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=6f92c3a22ccd66604b8b528221a9d8e1b3fb4e39
> 

Added linux-media mailinglist.

Regards,

Hans


RE: [v1, 2/2] dt-bindings: at24: Add address-width property

2018-06-22 Thread Yeh, Andy
Hi Alan,

Thanks for the patch set.
You should change the subject as below.
[PATCH v1, 1/2]
[PATCH v1, 2/2]

And I think you may missed to create a cover page. Please follow my BKM. Thanks.
git format-patch --cover --subject-prefix  -o  HEAD~n


Regards, Andy

> -Original Message-
> From: Chiang, AlanX
> Sent: Friday, June 22, 2018 5:47 PM
> To: linux-media@vger.kernel.org
> Cc: Yeh, Andy ; sakari.ai...@linux.intel.com;
> Shevchenko, Andriy ; Mani, Rajmohan
> ; Chiang, AlanX 
> Subject: [v1, 2/2] dt-bindings: at24: Add address-width property
> 
> From: "alanx.chiang" 
> 
> The AT24 series chips use 8-bit address by default. If some chips would like 
> to
> support more than 8 bits, the at24 driver should be added the compatible
> field for specfic chips.
> 
> Provide a flexible way to determine the addressing bits through address-width
> in this patch.
> 
> Signed-off-by: Alan Chiang 
> Signed-off-by: Andy Yeh 
> Reviewed-by: Sakari Ailus 
> Reviewed-by: Andy Shevchenko 
> Reviewed-by: Rajmohan Mani 
> ---
>  Documentation/devicetree/bindings/eeprom/at24.txt | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/eeprom/at24.txt
> b/Documentation/devicetree/bindings/eeprom/at24.txt
> index 61d833a..5879259 100644
> --- a/Documentation/devicetree/bindings/eeprom/at24.txt
> +++ b/Documentation/devicetree/bindings/eeprom/at24.txt
> @@ -72,6 +72,8 @@ Optional properties:
> 
>- wp-gpios: GPIO to which the write-protect pin of the chip is connected.
> 
> +  - address-width : number of address bits (one of 8, 16).
> +
>  Example:
> 
>  eeprom@52 {
> @@ -79,4 +81,5 @@ eeprom@52 {
>   reg = <0x52>;
>   pagesize = <32>;
>   wp-gpios = <&gpio1 3 0>;
> + address-width = <16>;
>  };
> --
> 2.7.4



Re: [PATCH v8 0/3] uvcvideo: asynchronous controls

2018-06-22 Thread Guennadi Liakhovetski
Hi Laurent,

6.5 weeks and counting. Can we please schedule a review of these patches 
for the next week? Not much time is left to make it for 4.19.

Thanks
Guennadi

On Thu, 31 May 2018, Guennadi Liakhovetski wrote:

> Hi Laurent,
> 
> More than 3 weeks since v8 has been posted. Seems like we've missed 4.18. 
> Could you please review them ASAP to make sure we merge them into 4.19?
> 
> Thanks
> Guennadi
> 
> On Tue, 8 May 2018, Guennadi Liakhovetski wrote:
> 
> > Added a patch to remove a redundant check, addressed Laurent's
> > comments.
> > 
> > Guennadi Liakhovetski (3):
> >   uvcvideo: remove a redundant check
> >   uvcvideo: send a control event when a Control Change interrupt arrives
> >   uvcvideo: handle control pipe protocol STALLs
> > 
> >  drivers/media/usb/uvc/uvc_ctrl.c   | 168 
> > ++---
> >  drivers/media/usb/uvc/uvc_status.c | 112 ++---
> >  drivers/media/usb/uvc/uvc_v4l2.c   |   4 +-
> >  drivers/media/usb/uvc/uvc_video.c  |  52 ++--
> >  drivers/media/usb/uvc/uvcvideo.h   |  15 +++-
> >  include/uapi/linux/uvcvideo.h  |   2 +
> >  6 files changed, 302 insertions(+), 51 deletions(-)
> > 
> > -- 
> > 1.9.3
> > 
> > Thanks
> > Guennadi
> > 
> 


[PATCH] media: sr030pc30: inconsistent NULL checking in sr030pc30_base_config()

2018-06-22 Thread Dan Carpenter
If info->pdata is NULL then we would oops on the next line.  And we can
flip the "ret" test around and give up if a failure has already occured.

Signed-off-by: Dan Carpenter 

diff --git a/drivers/media/i2c/sr030pc30.c b/drivers/media/i2c/sr030pc30.c
index 2a4882cddc51..4ebd00198d34 100644
--- a/drivers/media/i2c/sr030pc30.c
+++ b/drivers/media/i2c/sr030pc30.c
@@ -569,8 +569,8 @@ static int sr030pc30_base_config(struct v4l2_subdev *sd)
if (!ret)
ret = sr030pc30_pwr_ctrl(sd, false, false);
 
-   if (!ret && !info->pdata)
-   return ret;
+   if (ret || !info->pdata)
+   return -EIO;
 
expmin = EXPOS_MIN_MS * info->pdata->clk_rate / (8 * 1000);
expmax = EXPOS_MAX_MS * info->pdata->clk_rate / (8 * 1000);


[v1, 1/2] eeprom: at24: Add support for address-width property

2018-06-22 Thread alanx . chiang
From: "alanx.chiang" 

Provide a flexible way to determine the addressing bits of eeprom.
It doesn't need to add acpi or i2c ids for specific modules.

Signed-off-by: Alan Chiang 
Signed-off-by: Andy Yeh 
Reviewed-by: Sakari Ailus 
Reviewed-by: Andy Shevchenko 
Reviewed-by: Rajmohan Mani 
---
 drivers/misc/eeprom/at24.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 0c125f2..a6fbdae 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -478,6 +478,22 @@ static void at24_properties_to_pdata(struct device *dev,
if (device_property_present(dev, "no-read-rollover"))
chip->flags |= AT24_FLAG_NO_RDROL;
 
+   err = device_property_read_u32(dev, "address-width", &val);
+   if (!err) {
+   switch (val) {
+   case 8:
+   chip->flags &= ~AT24_FLAG_ADDR16;
+   break;
+   case 16:
+   chip->flags |= AT24_FLAG_ADDR16;
+   break;
+   default:
+   dev_warn(dev,
+   "Bad \"address-width\" property: %u\n",
+   val);
+   }
+   }
+
err = device_property_read_u32(dev, "size", &val);
if (!err)
chip->byte_len = val;
-- 
2.7.4



[v1, 2/2] dt-bindings: at24: Add address-width property

2018-06-22 Thread alanx . chiang
From: "alanx.chiang" 

The AT24 series chips use 8-bit address by default. If some
chips would like to support more than 8 bits, the at24 driver
should be added the compatible field for specfic chips.

Provide a flexible way to determine the addressing bits through
address-width in this patch.

Signed-off-by: Alan Chiang 
Signed-off-by: Andy Yeh 
Reviewed-by: Sakari Ailus 
Reviewed-by: Andy Shevchenko 
Reviewed-by: Rajmohan Mani 
---
 Documentation/devicetree/bindings/eeprom/at24.txt | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/eeprom/at24.txt 
b/Documentation/devicetree/bindings/eeprom/at24.txt
index 61d833a..5879259 100644
--- a/Documentation/devicetree/bindings/eeprom/at24.txt
+++ b/Documentation/devicetree/bindings/eeprom/at24.txt
@@ -72,6 +72,8 @@ Optional properties:
 
   - wp-gpios: GPIO to which the write-protect pin of the chip is connected.
 
+  - address-width : number of address bits (one of 8, 16).
+
 Example:
 
 eeprom@52 {
@@ -79,4 +81,5 @@ eeprom@52 {
reg = <0x52>;
pagesize = <32>;
wp-gpios = <&gpio1 3 0>;
+   address-width = <16>;
 };
-- 
2.7.4



V4L2_CID_USER_MAX217X_BASE == V4L2_CID_USER_IMX_BASE

2018-06-22 Thread Helmut Grohne
Hi,

I found it strange that the macros V4L2_CID_USER_MAX217X_BASE and
V4L2_CID_USER_IMX_BASE have equal value even though each of them state
that they reserved a range. Those reservations look conflicting to me.

The macro V4L2_CID_USER_MAX217X_BASE came first, and
V4L2_CID_USER_IMX_BASE was introduced in e130291212df ("media: Add i.MX
media core driver") with the conflicting assignment (not a merge error).
The authors of that patch mostly make up the recipient list.

Is such a conflict fixable at all given that it resides in a uapi
header?

Helmut