Lines Matching refs:buf
75 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_cookie() local
77 return &buf->dma_addr; in vb2_dc_cookie()
96 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_vaddr() local
98 if (buf->vaddr) in vb2_dc_vaddr()
99 return buf->vaddr; in vb2_dc_vaddr()
101 if (buf->db_attach) { in vb2_dc_vaddr()
104 if (!dma_buf_vmap_unlocked(buf->db_attach->dmabuf, &map)) in vb2_dc_vaddr()
105 buf->vaddr = map.vaddr; in vb2_dc_vaddr()
107 return buf->vaddr; in vb2_dc_vaddr()
110 if (buf->non_coherent_mem) in vb2_dc_vaddr()
111 buf->vaddr = dma_vmap_noncontiguous(buf->dev, buf->size, in vb2_dc_vaddr()
112 buf->dma_sgt); in vb2_dc_vaddr()
113 return buf->vaddr; in vb2_dc_vaddr()
118 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_num_users() local
120 return refcount_read(&buf->refcount); in vb2_dc_num_users()
125 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_prepare() local
126 struct sg_table *sgt = buf->dma_sgt; in vb2_dc_prepare()
129 if (buf->vb->skip_cache_sync_on_prepare) in vb2_dc_prepare()
132 if (!buf->non_coherent_mem) in vb2_dc_prepare()
136 if (buf->vaddr) in vb2_dc_prepare()
137 flush_kernel_vmap_range(buf->vaddr, buf->size); in vb2_dc_prepare()
140 dma_sync_sgtable_for_device(buf->dev, sgt, buf->dma_dir); in vb2_dc_prepare()
145 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_finish() local
146 struct sg_table *sgt = buf->dma_sgt; in vb2_dc_finish()
149 if (buf->vb->skip_cache_sync_on_finish) in vb2_dc_finish()
152 if (!buf->non_coherent_mem) in vb2_dc_finish()
156 if (buf->vaddr) in vb2_dc_finish()
157 invalidate_kernel_vmap_range(buf->vaddr, buf->size); in vb2_dc_finish()
160 dma_sync_sgtable_for_cpu(buf->dev, sgt, buf->dma_dir); in vb2_dc_finish()
169 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_put() local
171 if (!refcount_dec_and_test(&buf->refcount)) in vb2_dc_put()
174 if (buf->non_coherent_mem) { in vb2_dc_put()
175 if (buf->vaddr) in vb2_dc_put()
176 dma_vunmap_noncontiguous(buf->dev, buf->vaddr); in vb2_dc_put()
177 dma_free_noncontiguous(buf->dev, buf->size, in vb2_dc_put()
178 buf->dma_sgt, buf->dma_dir); in vb2_dc_put()
180 if (buf->sgt_base) { in vb2_dc_put()
181 sg_free_table(buf->sgt_base); in vb2_dc_put()
182 kfree(buf->sgt_base); in vb2_dc_put()
184 dma_free_attrs(buf->dev, buf->size, buf->cookie, in vb2_dc_put()
185 buf->dma_addr, buf->attrs); in vb2_dc_put()
187 put_device(buf->dev); in vb2_dc_put()
188 kfree(buf); in vb2_dc_put()
191 static int vb2_dc_alloc_coherent(struct vb2_dc_buf *buf) in vb2_dc_alloc_coherent() argument
193 struct vb2_queue *q = buf->vb->vb2_queue; in vb2_dc_alloc_coherent()
195 buf->cookie = dma_alloc_attrs(buf->dev, in vb2_dc_alloc_coherent()
196 buf->size, in vb2_dc_alloc_coherent()
197 &buf->dma_addr, in vb2_dc_alloc_coherent()
199 buf->attrs); in vb2_dc_alloc_coherent()
200 if (!buf->cookie) in vb2_dc_alloc_coherent()
206 buf->vaddr = buf->cookie; in vb2_dc_alloc_coherent()
210 static int vb2_dc_alloc_non_coherent(struct vb2_dc_buf *buf) in vb2_dc_alloc_non_coherent() argument
212 struct vb2_queue *q = buf->vb->vb2_queue; in vb2_dc_alloc_non_coherent()
214 buf->dma_sgt = dma_alloc_noncontiguous(buf->dev, in vb2_dc_alloc_non_coherent()
215 buf->size, in vb2_dc_alloc_non_coherent()
216 buf->dma_dir, in vb2_dc_alloc_non_coherent()
218 buf->attrs); in vb2_dc_alloc_non_coherent()
219 if (!buf->dma_sgt) in vb2_dc_alloc_non_coherent()
222 buf->dma_addr = sg_dma_address(buf->dma_sgt->sgl); in vb2_dc_alloc_non_coherent()
235 struct vb2_dc_buf *buf; in vb2_dc_alloc() local
241 buf = kzalloc(sizeof *buf, GFP_KERNEL); in vb2_dc_alloc()
242 if (!buf) in vb2_dc_alloc()
245 buf->attrs = vb->vb2_queue->dma_attrs; in vb2_dc_alloc()
246 buf->dma_dir = vb->vb2_queue->dma_dir; in vb2_dc_alloc()
247 buf->vb = vb; in vb2_dc_alloc()
248 buf->non_coherent_mem = vb->vb2_queue->non_coherent_mem; in vb2_dc_alloc()
250 buf->size = size; in vb2_dc_alloc()
252 buf->dev = get_device(dev); in vb2_dc_alloc()
254 if (buf->non_coherent_mem) in vb2_dc_alloc()
255 ret = vb2_dc_alloc_non_coherent(buf); in vb2_dc_alloc()
257 ret = vb2_dc_alloc_coherent(buf); in vb2_dc_alloc()
261 kfree(buf); in vb2_dc_alloc()
265 buf->handler.refcount = &buf->refcount; in vb2_dc_alloc()
266 buf->handler.put = vb2_dc_put; in vb2_dc_alloc()
267 buf->handler.arg = buf; in vb2_dc_alloc()
269 refcount_set(&buf->refcount, 1); in vb2_dc_alloc()
271 return buf; in vb2_dc_alloc()
276 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_mmap() local
279 if (!buf) { in vb2_dc_mmap()
284 if (buf->non_coherent_mem) in vb2_dc_mmap()
285 ret = dma_mmap_noncontiguous(buf->dev, vma, buf->size, in vb2_dc_mmap()
286 buf->dma_sgt); in vb2_dc_mmap()
288 ret = dma_mmap_attrs(buf->dev, vma, buf->cookie, buf->dma_addr, in vb2_dc_mmap()
289 buf->size, buf->attrs); in vb2_dc_mmap()
296 vma->vm_private_data = &buf->handler; in vb2_dc_mmap()
302 __func__, (unsigned long)buf->dma_addr, vma->vm_start, in vb2_dc_mmap()
303 buf->size); in vb2_dc_mmap()
324 struct vb2_dc_buf *buf = dbuf->priv; in vb2_dc_dmabuf_ops_attach() local
335 ret = sg_alloc_table(sgt, buf->sgt_base->orig_nents, GFP_KERNEL); in vb2_dc_dmabuf_ops_attach()
341 rd = buf->sgt_base->sgl; in vb2_dc_dmabuf_ops_attach()
442 struct vb2_dc_buf *buf; in vb2_dc_dmabuf_ops_vmap() local
445 buf = dbuf->priv; in vb2_dc_dmabuf_ops_vmap()
446 vaddr = vb2_dc_vaddr(buf->vb, buf); in vb2_dc_dmabuf_ops_vmap()
473 static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf) in vb2_dc_get_base_sgt() argument
478 if (buf->non_coherent_mem) in vb2_dc_get_base_sgt()
479 return buf->dma_sgt; in vb2_dc_get_base_sgt()
483 dev_err(buf->dev, "failed to alloc sg table\n"); in vb2_dc_get_base_sgt()
487 ret = dma_get_sgtable_attrs(buf->dev, sgt, buf->cookie, buf->dma_addr, in vb2_dc_get_base_sgt()
488 buf->size, buf->attrs); in vb2_dc_get_base_sgt()
490 dev_err(buf->dev, "failed to get scatterlist from DMA API\n"); in vb2_dc_get_base_sgt()
502 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_get_dmabuf() local
507 exp_info.size = buf->size; in vb2_dc_get_dmabuf()
509 exp_info.priv = buf; in vb2_dc_get_dmabuf()
511 if (!buf->sgt_base) in vb2_dc_get_dmabuf()
512 buf->sgt_base = vb2_dc_get_base_sgt(buf); in vb2_dc_get_dmabuf()
514 if (WARN_ON(!buf->sgt_base)) in vb2_dc_get_dmabuf()
522 refcount_inc(&buf->refcount); in vb2_dc_get_dmabuf()
533 struct vb2_dc_buf *buf = buf_priv; in vb2_dc_put_userptr() local
534 struct sg_table *sgt = buf->dma_sgt; in vb2_dc_put_userptr()
543 dma_unmap_sgtable(buf->dev, sgt, buf->dma_dir, in vb2_dc_put_userptr()
545 pages = frame_vector_pages(buf->vec); in vb2_dc_put_userptr()
548 if (buf->dma_dir == DMA_FROM_DEVICE || in vb2_dc_put_userptr()
549 buf->dma_dir == DMA_BIDIRECTIONAL) in vb2_dc_put_userptr()
550 for (i = 0; i < frame_vector_count(buf->vec); i++) in vb2_dc_put_userptr()
555 dma_unmap_resource(buf->dev, buf->dma_addr, buf->size, in vb2_dc_put_userptr()
556 buf->dma_dir, 0); in vb2_dc_put_userptr()
558 vb2_destroy_framevec(buf->vec); in vb2_dc_put_userptr()
559 kfree(buf); in vb2_dc_put_userptr()
565 struct vb2_dc_buf *buf; in vb2_dc_get_userptr() local
588 buf = kzalloc(sizeof *buf, GFP_KERNEL); in vb2_dc_get_userptr()
589 if (!buf) in vb2_dc_get_userptr()
592 buf->dev = dev; in vb2_dc_get_userptr()
593 buf->dma_dir = vb->vb2_queue->dma_dir; in vb2_dc_get_userptr()
594 buf->vb = vb; in vb2_dc_get_userptr()
597 vec = vb2_create_framevec(vaddr, size, buf->dma_dir == DMA_FROM_DEVICE || in vb2_dc_get_userptr()
598 buf->dma_dir == DMA_BIDIRECTIONAL); in vb2_dc_get_userptr()
603 buf->vec = vec; in vb2_dc_get_userptr()
616 buf->dma_addr = dma_map_resource(buf->dev, in vb2_dc_get_userptr()
617 __pfn_to_phys(nums[0]), size, buf->dma_dir, 0); in vb2_dc_get_userptr()
618 if (dma_mapping_error(buf->dev, buf->dma_addr)) { in vb2_dc_get_userptr()
643 if (dma_map_sgtable(buf->dev, sgt, buf->dma_dir, in vb2_dc_get_userptr()
658 buf->dma_addr = sg_dma_address(sgt->sgl); in vb2_dc_get_userptr()
659 buf->dma_sgt = sgt; in vb2_dc_get_userptr()
660 buf->non_coherent_mem = 1; in vb2_dc_get_userptr()
663 buf->size = size; in vb2_dc_get_userptr()
665 return buf; in vb2_dc_get_userptr()
668 dma_unmap_sgtable(buf->dev, sgt, buf->dma_dir, DMA_ATTR_SKIP_CPU_SYNC); in vb2_dc_get_userptr()
680 kfree(buf); in vb2_dc_get_userptr()
691 struct vb2_dc_buf *buf = mem_priv; in vb2_dc_map_dmabuf() local
695 if (WARN_ON(!buf->db_attach)) { in vb2_dc_map_dmabuf()
700 if (WARN_ON(buf->dma_sgt)) { in vb2_dc_map_dmabuf()
706 sgt = dma_buf_map_attachment_unlocked(buf->db_attach, buf->dma_dir); in vb2_dc_map_dmabuf()
714 if (contig_size < buf->size) { in vb2_dc_map_dmabuf()
716 contig_size, buf->size); in vb2_dc_map_dmabuf()
717 dma_buf_unmap_attachment_unlocked(buf->db_attach, sgt, in vb2_dc_map_dmabuf()
718 buf->dma_dir); in vb2_dc_map_dmabuf()
722 buf->dma_addr = sg_dma_address(sgt->sgl); in vb2_dc_map_dmabuf()
723 buf->dma_sgt = sgt; in vb2_dc_map_dmabuf()
724 buf->vaddr = NULL; in vb2_dc_map_dmabuf()
731 struct vb2_dc_buf *buf = mem_priv; in vb2_dc_unmap_dmabuf() local
732 struct sg_table *sgt = buf->dma_sgt; in vb2_dc_unmap_dmabuf()
733 struct iosys_map map = IOSYS_MAP_INIT_VADDR(buf->vaddr); in vb2_dc_unmap_dmabuf()
735 if (WARN_ON(!buf->db_attach)) { in vb2_dc_unmap_dmabuf()
745 if (buf->vaddr) { in vb2_dc_unmap_dmabuf()
746 dma_buf_vunmap_unlocked(buf->db_attach->dmabuf, &map); in vb2_dc_unmap_dmabuf()
747 buf->vaddr = NULL; in vb2_dc_unmap_dmabuf()
749 dma_buf_unmap_attachment_unlocked(buf->db_attach, sgt, buf->dma_dir); in vb2_dc_unmap_dmabuf()
751 buf->dma_addr = 0; in vb2_dc_unmap_dmabuf()
752 buf->dma_sgt = NULL; in vb2_dc_unmap_dmabuf()
757 struct vb2_dc_buf *buf = mem_priv; in vb2_dc_detach_dmabuf() local
760 if (WARN_ON(buf->dma_addr)) in vb2_dc_detach_dmabuf()
761 vb2_dc_unmap_dmabuf(buf); in vb2_dc_detach_dmabuf()
764 dma_buf_detach(buf->db_attach->dmabuf, buf->db_attach); in vb2_dc_detach_dmabuf()
765 kfree(buf); in vb2_dc_detach_dmabuf()
771 struct vb2_dc_buf *buf; in vb2_dc_attach_dmabuf() local
780 buf = kzalloc(sizeof(*buf), GFP_KERNEL); in vb2_dc_attach_dmabuf()
781 if (!buf) in vb2_dc_attach_dmabuf()
784 buf->dev = dev; in vb2_dc_attach_dmabuf()
785 buf->vb = vb; in vb2_dc_attach_dmabuf()
788 dba = dma_buf_attach(dbuf, buf->dev); in vb2_dc_attach_dmabuf()
791 kfree(buf); in vb2_dc_attach_dmabuf()
795 buf->dma_dir = vb->vb2_queue->dma_dir; in vb2_dc_attach_dmabuf()
796 buf->size = size; in vb2_dc_attach_dmabuf()
797 buf->db_attach = dba; in vb2_dc_attach_dmabuf()
799 return buf; in vb2_dc_attach_dmabuf()