Re: [PATCH] media: et8ek8: select V4L2_FWNODE
On Mon 2017-11-13 14:56:45, Arnd Bergmann wrote: > v4l2_async_register_subdev_sensor_common() is only provided when > CONFIG_V4L2_FWNODE is enabled, otherwise we get a link failure: > > drivers/media/i2c/et8ek8/et8ek8_driver.o: In function `et8ek8_probe': > et8ek8_driver.c:(.text+0x884): undefined reference to > `v4l2_async_register_subdev_sensor_common' > > This adds a Kconfig 'select' statement like all the other users of > this interface have. > > Fixes: d8932f38c10f ("media: et8ek8: Add support for flash and lens devices") > Signed-off-by: Arnd Bergmann Acked-by: Pavel Machek Thanks! Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html signature.asc Description: Digital signature
[PATCH] dvb_local_open(): strdup fname before calling dvb_fe_open_fname()
Issue spotted by valgrind: ==5290== Invalid free() / delete / delete[] / realloc() ==5290==at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5290==by 0x4E54401: free_dvb_dev (dvb-dev.c:49) ==5290==by 0x4E5449A: dvb_dev_free_devices (dvb-dev.c:94) ==5290==by 0x4E547BA: dvb_dev_free (dvb-dev.c:121) ==5290==by 0x10881A: main (leak.c:26) ==5290== Address 0x5e55910 is 0 bytes inside a block of size 28 free'd ==5290==at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5290==by 0x4E56504: dvb_v5_free (dvb-fe.c:85) ==5290==by 0x4E547B2: dvb_dev_free (dvb-dev.c:119) ==5290==by 0x10881A: main (leak.c:26) ==5290== Block was alloc'd at ==5290==at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5290==by 0x5119C39: strdup (strdup.c:42) ==5290==by 0x4E55B42: handle_device_change (dvb-dev-local.c:137) ==5290==by 0x4E561DA: dvb_local_find (dvb-dev-local.c:323) ==5290==by 0x10880E: main (leak.c:10) Signed-off-by: Rafaël Carré --- lib/libdvbv5/dvb-dev-local.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libdvbv5/dvb-dev-local.c b/lib/libdvbv5/dvb-dev-local.c index 920e81fb..b50b61b4 100644 --- a/lib/libdvbv5/dvb-dev-local.c +++ b/lib/libdvbv5/dvb-dev-local.c @@ -440,7 +440,7 @@ static struct dvb_open_descriptor */ flags &= ~O_NONBLOCK; - ret = dvb_fe_open_fname(parms, dev->path, flags); + ret = dvb_fe_open_fname(parms, strdup(dev->path), flags); if (ret) { free(open_dev); return NULL; -- 2.14.1
Re: [PATCH 2/3] atomisp: fix vfree of bogus data on unload
On Tue, Nov 14, 2017 at 12:16:01AM +, Alan Cox wrote: > On Tue, 14 Nov 2017 00:05:48 +0200 > Sakari Ailus wrote: > > > Hi Alan, > > > > On Mon, Nov 06, 2017 at 11:36:45PM +, Alan wrote: > > > We load the firmware once, set pointers to it and then at some point > > > release > > > it. We should not be doing a vfree() on the pointers into the firmware. > > > > > > Signed-off-by: Alan Cox > > > --- > > > .../atomisp/pci/atomisp2/css2400/sh_css_firmware.c |2 -- > > > 1 file changed, 2 deletions(-) > > > > > > diff --git > > > a/drivers/staging/media/atomisp/pci/atomisp2/css2400/sh_css_firmware.c > > > b/drivers/staging/media/atomisp/pci/atomisp2/css2400/sh_css_firmware.c > > > index 8158ea40d069..f181bd8fcee2 100644 > > > --- a/drivers/staging/media/atomisp/pci/atomisp2/css2400/sh_css_firmware.c > > > +++ b/drivers/staging/media/atomisp/pci/atomisp2/css2400/sh_css_firmware.c > > > @@ -288,8 +288,6 @@ void sh_css_unload_firmware(void) > > > for (i = 0; i < sh_css_num_binaries; i++) { > > > if (fw_minibuffer[i].name) > > > kfree((void *)fw_minibuffer[i].name); > > > - if (fw_minibuffer[i].buffer) > > > - vfree((void *)fw_minibuffer[i].buffer); > > > > You shouldn't end up here if the firmware is just loaded once. If multiple > > times, then yes. > > You end up there when unloading the module. Ah, that's for sure indeed. I thought loading would be already a challenge. :-) > > > The memory appears to have been allocated using kmalloc() in some cases. > > How about kvfree(), or changing that kmalloc() to vmalloc() > > I'll take a deeper look at what is going on. Look for minibuffer in sh_css_load_blob_info(). The buffer field of the struct is allocated using kmalloc, I wonder if changing that to vmalloc would just address this. The buffer is elsewhere allocated using vmalloc. I suspect that some of the cleanup patches changed how this works but missed changing the other one. -- Regards, Sakari Ailus sakari.ai...@linux.intel.com
[PATCH] dtv-scan-tables: Intelsat34-55.5W: update definitions from Vivo streaming
There were some frequency changes on this Satellite. Update them. Signed-off-by: Mauro Carvalho Chehab --- dvb-s/Intelsat34-55.5W | 120 - 1 file changed, 29 insertions(+), 91 deletions(-) diff --git a/dvb-s/Intelsat34-55.5W b/dvb-s/Intelsat34-55.5W index 3b96fc894c99..617b1c75b2cd 100644 --- a/dvb-s/Intelsat34-55.5W +++ b/dvb-s/Intelsat34-55.5W @@ -1,148 +1,86 @@ # Intelsat 34 @ 55.5W Ku-BAND -# TV channels - -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 11825000 - POLARIZATION = HORIZONTAL - SYMBOL_RATE = 4500 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO - STREAM_ID = 0 - INVERSION = AUTO - -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 11825000 - POLARIZATION = VERTICAL - SYMBOL_RATE = 4500 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO - STREAM_ID = 0 - INVERSION = AUTO - [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1189 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO - STREAM_ID = 0 - INVERSION = AUTO - -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 11905000 - POLARIZATION = VERTICAL - SYMBOL_RATE = 4500 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1193 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1197 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1201 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1205 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1209 POLARIZATION = HORIZONTAL - SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + SYMBOL_RATE = 30001465 + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF [CHANNEL] DELIVERY_SYSTEM = DVBS2 FREQUENCY = 1213 POLARIZATION = HORIZONTAL SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO + INNER_FEC = 2/3 + ROLLOFF = 20 + MODULATION = PSK/8 STREAM_ID = 0 INVERSION = AUTO + PILOT = OFF -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 1217 - POLARIZATION = HORIZONTAL - SYMBOL_RATE = 3000 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO - STREAM_ID = 0 - INVERSION = AUTO - -# IP data channels - -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 1202 - POLARIZATION = VERTICAL - SYMBOL_RATE = 270 - INNER_FEC = AUTO - ROLLOFF = AUTO - MODULATION = QAM/AUTO - STREAM_ID = 0 - INVERSION = AUTO - -[CHANNEL] - DELIVERY_SYSTEM = DVBS2 - FREQUENCY = 1203 - POLARIZATION = VERTICAL - SYMBOL_RATE = 1282 - INNER_FEC = AUTO - INVERSION = AUTO - MODULATION = QAM/AUTO - ROLLOFF = AUTO - STREAM_ID = 0 -- 2.14.3
[PATCH v2 3/4] [media] v4l2: disable filesystem-dax mapping support
V4L2 memory registrations are incompatible with filesystem-dax that needs the ability to revoke dma access to a mapping at will, or otherwise allow the kernel to wait for completion of DMA. The filesystem-dax implementation breaks the traditional solution of truncate of active file backed mappings since there is no page-cache page we can orphan to sustain ongoing DMA. If v4l2 wants to support long lived DMA mappings it needs to arrange to hold a file lease or use some other mechanism so that the kernel can coordinate revoking DMA access when the filesystem needs to truncate mappings. Reported-by: Jan Kara Cc: Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org Cc: Fixes: 3565fce3a659 ("mm, x86: get_user_pages() for dax mappings") Signed-off-by: Dan Williams --- drivers/media/v4l2-core/videobuf-dma-sg.c |5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/media/v4l2-core/videobuf-dma-sg.c b/drivers/media/v4l2-core/videobuf-dma-sg.c index 0b5c43f7e020..f412429cf5ba 100644 --- a/drivers/media/v4l2-core/videobuf-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf-dma-sg.c @@ -185,12 +185,13 @@ static int videobuf_dma_init_user_locked(struct videobuf_dmabuf *dma, dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n", data, size, dma->nr_pages); - err = get_user_pages(data & PAGE_MASK, dma->nr_pages, + err = get_user_pages_longterm(data & PAGE_MASK, dma->nr_pages, flags, dma->pages, NULL); if (err != dma->nr_pages) { dma->nr_pages = (err >= 0) ? err : 0; - dprintk(1, "get_user_pages: err=%d [%d]\n", err, dma->nr_pages); + dprintk(1, "get_user_pages_longterm: err=%d [%d]\n", err, + dma->nr_pages); return err < 0 ? err : -EINVAL; } return 0;
[PATCH v2 0/4] introduce get_user_pages_longterm()
Changes since v1 [1]: * Cleanup local 'vmas' argument (Christoph) * Replace inline IS_ENABLED(CONFIG_FS_DAX) in C code with ifdef versions of get_user_pages_longterm() for the FS_DAX on/off cases (Christoph) * Add a new patch for the get_vaddr_frames() case, this impacts users like V4L2, and the Exynos driver. * Collect Christoph's reviewed-by for the rdma change [1]: https://lwn.net/Articles/738323/ --- Andrew, Here is a new get_user_pages api for cases where a driver intends to keep an elevated page count indefinitely. This is distinct from usages like iov_iter_get_pages where the elevated page counts are transient. The iov_iter_get_pages cases immediately turn around and submit the pages to a device driver which will put_page when the i/o operation completes (under kernel control). In the longterm case userspace is responsible for dropping the page reference at some undefined point in the future. This is untenable for filesystem-dax case where the filesystem is in control of the lifetime of the block / page and needs reasonable limits on how long it can wait for pages in a mapping to become idle. Fixing filesystems to actually wait for dax pages to be idle before blocks from a truncate/hole-punch operation are repurposed is saved for a later patch series. Also, allowing longterm registration of dax mappings is a future patch series that introduces a "map with lease" semantic where the kernel can revoke a lease and force userspace to drop its page references. I have also tagged these for -stable to purposely break cases that might assume that longterm memory registrations for filesystem-dax mappings were supported by the kernel. The behavior regression this policy change implies is one of the reasons we maintain the "dax enabled. Warning: EXPERIMENTAL, use at your own risk" notification when mounting a filesystem in dax mode. It is worth noting the device-dax interface does not suffer the same constraints since it does not support file space management operations like hole-punch. --- Dan Williams (4): mm: introduce get_user_pages_longterm mm: fail get_vaddr_frames() for filesystem-dax mappings [media] v4l2: disable filesystem-dax mapping support IB/core: disable memory registration of fileystem-dax vmas drivers/infiniband/core/umem.c|2 - drivers/media/v4l2-core/videobuf-dma-sg.c |5 +- include/linux/fs.h| 14 ++ include/linux/mm.h| 13 ++ mm/frame_vector.c |4 ++ mm/gup.c | 64 + 6 files changed, 99 insertions(+), 3 deletions(-)
[PATCH v2 2/4] mm: fail get_vaddr_frames() for filesystem-dax mappings
Until there is a solution to the dma-to-dax vs truncate problem it is not safe to allow V4L2, Exynos, and other frame vector users to create long standing / irrevocable memory registrations against filesytem-dax vmas. Cc: Inki Dae Cc: Seung-Woo Kim Cc: Joonyoung Shim Cc: Kyungmin Park Cc: Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org Cc: Jan Kara Cc: Mel Gorman Cc: Vlastimil Babka Cc: Andrew Morton Cc: Fixes: 3565fce3a659 ("mm, x86: get_user_pages() for dax mappings") Signed-off-by: Dan Williams --- mm/frame_vector.c |4 1 file changed, 4 insertions(+) diff --git a/mm/frame_vector.c b/mm/frame_vector.c index 72ebec18629c..d2fdbeaadc8b 100644 --- a/mm/frame_vector.c +++ b/mm/frame_vector.c @@ -52,6 +52,10 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames, ret = -EFAULT; goto out; } + + if (vma_is_fsdax(vma)) + return -EOPNOTSUPP; + if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) { vec->got_ref = true; vec->is_pfns = false;
cron job: media_tree daily build: ERRORS
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: Wed Nov 15 05:00:25 CET 2017 media-tree git hash:f2ecc3d0787e05d9145722feed01d4a11ab6bec1 media_build git hash: 097aaf3e4e4bfdeff130db9697dec1befeb3221b v4l-utils git hash: 462792610598eb5402cb59692b172f43c555ad23 gcc version:i686-linux-gcc (GCC) 7.1.0 sparse version: 0.5.1 (Debian: 0.5.1-2) smatch version: v0.5.0-3553-g78b2ea6 host hardware: x86_64 host os:4.13.0-164 linux-git-arm-at91: OK linux-git-arm-davinci: OK linux-git-arm-multi: OK linux-git-arm-pxa: ERRORS linux-git-arm-stm32: ERRORS linux-git-blackfin-bf561: OK linux-git-i686: OK linux-git-m32r: OK linux-git-mips: ERRORS linux-git-powerpc64: OK linux-git-sh: OK linux-git-x86_64: OK linux-2.6.36.4-i686: WARNINGS linux-2.6.37.6-i686: WARNINGS linux-2.6.38.8-i686: WARNINGS linux-2.6.39.4-i686: WARNINGS linux-3.0.60-i686: WARNINGS linux-3.1.10-i686: WARNINGS linux-3.2.37-i686: WARNINGS linux-3.3.8-i686: WARNINGS linux-3.4.27-i686: WARNINGS linux-3.5.7-i686: WARNINGS linux-3.6.11-i686: WARNINGS linux-3.7.4-i686: WARNINGS linux-3.8-i686: WARNINGS linux-3.9.2-i686: WARNINGS linux-3.10.1-i686: WARNINGS linux-3.11.1-i686: WARNINGS linux-3.12.67-i686: WARNINGS linux-3.13.11-i686: WARNINGS linux-3.14.9-i686: WARNINGS linux-3.15.2-i686: WARNINGS linux-3.16.7-i686: WARNINGS linux-3.17.8-i686: WARNINGS linux-3.18.7-i686: WARNINGS linux-3.19-i686: WARNINGS linux-4.0.9-i686: WARNINGS linux-4.1.33-i686: WARNINGS linux-4.2.8-i686: WARNINGS linux-4.3.6-i686: WARNINGS linux-4.4.22-i686: WARNINGS linux-4.5.7-i686: WARNINGS linux-4.6.7-i686: WARNINGS linux-4.7.5-i686: WARNINGS linux-4.8-i686: OK linux-4.9.26-i686: OK linux-4.10.14-i686: OK linux-4.11-i686: OK linux-4.12.1-i686: OK linux-4.13-i686: OK linux-4.14-i686: OK linux-2.6.36.4-x86_64: WARNINGS linux-2.6.37.6-x86_64: WARNINGS linux-2.6.38.8-x86_64: WARNINGS linux-2.6.39.4-x86_64: WARNINGS linux-3.0.60-x86_64: WARNINGS linux-3.1.10-x86_64: WARNINGS linux-3.2.37-x86_64: WARNINGS linux-3.3.8-x86_64: WARNINGS linux-3.4.27-x86_64: WARNINGS linux-3.5.7-x86_64: WARNINGS linux-3.6.11-x86_64: WARNINGS linux-3.7.4-x86_64: WARNINGS linux-3.8-x86_64: WARNINGS linux-3.9.2-x86_64: WARNINGS linux-3.10.1-x86_64: WARNINGS linux-3.11.1-x86_64: WARNINGS linux-3.12.67-x86_64: WARNINGS linux-3.13.11-x86_64: WARNINGS linux-3.14.9-x86_64: WARNINGS linux-3.15.2-x86_64: WARNINGS linux-3.16.7-x86_64: WARNINGS linux-3.17.8-x86_64: WARNINGS linux-3.18.7-x86_64: WARNINGS linux-3.19-x86_64: WARNINGS linux-4.0.9-x86_64: WARNINGS linux-4.1.33-x86_64: WARNINGS linux-4.2.8-x86_64: WARNINGS linux-4.3.6-x86_64: WARNINGS linux-4.4.22-x86_64: WARNINGS linux-4.5.7-x86_64: WARNINGS linux-4.6.7-x86_64: WARNINGS linux-4.7.5-x86_64: WARNINGS linux-4.8-x86_64: WARNINGS linux-4.9.26-x86_64: WARNINGS linux-4.10.14-x86_64: WARNINGS linux-4.11-x86_64: WARNINGS linux-4.12.1-x86_64: WARNINGS linux-4.13-x86_64: OK linux-4.14-x86_64: OK apps: OK spec-git: OK sparse: WARNINGS Detailed results are available here: http://www.xs4all.nl/~hverkuil/logs/Wednesday.log Full logs are available here: http://www.xs4all.nl/~hverkuil/logs/Wednesday.tar.bz2 The Media Infrastructure API from this daily build is here: http://www.xs4all.nl/~hverkuil/spec/index.html
[RFC PATCH 1/5] media: videodev2.h, v4l2-ioctl: add rkisp1 meta buffer format
From: Shunqian Zheng Add the Rockchip ISP1 specific processing parameter format V4L2_META_FMT_RK_ISP1_PARAMS and metadata format V4L2_META_FMT_RK_ISP1_STAT_3A for 3A. Signed-off-by: Shunqian Zheng Signed-off-by: Jacob Chen --- drivers/media/v4l2-core/v4l2-ioctl.c | 2 ++ include/uapi/linux/videodev2.h | 4 2 files changed, 6 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index d6587b3ec33e..0604ae9ea444 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1252,6 +1252,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_TCH_FMT_TU08: descr = "8-bit unsigned touch data"; break; case V4L2_META_FMT_VSP1_HGO:descr = "R-Car VSP1 1-D Histogram"; break; case V4L2_META_FMT_VSP1_HGT:descr = "R-Car VSP1 2-D Histogram"; break; + case V4L2_META_FMT_RK_ISP1_PARAMS: descr = "Rockchip ISP1 3A params"; break; + case V4L2_META_FMT_RK_ISP1_STAT_3A: descr = "Rockchip ISP1 3A statistics"; break; default: /* Compressed formats */ diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index e507b29ba1e0..14efa6513126 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -690,6 +690,10 @@ struct v4l2_pix_format { #define V4L2_META_FMT_VSP1_HGOv4l2_fourcc('V', 'S', 'P', 'H') /* R-Car VSP1 1-D Histogram */ #define V4L2_META_FMT_VSP1_HGTv4l2_fourcc('V', 'S', 'P', 'T') /* R-Car VSP1 2-D Histogram */ +/* Vendor specific - used for IPU3 camera sub-system */ +#define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 params */ +#define V4L2_META_FMT_RK_ISP1_STAT_3A v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A statistics */ + /* priv field value to indicates that subsequent fields are valid. */ #define V4L2_PIX_FMT_PRIV_MAGIC0xfeedcafe -- 2.14.2
[RFC PATCH 0/5] Rockchip ISP1 Driver
This patch series add a ISP(Camera) v4l2 driver for rockchip rk3288/rk3399 SoC. TODO: - Thomas is rewriting the binding code between isp, phy, sensors, i hope we could get suggestions. https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/768633/2 rules: - There are many mipi interfaces("rx0", "dxrx0")(actually it also could be parallel interface) in SoC and isp can decide which one will be used. - Sometimes there will be more than one senor in a mipi phy, the sofrware should decide which one is used(media link). - rk3399 have two isp. - Add a dummy buffer(dma_alloc_coherent) so drvier won't hold buffer. - Finish all TODO comments(mostly about hardware) in driver. To help do a quick review, i have push source code to my Github. https://github.com/wzyy2/linux/tree/rkisp1/drivers/media/platform/rockchip/isp1 Below are some infomations about driver/hardware: Rockchip ISP1 have many Hardware Blocks(simplied): MIPI --> ISP --> DCrop(Mainpath) --> RSZ(Mainpath) --> DMA(Mainpath) DMA-Input --> --> DCrop(Selfpath) --> RSZ(Selfpath) --> DMA(Selfpath);) (Acutally the TRM(rk3288, isp) could be found online.. which contains a more detailed block diagrams ;-P) The funcitons of each hardware block: Mainpath : up to 4k resolution, support raw/yuv format Selfpath : up tp 1080p, support rotate, support rgb/yuv format RSZ: scaling DCrop: crop ISP: 3A, Color processing, Crop MIPI: MIPI Camera interface Media pipelines: Mainpath, Selfpath <-- ISP subdev <-- MIPI <-- Sensor 3A stats <--<-- 3A parms Code struct: capture.c : Mainpath, Selfpath, RSZ, DCROP : capture device. rkisp1.c : ISP : v4l2 sub-device. isp_params.c : 3A parms : output device. isp_stats.c : 3A stats : capture device. mipi_dphy_sy.c : MIPI : sperated v4l2 sub-device. Usage: ChromiumOS: use below v4l2-ctl command to capture frames. v4l2-ctl --verbose -d /dev/video4 --stream-mmap=2 --stream-to=/tmp/stream.out --stream-count=60 --stream-poll use below command to playback the video on your PC. mplayer /tmp/stream.out -loop 0 --demuxer=rawvideo --rawvideo=w=800:h=600:size=$((800*600*2)):format=yuy2 or mplayer ./stream.out -loop 0 -demuxer rawvideo -rawvideo w=800:h=600:size=$((800*600*2)):format=yuy2 Linux: use rkcamsrc gstreamer plugin(just a modified v4l2src) to preview. gst-launch-1.0 rkcamsrc device=/dev/video0 io-mode=4 disable-3A=true videoconvert ! video/x-raw,format=NV12,width=640,height=480 ! kmssink Jacob Chen (2): media: rkisp1: add rockchip isp1 driver ARM: dts: rockchip: add isp node for rk3288 Jeffy Chen (1): media: rkisp1: Add user space ABI definitions Shunqian Zheng (2): media: videodev2.h, v4l2-ioctl: add rkisp1 meta buffer format arm64: dts: rockchip: add isp0 node for rk3399 arch/arm/boot/dts/rk3288.dtsi | 24 + arch/arm64/boot/dts/rockchip/rk3399.dtsi | 26 + drivers/media/platform/Kconfig | 10 + drivers/media/platform/Makefile|1 + drivers/media/platform/rockchip/isp1/Makefile |9 + drivers/media/platform/rockchip/isp1/capture.c | 1678 drivers/media/platform/rockchip/isp1/capture.h | 46 + drivers/media/platform/rockchip/isp1/common.h | 327 drivers/media/platform/rockchip/isp1/dev.c | 728 + drivers/media/platform/rockchip/isp1/isp_params.c | 1556 ++ drivers/media/platform/rockchip/isp1/isp_params.h | 81 + drivers/media/platform/rockchip/isp1/isp_stats.c | 537 +++ drivers/media/platform/rockchip/isp1/isp_stats.h | 81 + .../media/platform/rockchip/isp1/mipi_dphy_sy.c| 619 .../media/platform/rockchip/isp1/mipi_dphy_sy.h| 42 + drivers/media/platform/rockchip/isp1/regs.c| 251 +++ drivers/media/platform/rockchip/isp1/regs.h| 1578 ++ drivers/media/platform/rockchip/isp1/rkisp1.c | 1132 + drivers/media/platform/rockchip/isp1/rkisp1.h | 130 ++ drivers/media/v4l2-core/v4l2-ioctl.c |2 + include/uapi/linux/rkisp1-config.h | 554 +++ include/uapi/linux/videodev2.h |4 + 22 files changed, 9416 insertions(+) create mode 100644 drivers/media/platform/rockchip/isp1/Makefile create mode 100644 drivers/media/platform/rockchip/isp1/capture.c create mode 100644 drivers/media/platform/rockchip/isp1/capture.h create mode 100644 drivers/media/platform/rockchip/isp1/common.h create mode 100644 drivers/media/platform/rockchip/isp1/dev.c create mode 100644 drivers/media/platform/rockchip/isp1/isp_params.c create mode 100644 drivers/media/platform/rockchip/isp1/isp_params.h create mode 100644 drivers/media/platform/rockchip/isp1/isp_stats.c create mode 100644 drivers/media/platform/rockchip/isp1/isp_stats.
[RFC PATCH 1/5] media: videodev2.h, v4l2-ioctl: add rkisp1 meta buffer format
From: Shunqian Zheng Add the Rockchip ISP1 specific processing parameter format V4L2_META_FMT_RK_ISP1_PARAMS and metadata format V4L2_META_FMT_RK_ISP1_STAT_3A for 3A. Signed-off-by: Shunqian Zheng Signed-off-by: Jacob Chen --- drivers/media/v4l2-core/v4l2-ioctl.c | 2 ++ include/uapi/linux/videodev2.h | 4 2 files changed, 6 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index d6587b3ec33e..0604ae9ea444 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1252,6 +1252,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_TCH_FMT_TU08: descr = "8-bit unsigned touch data"; break; case V4L2_META_FMT_VSP1_HGO:descr = "R-Car VSP1 1-D Histogram"; break; case V4L2_META_FMT_VSP1_HGT:descr = "R-Car VSP1 2-D Histogram"; break; + case V4L2_META_FMT_RK_ISP1_PARAMS: descr = "Rockchip ISP1 3A params"; break; + case V4L2_META_FMT_RK_ISP1_STAT_3A: descr = "Rockchip ISP1 3A statistics"; break; default: /* Compressed formats */ diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index e507b29ba1e0..14efa6513126 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -690,6 +690,10 @@ struct v4l2_pix_format { #define V4L2_META_FMT_VSP1_HGOv4l2_fourcc('V', 'S', 'P', 'H') /* R-Car VSP1 1-D Histogram */ #define V4L2_META_FMT_VSP1_HGTv4l2_fourcc('V', 'S', 'P', 'T') /* R-Car VSP1 2-D Histogram */ +/* Vendor specific - used for IPU3 camera sub-system */ +#define V4L2_META_FMT_RK_ISP1_PARAMS v4l2_fourcc('R', 'K', '1', 'P') /* Rockchip ISP1 params */ +#define V4L2_META_FMT_RK_ISP1_STAT_3A v4l2_fourcc('R', 'K', '1', 'S') /* Rockchip ISP1 3A statistics */ + /* priv field value to indicates that subsequent fields are valid. */ #define V4L2_PIX_FMT_PRIV_MAGIC0xfeedcafe -- 2.14.2
[RFC PATCH 2/5] media: rkisp1: Add user space ABI definitions
From: Jeffy Chen Add the header for userspace Signed-off-by: Jeffy Chen Signed-off-by: Jacob Chen --- include/uapi/linux/rkisp1-config.h | 554 + 1 file changed, 554 insertions(+) create mode 100644 include/uapi/linux/rkisp1-config.h diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1-config.h new file mode 100644 index ..a801fbc9ef47 --- /dev/null +++ b/include/uapi/linux/rkisp1-config.h @@ -0,0 +1,554 @@ +/* + * Rockchip isp1 driver + * + * Copyright (C) 2017 Rockchip Electronics Co., Ltd. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + *copyright notice, this list of conditions and the following + *disclaimer. + * + * - Redistributions in binary form must reproduce the above + *copyright notice, this list of conditions and the following + *disclaimer in the documentation and/or other materials + *provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef _UAPI_RKISP1_CONFIG_H +#define _UAPI_RKISP1_CONFIG_H + +#include +#include + +#define CIFISP_MODULE_DPCC (1 << 0) +#define CIFISP_MODULE_BLS (1 << 1) +#define CIFISP_MODULE_SDG (1 << 2) +#define CIFISP_MODULE_HST (1 << 3) +#define CIFISP_MODULE_LSC (1 << 4) +#define CIFISP_MODULE_AWB_GAIN (1 << 5) +#define CIFISP_MODULE_FLT (1 << 6) +#define CIFISP_MODULE_BDM (1 << 7) +#define CIFISP_MODULE_CTK (1 << 8) +#define CIFISP_MODULE_GOC (1 << 9) +#define CIFISP_MODULE_CPROC (1 << 10) +#define CIFISP_MODULE_AFC (1 << 11) +#define CIFISP_MODULE_AWB (1 << 12) +#define CIFISP_MODULE_IE(1 << 13) +#define CIFISP_MODULE_AEC (1 << 14) +#define CIFISP_MODULE_WDR (1 << 15) +#define CIFISP_MODULE_DPF (1 << 16) +#define CIFISP_MODULE_DPF_STRENGTH (1 << 17) + +#define CIFISP_CTK_COEFF_MAX0x100 +#define CIFISP_CTK_OFFSET_MAX 0x800 + +#define CIFISP_AE_MEAN_MAX 25 +#define CIFISP_HIST_BIN_N_MAX 16 +#define CIFISP_AFM_MAX_WINDOWS 3 +#define CIFISP_DEGAMMA_CURVE_SIZE 17 + +#define CIFISP_BDM_MAX_TH 0xFF + +/* maximum value for horizontal start address */ +#define CIFISP_BLS_START_H_MAX 0x0FFF +/* maximum value for horizontal stop address */ +#define CIFISP_BLS_STOP_H_MAX 0x0FFF +/* maximum value for vertical start address */ +#define CIFISP_BLS_START_V_MAX 0x0FFF +/* maximum value for vertical stop address */ +#define CIFISP_BLS_STOP_V_MAX 0x0FFF +/* maximum is 2^18 = 262144*/ +#define CIFISP_BLS_SAMPLES_MAX 0x0012 +/* maximum value for fixed black level */ +#define CIFISP_BLS_FIX_SUB_MAX 0x0FFF +/* minimum value for fixed black level */ +#define CIFISP_BLS_FIX_SUB_MIN 0xF000 +/* 13 bit range (signed)*/ +#define CIFISP_BLS_FIX_MASK0x1FFF +/* AWB */ +#define CIFISP_AWB_MAX_GRID1 +#define CIFISP_AWB_MAX_FRAMES 7 + +/* Gamma out*/ +/* Maximum number of color samples supported */ +#define CIFISP_GAMMA_OUT_MAX_SAMPLES 17 + +/* LSC */ +#define CIFISP_LSC_GRAD_TBL_SIZE 8 +#define CIFISP_LSC_SIZE_TBL_SIZE 8 +/* + * The following matches the tuning process, + * not the max capabilities of the chip. + * Last value unused. + */ +#defineCIFISP_LSC_DATA_TBL_SIZE 290 +/* HIST */ +/* Last 3 values unused. */ +#define CIFISP_HISTOGRAM_WEIGHT_GRIDS_SIZE 28 + +/* DPCC */ +#define CIFISP_DPCC_METHODS_MAX 3 + +/* DPF */ +#define CIFISP_DPF_MAX_NLF_COEFFS 17 +#define CIFISP_DPF_MAX_SPATIAL_COEFFS 6 + +/* measurement types */ +#define CIFISP_STAT_AWB (1 << 0) +#define CIFISP_STAT_AUTOEXP (1 << 1) +#define CIFISP_STAT_AFM_FIN (1 << 2) +#define CIFISP_STAT_HIST
[RFC PATCH 4/5] arm64: dts: rockchip: add isp0 node for rk3399
From: Shunqian Zheng rk3399 have two ISP, but we havn't test isp1, so just add isp0 at present. Signed-off-by: Shunqian Zheng Signed-off-by: Jacob Chen --- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 26 ++ 1 file changed, 26 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index ab7629c5b856..f696e62d09dd 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1577,6 +1577,32 @@ status = "disabled"; }; + isp0: isp0@ff91 { + compatible = "rockchip,rk3399-cif-isp"; + reg = <0x0 0xff91 0x0 0x4000>; + interrupts = ; + clocks = <&cru SCLK_ISP0>, +<&cru ACLK_ISP0>, <&cru ACLK_ISP0_WRAPPER>, +<&cru HCLK_ISP0>, <&cru HCLK_ISP0_WRAPPER>; + clock-names = "clk_isp", + "aclk_isp", "aclk_isp_wrap", + "hclk_isp", "hclk_isp_wrap"; + power-domains = <&power RK3399_PD_ISP0>; + iommus = <&isp0_mmu>; + status = "disabled"; + + isp_mipi_dphy_rx0: isp-mipi-dphy-rx0 { + compatible = "rockchip,rk3399-mipi-dphy"; + rockchip,grf = <&grf>; + clocks = <&cru SCLK_MIPIDPHY_REF>, +<&cru SCLK_DPHY_RX0_CFG>, +<&cru PCLK_VIO_GRF>; + clock-names = "dphy-ref", "dphy-cfg", "grf"; + power-domains = <&power RK3399_PD_VIO>; + status = "disabled"; + }; + }; + isp0_mmu: iommu@ff914000 { compatible = "rockchip,iommu"; reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>; -- 2.14.2
[RFC PATCH 5/5] ARM: dts: rockchip: add isp node for rk3288
From: Jacob Chen rk3288 have a Embedded 13M ISP and MIPI-CSI2 interface. Signed-off-by: Jacob Chen --- arch/arm/boot/dts/rk3288.dtsi | 24 1 file changed, 24 insertions(+) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 60658c5c9a48..f9a81137146d 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi @@ -962,6 +962,30 @@ status = "disabled"; }; + isp: isp@ff91 { + compatible = "rockchip,rk3288-cif-isp"; + reg = <0x0 0xff91 0x0 0x4000>; + interrupts = ; + clocks = <&cru SCLK_ISP>, <&cru ACLK_ISP>, +<&cru HCLK_ISP>, <&cru PCLK_ISP_IN>, +<&cru SCLK_ISP_JPE>; + clock-names = "clk_isp", "aclk_isp", + "hclk_isp", "pclk_isp_in", + "sclk_isp_jpe"; + assigned-clocks = <&cru SCLK_ISP>; + assigned-clock-rates = <4>; + power-domains = <&power RK3288_PD_VIO>; + iommus = <&isp_mmu>; + status = "disabled"; + isp_mipi_phy_rx0: isp-mipi-phy-rx0 { + compatible = "rockchip,rk3288-mipi-dphy"; + rockchip,grf = <&grf>; + clocks = <&cru SCLK_MIPIDSI_24M>, <&cru PCLK_MIPI_CSI>; + clock-names = "dphy-ref", "pclk"; + status = "disabled"; + }; + }; + isp_mmu: iommu@ff914000 { compatible = "rockchip,iommu"; reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>; -- 2.14.2