media: videobuf2: add begin/end cpu_access callbacks to dma-contig
Provide begin_cpu_access() and end_cpu_access() callbacks for cache synchronisation on exported buffers. The patch also adds a new helper function - vb2_dc_buffer_consistent(), which returns true is if the buffer is consistent (DMA_ATTR_NON_CONSISTENT bit cleared), so then we don't need to sync anything. 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>
This commit is contained in:
parent
093067ed12
commit
d5adf1b0c2
|
@ -42,6 +42,11 @@ struct vb2_dc_buf {
|
||||||
struct dma_buf_attachment *db_attach;
|
struct dma_buf_attachment *db_attach;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool vb2_dc_buffer_consistent(unsigned long attr)
|
||||||
|
{
|
||||||
|
return !(attr & DMA_ATTR_NON_CONSISTENT);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
/* scatterlist table functions */
|
/* scatterlist table functions */
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
|
@ -335,6 +340,34 @@ static void vb2_dc_dmabuf_ops_release(struct dma_buf *dbuf)
|
||||||
vb2_dc_put(dbuf->priv);
|
vb2_dc_put(dbuf->priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vb2_dc_dmabuf_ops_begin_cpu_access(struct dma_buf *dbuf,
|
||||||
|
enum dma_data_direction direction)
|
||||||
|
{
|
||||||
|
struct vb2_dc_buf *buf = dbuf->priv;
|
||||||
|
struct sg_table *sgt = buf->dma_sgt;
|
||||||
|
|
||||||
|
if (vb2_dc_buffer_consistent(buf->attrs))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vb2_dc_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf,
|
||||||
|
enum dma_data_direction direction)
|
||||||
|
{
|
||||||
|
struct vb2_dc_buf *buf = dbuf->priv;
|
||||||
|
struct sg_table *sgt = buf->dma_sgt;
|
||||||
|
|
||||||
|
if (vb2_dc_buffer_consistent(buf->attrs))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
dma_sync_sg_for_device(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
|
static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
|
||||||
{
|
{
|
||||||
struct vb2_dc_buf *buf = dbuf->priv;
|
struct vb2_dc_buf *buf = dbuf->priv;
|
||||||
|
@ -353,6 +386,8 @@ static const struct dma_buf_ops vb2_dc_dmabuf_ops = {
|
||||||
.detach = vb2_dc_dmabuf_ops_detach,
|
.detach = vb2_dc_dmabuf_ops_detach,
|
||||||
.map_dma_buf = vb2_dc_dmabuf_ops_map,
|
.map_dma_buf = vb2_dc_dmabuf_ops_map,
|
||||||
.unmap_dma_buf = vb2_dc_dmabuf_ops_unmap,
|
.unmap_dma_buf = vb2_dc_dmabuf_ops_unmap,
|
||||||
|
.begin_cpu_access = vb2_dc_dmabuf_ops_begin_cpu_access,
|
||||||
|
.end_cpu_access = vb2_dc_dmabuf_ops_end_cpu_access,
|
||||||
.vmap = vb2_dc_dmabuf_ops_vmap,
|
.vmap = vb2_dc_dmabuf_ops_vmap,
|
||||||
.mmap = vb2_dc_dmabuf_ops_mmap,
|
.mmap = vb2_dc_dmabuf_ops_mmap,
|
||||||
.release = vb2_dc_dmabuf_ops_release,
|
.release = vb2_dc_dmabuf_ops_release,
|
||||||
|
|
Loading…
Reference in New Issue