diff options
Diffstat (limited to 'include/media/videobuf2-core.h')
| -rw-r--r-- | include/media/videobuf2-core.h | 96 | 
1 files changed, 53 insertions, 43 deletions
| diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index 88e3ab496e8f..946340ce7701 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -27,7 +27,6 @@ enum vb2_memory {  	VB2_MEMORY_DMABUF	= 4,  }; -struct vb2_alloc_ctx;  struct vb2_fileio_data;  struct vb2_threadio_data; @@ -57,7 +56,7 @@ struct vb2_threadio_data;   * @put_userptr: inform the allocator that a USERPTR buffer will no longer   *		 be used.   * @attach_dmabuf: attach a shared struct dma_buf for a hardware operation; - *		   used for DMABUF memory types; alloc_ctx is the alloc context + *		   used for DMABUF memory types; dev is the alloc device   *		   dbuf is the shared dma_buf; returns NULL on failure;   *		   allocator private per-buffer structure on success;   *		   this needs to be used for further accesses to the buffer. @@ -86,20 +85,26 @@ struct vb2_threadio_data;   * @mmap:	setup a userspace mapping for a given memory buffer under   *		the provided virtual memory region.   * - * Required ops for USERPTR types: get_userptr, put_userptr. - * Required ops for MMAP types: alloc, put, num_users, mmap. - * Required ops for read/write access types: alloc, put, num_users, vaddr. - * Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf, - *				  unmap_dmabuf. + * Those operations are used by the videobuf2 core to implement the memory + * handling/memory allocators for each type of supported streaming I/O method. + * + * .. note:: + *    #) Required ops for USERPTR types: get_userptr, put_userptr. + * + *    #) Required ops for MMAP types: alloc, put, num_users, mmap. + * + *    #) Required ops for read/write access types: alloc, put, num_users, vaddr. + * + *    #) Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf, unmap_dmabuf.   */  struct vb2_mem_ops { -	void		*(*alloc)(void *alloc_ctx, unsigned long size, -				  enum dma_data_direction dma_dir, +	void		*(*alloc)(struct device *dev, const struct dma_attrs *attrs, +				  unsigned long size, enum dma_data_direction dma_dir,  				  gfp_t gfp_flags);  	void		(*put)(void *buf_priv);  	struct dma_buf *(*get_dmabuf)(void *buf_priv, unsigned long flags); -	void		*(*get_userptr)(void *alloc_ctx, unsigned long vaddr, +	void		*(*get_userptr)(struct device *dev, unsigned long vaddr,  					unsigned long size,  					enum dma_data_direction dma_dir);  	void		(*put_userptr)(void *buf_priv); @@ -107,7 +112,7 @@ struct vb2_mem_ops {  	void		(*prepare)(void *buf_priv);  	void		(*finish)(void *buf_priv); -	void		*(*attach_dmabuf)(void *alloc_ctx, struct dma_buf *dbuf, +	void		*(*attach_dmabuf)(struct device *dev, struct dma_buf *dbuf,  					  unsigned long size,  					  enum dma_data_direction dma_dir);  	void		(*detach_dmabuf)(void *buf_priv); @@ -272,26 +277,26 @@ struct vb2_buffer {  /**   * struct vb2_ops - driver-specific callbacks   * - * @queue_setup:	called from VIDIOC_REQBUFS and VIDIOC_CREATE_BUFS + * @queue_setup:	called from %VIDIOC_REQBUFS and %VIDIOC_CREATE_BUFS   *			handlers before memory allocation. It can be called   *			twice: if the original number of requested buffers   *			could not be allocated, then it will be called a   *			second time with the actually allocated number of   *			buffers to verify if that is OK.   *			The driver should return the required number of buffers - *			in *num_buffers, the required number of planes per - *			buffer in *num_planes, the size of each plane should be - *			set in the sizes[] array and optional per-plane - *			allocator specific context in the alloc_ctxs[] array. - *			When called from VIDIOC_REQBUFS, *num_planes == 0, the + *			in \*num_buffers, the required number of planes per + *			buffer in \*num_planes, the size of each plane should be + *			set in the sizes\[\] array and optional per-plane + *			allocator specific device in the alloc_devs\[\] array. + *			When called from %VIDIOC_REQBUFS, \*num_planes == 0, the   *			driver has to use the currently configured format to - *			determine the plane sizes and *num_buffers is the total + *			determine the plane sizes and \*num_buffers is the total   *			number of buffers that are being allocated. When called - *			from VIDIOC_CREATE_BUFS, *num_planes != 0 and it - *			describes the requested number of planes and sizes[] + *			from %VIDIOC_CREATE_BUFS, \*num_planes != 0 and it + *			describes the requested number of planes and sizes\[\]   *			contains the requested plane sizes. If either - *			*num_planes or the requested sizes are invalid callback - *			must return -EINVAL. In this case *num_buffers are + *			\*num_planes or the requested sizes are invalid callback + *			must return %-EINVAL. In this case \*num_buffers are   *			being allocated additionally to q->num_buffers.   * @wait_prepare:	release any locks taken while calling vb2 functions;   *			it is called before an ioctl needs to wait for a new @@ -306,11 +311,11 @@ struct vb2_buffer {   *			initialization failure (return != 0) will prevent   *			queue setup from completing successfully; optional.   * @buf_prepare:	called every time the buffer is queued from userspace - *			and from the VIDIOC_PREPARE_BUF ioctl; drivers may + *			and from the %VIDIOC_PREPARE_BUF ioctl; drivers may   *			perform any initialization required before each   *			hardware operation in this callback; drivers can   *			access/modify the buffer here as it is still synced for - *			the CPU; drivers that support VIDIOC_CREATE_BUFS must + *			the CPU; drivers that support %VIDIOC_CREATE_BUFS must   *			also validate the buffer size; if an error is returned,   *			the buffer will not be queued in driver; optional.   * @buf_finish:		called before every dequeue of the buffer back to @@ -318,23 +323,23 @@ struct vb2_buffer {   *			can access/modify the buffer contents; drivers may   *			perform any operations required before userspace   *			accesses the buffer; optional. The buffer state can be - *			one of the following: DONE and ERROR occur while - *			streaming is in progress, and the PREPARED state occurs + *			one of the following: %DONE and %ERROR occur while + *			streaming is in progress, and the %PREPARED state occurs   *			when the queue has been canceled and all pending - *			buffers are being returned to their default DEQUEUED + *			buffers are being returned to their default %DEQUEUED   *			state. Typically you only have to do something if the - *			state is VB2_BUF_STATE_DONE, since in all other cases + *			state is %VB2_BUF_STATE_DONE, since in all other cases   *			the buffer contents will be ignored anyway.   * @buf_cleanup:	called once before the buffer is freed; drivers may   *			perform any additional cleanup; optional.   * @start_streaming:	called once to enter 'streaming' state; the driver may - *			receive buffers with @buf_queue callback before - *			@start_streaming is called; the driver gets the number - *			of already queued buffers in count parameter; driver - *			can return an error if hardware fails, in that case all - *			buffers that have been already given by the @buf_queue - *			callback are to be returned by the driver by calling - *			@vb2_buffer_done(VB2_BUF_STATE_QUEUED). + *			receive buffers with @buf_queue callback + *			before @start_streaming is called; the driver gets the + *			number of already queued buffers in count parameter; + *			driver can return an error if hardware fails, in that + *			case all buffers that have been already given by + *			the @buf_queue callback are to be returned by the driver + *			by calling @vb2_buffer_done\(%VB2_BUF_STATE_QUEUED\).   *			If you need a minimum number of buffers before you can   *			start streaming, then set @min_buffers_needed in the   *			vb2_queue structure. If that is non-zero then @@ -342,21 +347,21 @@ struct vb2_buffer {   *			many buffers have been queued up by userspace.   * @stop_streaming:	called when 'streaming' state must be disabled; driver   *			should stop any DMA transactions or wait until they - *			finish and give back all buffers it got from buf_queue() - *			callback by calling @vb2_buffer_done() with either - *			VB2_BUF_STATE_DONE or VB2_BUF_STATE_ERROR; may use + *			finish and give back all buffers it got from &buf_queue + *			callback by calling @vb2_buffer_done\(\) with either + *			%VB2_BUF_STATE_DONE or %VB2_BUF_STATE_ERROR; may use   *			vb2_wait_for_all_buffers() function   * @buf_queue:		passes buffer vb to the driver; driver may start   *			hardware operation on this buffer; driver should give   *			the buffer back by calling vb2_buffer_done() function; - *			it is allways called after calling STREAMON ioctl; + *			it is allways called after calling %VIDIOC_STREAMON ioctl;   *			might be called before start_streaming callback if user - *			pre-queued buffers before calling STREAMON. + *			pre-queued buffers before calling %VIDIOC_STREAMON.   */  struct vb2_ops {  	int (*queue_setup)(struct vb2_queue *q,  			   unsigned int *num_buffers, unsigned int *num_planes, -			   unsigned int sizes[], void *alloc_ctxs[]); +			   unsigned int sizes[], struct device *alloc_devs[]);  	void (*wait_prepare)(struct vb2_queue *q);  	void (*wait_finish)(struct vb2_queue *q); @@ -401,6 +406,9 @@ struct vb2_buf_ops {   *		caller. For example, for V4L2, it should match   *		the V4L2_BUF_TYPE_* in include/uapi/linux/videodev2.h   * @io_modes:	supported io methods (see vb2_io_modes enum) + * @dev:	device to use for the default allocation context if the driver + *		doesn't fill in the @alloc_devs array. + * @dma_attrs:	DMA attributes to use for the DMA. May be NULL.   * @fileio_read_once:		report EOF after reading the first buffer   * @fileio_write_immediately:	queue buffer after each write() call   * @allow_zero_bytesused:	allow bytesused == 0 to be passed to the driver @@ -447,7 +455,7 @@ struct vb2_buf_ops {   * @done_list:	list of buffers ready to be dequeued to userspace   * @done_lock:	lock to protect done_list list   * @done_wq:	waitqueue for processes waiting for buffers ready to be dequeued - * @alloc_ctx:	memory type/allocator-specific contexts for each plane + * @alloc_devs:	memory type/allocator-specific per-plane device   * @streaming:	current streaming state   * @start_streaming_called: start_streaming() was called successfully and we   *		started streaming. @@ -467,6 +475,8 @@ struct vb2_buf_ops {  struct vb2_queue {  	unsigned int			type;  	unsigned int			io_modes; +	struct device			*dev; +	const struct dma_attrs		*dma_attrs;  	unsigned			fileio_read_once:1;  	unsigned			fileio_write_immediately:1;  	unsigned			allow_zero_bytesused:1; @@ -499,7 +509,7 @@ struct vb2_queue {  	spinlock_t			done_lock;  	wait_queue_head_t		done_wq; -	void				*alloc_ctx[VB2_MAX_PLANES]; +	struct device			*alloc_devs[VB2_MAX_PLANES];  	unsigned int			streaming:1;  	unsigned int			start_streaming_called:1; |