media: videobuf2: add cache management members
authorSergey Senozhatsky <senozhatsky@chromium.org>
Thu, 14 May 2020 16:01:41 +0000 (18:01 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 23 Jun 2020 11:24:27 +0000 (13:24 +0200)
Extend vb2_buffer and vb2_queue structs with cache management
members.

V4L2 UAPI already contains two buffer flags which user-space,
supposedly, can use to control buffer cache sync:

- V4L2_BUF_FLAG_NO_CACHE_INVALIDATE
- V4L2_BUF_FLAG_NO_CACHE_CLEAN

None of these, however, do anything at the moment. This patch
set is intended to change it.

Since user-space cache management hints are supposed to be
implemented on a per-buffer basis we need to extend vb2_buffer
struct with two new members ->need_cache_sync_on_prepare and
->need_cache_sync_on_finish, which will store corresponding
user-space hints.

In order to preserve the existing behaviour, user-space cache
managements flags will be handled only by those drivers that
permit user-space cache hints. That's the purpose of vb2_queue
->allow_cache_hints member. Driver must set ->allow_cache_hints
during queue initialisation to enable cache management hints
mechanism.

Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
include/media/videobuf2-core.h

index 9e522bd..7f39d9f 100644 (file)
@@ -263,6 +263,10 @@ struct vb2_buffer {
         *                      after the 'buf_finish' op is called.
         * copied_timestamp:    the timestamp of this capture buffer was copied
         *                      from an output buffer.
+        * need_cache_sync_on_prepare: when set buffer's ->prepare() function
+        *                      performs cache sync/invalidation.
+        * need_cache_sync_on_finish: when set buffer's ->finish() function
+        *                      performs cache sync/invalidation.
         * queued_entry:        entry on the queued buffers list, which holds
         *                      all buffers queued from userspace
         * done_entry:          entry on the list that stores all buffers ready
@@ -273,6 +277,8 @@ struct vb2_buffer {
        unsigned int            synced:1;
        unsigned int            prepared:1;
        unsigned int            copied_timestamp:1;
+       unsigned int            need_cache_sync_on_prepare:1;
+       unsigned int            need_cache_sync_on_finish:1;
 
        struct vb2_plane        planes[VB2_MAX_PLANES];
        struct list_head        queued_entry;
@@ -491,6 +497,9 @@ struct vb2_buf_ops {
  * @uses_requests: requests are used for this queue. Set to 1 the first time
  *             a request is queued. Set to 0 when the queue is canceled.
  *             If this is 1, then you cannot queue buffers directly.
+ * @allow_cache_hints: when set user-space can pass cache management hints in
+ *             order to skip cache flush/invalidation on ->prepare() or/and
+ *             ->finish().
  * @lock:      pointer to a mutex that protects the &struct vb2_queue. The
  *             driver can set this to a mutex to let the v4l2 core serialize
  *             the queuing ioctls. If the driver wants to handle locking
@@ -567,6 +576,7 @@ struct vb2_queue {
        unsigned int                    requires_requests:1;
        unsigned int                    uses_qbuf:1;
        unsigned int                    uses_requests:1;
+       unsigned int                    allow_cache_hints:1;
 
        struct mutex                    *lock;
        void                            *owner;