[RFCv2 PATCH 10/14] vb2: add 'new_cookies' flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Hans Verkuil <hans.verkuil@xxxxxxxxx>

This flag helps drivers that need to reprogram their DMA engine whenever
a plane cookie (== DMA address or DMA scatter-gather list) changes.

Otherwise they would have to reprogram the DMA engine for every frame.

Note that it is not possible to do this in buf_init() since dma_map_sg has
to be done first, which happens just before buf_prepare() in the prepare()
memop. It is dma_map_sg that sets up the dma addresses that are needed to
configure the DMA engine.

Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>
---
 drivers/media/v4l2-core/videobuf2-core.c |  5 +++++
 include/media/videobuf2-core.h           | 14 ++++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index 01bab25..7217eb1 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -391,6 +391,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory,
 				kfree(vb);
 				break;
 			}
+			vb->new_cookies = 1;
 		}
 
 		q->bufs[q->num_buffers + buffer] = vb;
@@ -1373,6 +1374,8 @@ static int __buf_memory_prepare(struct vb2_buffer *vb)
 		for (plane = 0; plane < vb->num_planes; ++plane)
 			call_void_memop(vb, finish, vb->planes[plane].mem_priv);
 		call_void_vb_qop(vb, buf_finish_for_cpu, vb);
+	} else {
+		vb->new_cookies = 0;
 	}
 	return ret;
 }
@@ -1467,6 +1470,7 @@ static int __qbuf_userptr(struct vb2_buffer *vb, const struct v4l2_buffer *b)
 			dprintk(1, "buffer initialization failed\n");
 			goto err;
 		}
+		vb->new_cookies = 1;
 	}
 
 	ret = __buf_memory_prepare(vb);
@@ -1591,6 +1595,7 @@ static int __qbuf_dmabuf(struct vb2_buffer *vb, const struct v4l2_buffer *b)
 			dprintk(1, "buffer initialization failed\n");
 			goto err;
 		}
+		vb->new_cookies = 1;
 	}
 
 	ret = __buf_memory_prepare(vb);
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index bf8bde2..9304718 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -186,6 +186,11 @@ struct vb2_queue;
  * @vb2_queue:		the queue to which this driver belongs
  * @num_planes:		number of planes in the buffer
  *			on an internal driver queue
+ * @new_cookies:	the planes of the buffer have new cookie values.
+ *			This happens if a new userptr or dmabuf is used for one
+ *			or more of the buffer planes. This will change the cookie
+ *			value of those planes and you may need to reprogram the DMA
+ *			engine when buf_prepare is called.
  * @state:		current buffer state; do not change
  * @queued_entry:	entry on the queued buffers list, which holds all
  *			buffers queued from userspace
@@ -200,6 +205,7 @@ struct vb2_buffer {
 	struct vb2_queue	*vb2_queue;
 
 	unsigned int		num_planes;
+	unsigned int		new_cookies:1;
 
 /* Private: internal use only */
 	enum vb2_buffer_state	state;
@@ -290,8 +296,12 @@ struct vb2_buffer {
  *			hardware operation in this callback; drivers that
  *			support	VIDIOC_CREATE_BUFS must also validate the
  *			buffer size, if they haven't done that yet in
- *			@buf_prepare_for_cpu. If an error is returned, the
- *			buffer will not be queued in the driver; optional.
+ *			@buf_prepare_for_cpu. If one or more of the plane
+ *			cookies (see vb2_plane_cookie) are updated, then
+ *			vb->new_cookies is set to 1. If buf_prepare returns
+ *			0 (success), then new_cookies is cleared automatically.
+ *			If an error is returned, then the buffer will not be
+ *			queued in the driver; optional.
  * @buf_finish:		called before every dequeue of the buffer back to
  *			userspace; the contents of the buffer cannot be
  *			accessed by the cpu at this stage as it is still setup
-- 
2.1.0

--
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




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux