mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
dma-buf: cma_heap: support dmabuf partial sync
Add partital sync support for begain/end of cpu access. Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com> Change-Id: I36cc7d2fffd1e22d796d429c76a990542acb8dd2
This commit is contained in:
@@ -132,8 +132,11 @@ static void cma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
|
|||||||
dma_unmap_sgtable(attachment->dev, table, direction, attrs);
|
dma_unmap_sgtable(attachment->dev, table, direction, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
|
static int
|
||||||
enum dma_data_direction direction)
|
cma_heap_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
|
||||||
|
enum dma_data_direction direction,
|
||||||
|
unsigned int offset,
|
||||||
|
unsigned int len)
|
||||||
{
|
{
|
||||||
struct cma_heap_buffer *buffer = dmabuf->priv;
|
struct cma_heap_buffer *buffer = dmabuf->priv;
|
||||||
struct dma_heap_attachment *a;
|
struct dma_heap_attachment *a;
|
||||||
@@ -150,13 +153,24 @@ static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
|
|||||||
continue;
|
continue;
|
||||||
dma_sync_sgtable_for_cpu(a->dev, &a->table, direction);
|
dma_sync_sgtable_for_cpu(a->dev, &a->table, direction);
|
||||||
}
|
}
|
||||||
|
if (list_empty(&buffer->attachments)) {
|
||||||
|
phys_addr_t phys = page_to_phys(buffer->cma_pages);
|
||||||
|
|
||||||
|
dma_sync_single_for_cpu(dma_heap_get_dev(buffer->heap->heap),
|
||||||
|
phys + offset,
|
||||||
|
len,
|
||||||
|
direction);
|
||||||
|
}
|
||||||
mutex_unlock(&buffer->lock);
|
mutex_unlock(&buffer->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
|
static int
|
||||||
enum dma_data_direction direction)
|
cma_heap_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
|
||||||
|
enum dma_data_direction direction,
|
||||||
|
unsigned int offset,
|
||||||
|
unsigned int len)
|
||||||
{
|
{
|
||||||
struct cma_heap_buffer *buffer = dmabuf->priv;
|
struct cma_heap_buffer *buffer = dmabuf->priv;
|
||||||
struct dma_heap_attachment *a;
|
struct dma_heap_attachment *a;
|
||||||
@@ -173,11 +187,33 @@ static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
|
|||||||
continue;
|
continue;
|
||||||
dma_sync_sgtable_for_device(a->dev, &a->table, direction);
|
dma_sync_sgtable_for_device(a->dev, &a->table, direction);
|
||||||
}
|
}
|
||||||
|
if (list_empty(&buffer->attachments)) {
|
||||||
|
phys_addr_t phys = page_to_phys(buffer->cma_pages);
|
||||||
|
|
||||||
|
dma_sync_single_for_device(dma_heap_get_dev(buffer->heap->heap),
|
||||||
|
phys + offset,
|
||||||
|
len,
|
||||||
|
direction);
|
||||||
|
}
|
||||||
mutex_unlock(&buffer->lock);
|
mutex_unlock(&buffer->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
return cma_heap_dma_buf_begin_cpu_access_partial(dmabuf, dir, 0,
|
||||||
|
dmabuf->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
|
||||||
|
enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
return cma_heap_dma_buf_end_cpu_access_partial(dmabuf, dir, 0,
|
||||||
|
dmabuf->size);
|
||||||
|
}
|
||||||
|
|
||||||
static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
|
static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma = vmf->vma;
|
struct vm_area_struct *vma = vmf->vma;
|
||||||
@@ -287,6 +323,8 @@ static const struct dma_buf_ops cma_heap_buf_ops = {
|
|||||||
.unmap_dma_buf = cma_heap_unmap_dma_buf,
|
.unmap_dma_buf = cma_heap_unmap_dma_buf,
|
||||||
.begin_cpu_access = cma_heap_dma_buf_begin_cpu_access,
|
.begin_cpu_access = cma_heap_dma_buf_begin_cpu_access,
|
||||||
.end_cpu_access = cma_heap_dma_buf_end_cpu_access,
|
.end_cpu_access = cma_heap_dma_buf_end_cpu_access,
|
||||||
|
.begin_cpu_access_partial = cma_heap_dma_buf_begin_cpu_access_partial,
|
||||||
|
.end_cpu_access_partial = cma_heap_dma_buf_end_cpu_access_partial,
|
||||||
.mmap = cma_heap_mmap,
|
.mmap = cma_heap_mmap,
|
||||||
.vmap = cma_heap_vmap,
|
.vmap = cma_heap_vmap,
|
||||||
.vunmap = cma_heap_vunmap,
|
.vunmap = cma_heap_vunmap,
|
||||||
|
|||||||
Reference in New Issue
Block a user