On Wed, Oct 20, 2010 at 4:14 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote: > On Wednesday, October 20, 2010 08:41:06 Marek Szyprowski wrote: >> Hello, >> >> As I promissed I continue the development of the VideoBuf2 at Samsung >> until Pawel finds some spare time to help us. This is a third version of >> the framework. Besides the minor bugfixes here and there I've added a >> complete read() callback emulator. This emulator provides 2 types of >> read() operation - 'streaming' and 'one shot'. It is suitable to replace >> both videobuf_read_stream() and videobuf_read_one() methods from the old >> videobuf. > > One thing I never understood: what is the point of supporting 'one shot' read > mode? Why not support just streaming? Does anyone know? > > Another question: how hard is it to support write mode as well? I think > vb2 should support both. I suspect that once we have a read emulator it isn't > difficult to make a write emulator too. One thing consideration is that with this implementation we can't meet merge window for 2.6.37. How do you think? Thank you, Kyungmin Park > > A last remark: the locking has changed recently in videobuf due to the work > done on eliminating the BKL. It's probably a good idea to incorporate those > changes as well in vb2. > > Regards, > > Hans > >> >> Taking into account the size of the patches and the number of lines I've >> changed, I've decided to keep the Pawel signed-off attribute and >> authorship to correctly credit him. If this is against kernel rules, >> feel free to let me know. >> >> Best regards >> -- >> Marek Szyprowski >> Samsung Poland R&D Center >> >> >> Changes since V2: >> ================= >> - added read() emulator (see patch #5/7) >> - fixed lack of parentheses in macro definitions (caused side effects >> in some places) >> - added a separate check for VM_READ or VM_WRITE in vb2_mmap() >> - added vb2_is_streaming(), vb2_lock and vb2_unlock inlines >> - updated vivi driver with the new read() emulator >> >> Changes since V1: >> ================= >> - removed drv_lock, added start_streaming and stop_streaming callbacks >> >> >> Here is the original Videobuf2 introduction prepared by Pawel: >> ======================================================================= >> >> These patches add a new driver framework for Video for Linux 2 driver >> - Videobuf2. >> >> Videobuf2 is intended as a replacement for videobuf, the current driver >> framework, which will be referred to as "videobuf1" for the remainder >> of this document. >> >> ================================ >> What is videobuf2? >> ================================ >> Videobuf2 is a Video for Linux 2 API-compatible driver framework for >> multimedia devices. It acts as an intermediate layer between userspace >> applications and device drivers. It also provides low-level, modular >> memory management functions for drivers. >> >> Videobuf2 eases driver development, reduces drivers' code size and aids in >> proper and consistent implementation of V4L2 API in drivers. >> >> Videobuf2 memory management backend is fully modular. This allows custom >> memory management routines for devices and platforms with non-standard >> memory management requirements to be plugged in, without changing the >> high-level buffer management functions and API. >> >> The framework provides: >> - implementations of streaming I/O V4L2 ioctls and file operations >> - high-level video buffer, video queue and state management functions >> - video buffer memory allocation and management >> >> ================================ >> Why a new framework? >> ================================ >> There have been many discussions in the V4L2 community about the feasibility >> of writing a new framework, as opposed to fixing the existing one. It has been >> agreed though that: >> - videobuf1 has major flaws and an attempt to fix it would end up in rewriting >> most of the code >> - many drivers depend on videobuf1 and since the changes would be major, >> an effort to adapt and test them all would not be realistically possible >> >> Due to the problems with videobuf most new drivers cannot use it. This leads >> to code replication and overcomplicated drivers. >> >> ================================ >> What is wrong with videobuf1? >> ================================ >> There are many problems with the current videobuf implementation. During a V4L2 >> mini-summit in Helsinki in June 2010, two presentations were delivered >> on this topic: >> - Laurent Pinchart "videobuf - the good, the bad and the ugly" >> http://linuxtv.org/downloads/presentations/summit_jun_2010/20100614-v4l2_summit-videobuf.pdf >> - Pawel Osciak "Future of the videobuf framework" >> http://linuxtv.org/downloads/presentations/summit_jun_2010/Videobuf_Helsinki_June2010.pdf >> >> These presentations highlighted many problems with videobuf. The most prominent >> include: >> >> - V4L2 API violations and wrong memory management design >> - it is impossible to pause streaming (buffers are freed on streamoff) >> - VIDIOC_REQBUFS(0) does not free memory >> - it is impossible to reallocate memory with VIDIOC_REQBUFS >> - video memory is allocated on mmap, qbuf or even on page fault, >> freed on unmap, streamoff or explicitly by drivers >> - per-buffer waitqueues >> - not extensible enough and thus not ready for new platforms and uses, >> especially considering embedded multimedia devices >> - very hard to add new memory handling routines and custom memory allocators >> - no or poor support for handling cache coherency, IOMMUs, >> - poor flexibility - only one do-it-all function for handling memory pinning, >> cache, sg-list creation, etc... >> - unused fields, code duplication, vague/inconsistent naming, obscure usage in >> some places... >> >> Many driver authors expressed their frustration with videobuf. Developers >> acknowledge its merits and would like to use it, but due mostly to its >> inflexible memory allocation schemes they are unable to do so. >> >> ================================ >> Main goals of the redesign >> ================================ >> - correct V4L2 API implementation, fixing videobuf1 problems and shortcomings >> - full separation between queue management and memory management >> - fully flexible, pluggable memory allocators and memory handling routines >> - more specialized driver callbacks, called at different points >> - support for new V4L2 API extensions, such as multi-planar video buffers >> >> ================================ >> Driver callbacks >> ================================ >> Driver callbacks have been redesigned for symmetry: >> - buf_init - called once, after memory is allocated or after a new USERPTR >> buffer is queued; can be used e.g. to pin pages, verify contiguity, set up >> IOMMU mappings, etc. >> - buf_prepare - called on each QBUF; can be used e.g. for cache sync, copying >> to bounce buffers, etc. >> - buf_finish - called on each DQBUF; can be used e.g. for cache sync, copying >> back from bounce buffers, etc. >> - buf_cleanup - called before freeing/releasing memory; can be used e.g. for >> unmapping memory, etc. >> >> The remaining driver callbacks have been slightly redesigned: >> - queue_negotiate - now incorporates multi-planar extensions; drivers return >> required number of buffers and planes per buffer >> - plane_setup - drivers return plane sizes >> Those two callbacks replace the old buf_setup. >> >> - buf_queue - basically stays the same >> >> ================================ >> Memory allocators and handling >> ================================ >> Memory handling has been designed to allow more customization than in the >> original videobuf. For this memory allocation ops have been slightly redesigned, >> and have become fully replaceable and an allocator context struct have been >> introduced. >> >> Allocator context is intended to provide memory operations to videobuf and also >> for storing allocator private data, if required, although simpler allocators >> do not have to use this feature. Private data can be added by embedding the >> context struct inside their own structures: >> >> struct vb2_alloc_ctx { >> const struct vb2_mem_ops *mem_ops; >> }; >> >> struct vb2_foo_alloc_conf { >> struct vb2_alloc_ctx alloc_ctx; >> /* Allocator private data here */ >> }; >> >> Moreover, a buffer context structure concept has been introduced. Allocators >> return their own, custom, per-buffer structures on every allocation. This >> structure is then used as a "cookie" and passed to other memory handling >> methods called for its corresponding buffer. >> >> Memory operations, stored in the allocator context, can be replaced if >> needed by drivers on a per-function basis and functions from other allocators >> or drivers can be reused as well. A full list with documentation can be found >> in the videobuf2-core.h file. >> >> It is also possible, although not required, to assign different contexts per >> plane. This may be useful for drivers that need to use different memory types >> for different planes. An example may be a driver that stores video data in the >> first plane, which has to be allocated from a device-accessible memory area, >> and metadata in the second plane, which does not have to be stored in >> a device-accessible memory. >> >> An good example of integrating a more advanced allocator, the recently discussed >> on this list CMA (contiguous memory allocator), can be found in videobuf2-cma.*. >> >> ================================ >> Other changes >> ================================ >> The changes described above are the main changes in videobuf2. Most of the core >> API has remained the same or very similar, although its implementation has been >> fully rewritten. Some more visible changes include: >> >> - Memory is now properly allocated on REQBUFS and can be freed and reallocated >> there as well. >> - It is now possible to pause and resume streaming with streamon/streamoff, >> without freeing the buffers. >> - V4L2 API-related, userspace-visible metadata, such as inputs, timestamps, etc. >> are no longer stored in videobuf buffer structure, but in an actual >> v4l2_buffer struct (idea borrowed from Laurent Pinchart). I felt that driver >> authors would prefer to use V4L2 API-based structures of videobuf custom >> structures where possible. It also eases copying v4l2_buffer-related data >> from/to userspace. >> - Buffers do not include waitqueues anymore. One, global, per-queue waitqueue >> for done buffers has been introduced instead. Per-buffer waitqueues were not >> very useful and introduced additional complications in code. >> With this, drivers have gained the ability of dequeuing buffers out-of-order >> as well. >> - Buffer states are not handled jointly by both videobuf and driver anymore, >> I felt it was not required and confusing for driver authors >> - Some fields that were less useful have been removed and naming of others >> have been changed to better reflect their function. >> - Other then reqbufs, ioctl implementations have remained almost the same >> and behave in the same way, >> >> >> Please see documentation in videobuf2-core.c and videobuf2-core.h for more >> details and the patch porting vivi to videobuf2 for how to port existing >> drivers to videobuf2. >> >> This is a preliminary version intended for review, but has already been tested >> for multiple drivers and different memory handling implementations. DMA-SG >> implementation is not included yet. >> >> The CMA allocator patches are attached for reference, to show how a more >> complicated allocator can be integrated into the framework. >> >> Any comments will be very much appreciated! >> >> Best regards, >> Pawel Osciak >> Linux Platform Group >> Samsung Poland R&D Center >> >> ======================================================================= >> >> Patch summary: >> >> Pawel Osciak (6): >> v4l: add videobuf2 Video for Linux 2 driver framework >> v4l: videobuf2: add generic memory handling routines >> v4l: videobuf2: add vmalloc allocator >> v4l: videobuf2: add DMA coherent allocator >> v4l: vivi: port to videobuf2 >> v4l: videobuf2: add CMA allocator >> >> Marek Szyprowski (1): >> v4l: videobuf2: add read() emulator >> >> drivers/media/video/Kconfig | 23 +- >> drivers/media/video/Makefile | 6 + >> drivers/media/video/videobuf2-cma.c | 250 ++++ >> drivers/media/video/videobuf2-core.c | 1726 ++++++++++++++++++++++++++ >> drivers/media/video/videobuf2-dma-coherent.c | 208 ++++ >> drivers/media/video/videobuf2-memops.c | 199 +++ >> drivers/media/video/videobuf2-vmalloc.c | 177 +++ >> drivers/media/video/vivi.c | 348 +++--- >> include/media/videobuf2-cma.h | 25 + >> include/media/videobuf2-core.h | 392 ++++++ >> include/media/videobuf2-dma-coherent.h | 21 + >> include/media/videobuf2-memops.h | 31 + >> include/media/videobuf2-vmalloc.h | 16 + >> 13 files changed, 3258 insertions(+), 164 deletions(-) >> create mode 100644 drivers/media/video/videobuf2-cma.c >> create mode 100644 drivers/media/video/videobuf2-core.c >> create mode 100644 drivers/media/video/videobuf2-dma-coherent.c >> create mode 100644 drivers/media/video/videobuf2-memops.c >> create mode 100644 drivers/media/video/videobuf2-vmalloc.c >> create mode 100644 include/media/videobuf2-cma.h >> create mode 100644 include/media/videobuf2-core.h >> create mode 100644 include/media/videobuf2-dma-coherent.h >> create mode 100644 include/media/videobuf2-memops.h >> create mode 100644 include/media/videobuf2-vmalloc.h >> >> > > -- > Hans Verkuil - video4linux developer - sponsored by TANDBERG, part of Cisco > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html