On (20/01/23 12:35), Hans Verkuil wrote: > On 1/22/20 6:05 AM, Sergey Senozhatsky wrote: > > On (20/01/10 11:30), Hans Verkuil wrote: [..] > But whatever was written in the buffer is going to be overwritten anyway. > > Unless I am mistaken the current situation is that the cache syncs are done > in both prepare and finish, regardless of the DMA direction. > > I would keep that behavior to avoid introducing any unexpected regressions. OK. > Then, if q->allow_cache_hint is set, then default to a cache sync (cache clean) > in the prepare for OUTPUT buffers and a cache sync (cache invalidate) in the > finish for CAPTURE buffers. We alter default cache sync behaviour based both on queue ->memory type and queue ->dma_dir. Shall both of those cases depend on ->allow_cache_hints, or q->memory can be independent? static void set_buffer_cache_hints(struct vb2_queue *q, struct vb2_buffer *vb, struct v4l2_buffer *b) { if (!q->allow_cache_hints) return; /* * DMA exporter should take care of cache syncs, so we can avoid * explicit ->prepare()/->finish() syncs. For other ->memory types * we always need ->prepare() or/and ->finish() cache sync. */ if (q->memory == VB2_MEMORY_DMABUF) { vb->need_cache_sync_on_finish = 0; vb->need_cache_sync_on_prepare = 0; return; } /* * ->finish() cache sync can be avoided when queue direction is * TO_DEVICE. */ if (q->dma_dir == DMA_TO_DEVICE) vb->need_cache_sync_on_finish = 0; else vb->need_cache_sync_on_finish = 1; /* * ->prepare() cache sync can be avoided when queue direction is * FROM_DEVICE. */ if (q->dma_dir == DMA_FROM_DEVICE) vb->need_cache_sync_on_prepare = 0; else vb->need_cache_sync_on_prepare = 1; if (b->flags & V4L2_BUF_FLAG_NO_CACHE_INVALIDATE) vb->need_cache_sync_on_finish = 0; if (b->flags & V4L2_BUF_FLAG_NO_CACHE_CLEAN) vb->need_cache_sync_on_prepare = 0; }