Lines Matching refs:dmabuf

43 	struct dma_buf *dmabuf;  in dmabuffs_dname()  local
47 dmabuf = dentry->d_fsdata; in dmabuffs_dname()
48 spin_lock(&dmabuf->name_lock); in dmabuffs_dname()
49 if (dmabuf->name) in dmabuffs_dname()
50 ret = strlcpy(name, dmabuf->name, DMA_BUF_NAME_LEN); in dmabuffs_dname()
51 spin_unlock(&dmabuf->name_lock); in dmabuffs_dname()
59 struct dma_buf *dmabuf; in dma_buf_release() local
61 dmabuf = dentry->d_fsdata; in dma_buf_release()
62 if (unlikely(!dmabuf)) in dma_buf_release()
65 BUG_ON(dmabuf->vmapping_counter); in dma_buf_release()
75 BUG_ON(dmabuf->cb_shared.active || dmabuf->cb_excl.active); in dma_buf_release()
77 dmabuf->ops->release(dmabuf); in dma_buf_release()
80 list_del(&dmabuf->list_node); in dma_buf_release()
83 if (dmabuf->resv == (struct dma_resv *)&dmabuf[1]) in dma_buf_release()
84 dma_resv_fini(dmabuf->resv); in dma_buf_release()
86 module_put(dmabuf->owner); in dma_buf_release()
87 kfree(dmabuf->name); in dma_buf_release()
88 kfree(dmabuf); in dma_buf_release()
117 struct dma_buf *dmabuf; in dma_buf_mmap_internal() local
122 dmabuf = file->private_data; in dma_buf_mmap_internal()
125 if (!dmabuf->ops->mmap) in dma_buf_mmap_internal()
130 dmabuf->size >> PAGE_SHIFT) in dma_buf_mmap_internal()
133 return dmabuf->ops->mmap(dmabuf, vma); in dma_buf_mmap_internal()
138 struct dma_buf *dmabuf; in dma_buf_llseek() local
144 dmabuf = file->private_data; in dma_buf_llseek()
150 base = dmabuf->size; in dma_buf_llseek()
197 struct dma_buf *dmabuf; in dma_buf_poll() local
204 dmabuf = file->private_data; in dma_buf_poll()
205 if (!dmabuf || !dmabuf->resv) in dma_buf_poll()
208 resv = dmabuf->resv; in dma_buf_poll()
210 poll_wait(file, &dmabuf->poll, poll); in dma_buf_poll()
232 struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_excl; in dma_buf_poll()
238 spin_lock_irq(&dmabuf->poll.lock); in dma_buf_poll()
244 spin_unlock_irq(&dmabuf->poll.lock); in dma_buf_poll()
267 struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_shared; in dma_buf_poll()
271 spin_lock_irq(&dmabuf->poll.lock); in dma_buf_poll()
276 spin_unlock_irq(&dmabuf->poll.lock); in dma_buf_poll()
329 static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf) in dma_buf_set_name() argument
337 dma_resv_lock(dmabuf->resv, NULL); in dma_buf_set_name()
338 if (!list_empty(&dmabuf->attachments)) { in dma_buf_set_name()
343 spin_lock(&dmabuf->name_lock); in dma_buf_set_name()
344 kfree(dmabuf->name); in dma_buf_set_name()
345 dmabuf->name = name; in dma_buf_set_name()
346 spin_unlock(&dmabuf->name_lock); in dma_buf_set_name()
349 dma_resv_unlock(dmabuf->resv); in dma_buf_set_name()
356 struct dma_buf *dmabuf; in dma_buf_ioctl() local
361 dmabuf = file->private_data; in dma_buf_ioctl()
386 ret = dma_buf_end_cpu_access(dmabuf, direction); in dma_buf_ioctl()
388 ret = dma_buf_begin_cpu_access(dmabuf, direction); in dma_buf_ioctl()
394 return dma_buf_set_name(dmabuf, (const char __user *)arg); in dma_buf_ioctl()
403 struct dma_buf *dmabuf = file->private_data; in dma_buf_show_fdinfo() local
405 seq_printf(m, "size:\t%zu\n", dmabuf->size); in dma_buf_show_fdinfo()
407 seq_printf(m, "count:\t%ld\n", file_count(dmabuf->file) - 1); in dma_buf_show_fdinfo()
408 seq_printf(m, "exp_name:\t%s\n", dmabuf->exp_name); in dma_buf_show_fdinfo()
409 spin_lock(&dmabuf->name_lock); in dma_buf_show_fdinfo()
410 if (dmabuf->name) in dma_buf_show_fdinfo()
411 seq_printf(m, "name:\t%s\n", dmabuf->name); in dma_buf_show_fdinfo()
412 spin_unlock(&dmabuf->name_lock); in dma_buf_show_fdinfo()
432 static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags) in dma_buf_getfile() argument
440 inode->i_size = dmabuf->size; in dma_buf_getfile()
441 inode_set_bytes(inode, dmabuf->size); in dma_buf_getfile()
448 file->private_data = dmabuf; in dma_buf_getfile()
449 file->f_path.dentry->d_fsdata = dmabuf; in dma_buf_getfile()
508 struct dma_buf *dmabuf; in dma_buf_export() local
538 dmabuf = kzalloc(alloc_size, GFP_KERNEL); in dma_buf_export()
539 if (!dmabuf) { in dma_buf_export()
544 dmabuf->priv = exp_info->priv; in dma_buf_export()
545 dmabuf->ops = exp_info->ops; in dma_buf_export()
546 dmabuf->size = exp_info->size; in dma_buf_export()
547 dmabuf->exp_name = exp_info->exp_name; in dma_buf_export()
548 dmabuf->owner = exp_info->owner; in dma_buf_export()
549 spin_lock_init(&dmabuf->name_lock); in dma_buf_export()
550 init_waitqueue_head(&dmabuf->poll); in dma_buf_export()
551 dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; in dma_buf_export()
552 dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; in dma_buf_export()
555 resv = (struct dma_resv *)&dmabuf[1]; in dma_buf_export()
558 dmabuf->resv = resv; in dma_buf_export()
560 file = dma_buf_getfile(dmabuf, exp_info->flags); in dma_buf_export()
567 dmabuf->file = file; in dma_buf_export()
569 mutex_init(&dmabuf->lock); in dma_buf_export()
570 INIT_LIST_HEAD(&dmabuf->attachments); in dma_buf_export()
573 list_add(&dmabuf->list_node, &db_list.head); in dma_buf_export()
576 return dmabuf; in dma_buf_export()
579 kfree(dmabuf); in dma_buf_export()
593 int dma_buf_fd(struct dma_buf *dmabuf, int flags) in dma_buf_fd() argument
597 if (!dmabuf || !dmabuf->file) in dma_buf_fd()
604 fd_install(fd, dmabuf->file); in dma_buf_fd()
646 void dma_buf_put(struct dma_buf *dmabuf) in dma_buf_put() argument
648 if (WARN_ON(!dmabuf || !dmabuf->file)) in dma_buf_put()
651 fput(dmabuf->file); in dma_buf_put()
676 dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, in dma_buf_dynamic_attach() argument
683 if (WARN_ON(!dmabuf || !dev)) in dma_buf_dynamic_attach()
694 attach->dmabuf = dmabuf; in dma_buf_dynamic_attach()
700 if (dmabuf->ops->attach) { in dma_buf_dynamic_attach()
701 ret = dmabuf->ops->attach(dmabuf, attach); in dma_buf_dynamic_attach()
705 dma_resv_lock(dmabuf->resv, NULL); in dma_buf_dynamic_attach()
706 list_add(&attach->node, &dmabuf->attachments); in dma_buf_dynamic_attach()
707 dma_resv_unlock(dmabuf->resv); in dma_buf_dynamic_attach()
714 dma_buf_is_dynamic(dmabuf)) { in dma_buf_dynamic_attach()
717 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_dynamic_attach()
718 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_dynamic_attach()
724 sgt = dmabuf->ops->map_dma_buf(attach, DMA_BIDIRECTIONAL); in dma_buf_dynamic_attach()
731 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
732 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
744 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
748 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_dynamic_attach()
749 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_dynamic_attach()
751 dma_buf_detach(dmabuf, attach); in dma_buf_dynamic_attach()
764 struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf, in dma_buf_attach() argument
767 return dma_buf_dynamic_attach(dmabuf, dev, NULL, NULL); in dma_buf_attach()
779 void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach) in dma_buf_detach() argument
781 if (WARN_ON(!dmabuf || !attach)) in dma_buf_detach()
785 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_detach()
786 dma_resv_lock(attach->dmabuf->resv, NULL); in dma_buf_detach()
788 dmabuf->ops->unmap_dma_buf(attach, attach->sgt, attach->dir); in dma_buf_detach()
790 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_detach()
792 dma_resv_unlock(attach->dmabuf->resv); in dma_buf_detach()
796 dma_resv_lock(dmabuf->resv, NULL); in dma_buf_detach()
798 dma_resv_unlock(dmabuf->resv); in dma_buf_detach()
799 if (dmabuf->ops->detach) in dma_buf_detach()
800 dmabuf->ops->detach(dmabuf, attach); in dma_buf_detach()
816 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_pin() local
819 dma_resv_assert_held(dmabuf->resv); in dma_buf_pin()
821 if (dmabuf->ops->pin) in dma_buf_pin()
822 ret = dmabuf->ops->pin(attach); in dma_buf_pin()
835 struct dma_buf *dmabuf = attach->dmabuf; in dma_buf_unpin() local
837 dma_resv_assert_held(dmabuf->resv); in dma_buf_unpin()
839 if (dmabuf->ops->unpin) in dma_buf_unpin()
840 dmabuf->ops->unpin(attach); in dma_buf_unpin()
867 if (WARN_ON(!attach || !attach->dmabuf)) in dma_buf_map_attachment()
871 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
885 if (dma_buf_is_dynamic(attach->dmabuf)) { in dma_buf_map_attachment()
886 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_map_attachment()
894 sg_table = attach->dmabuf->ops->map_dma_buf(attach, direction); in dma_buf_map_attachment()
898 if (IS_ERR(sg_table) && dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_map_attachment()
902 if (!IS_ERR(sg_table) && attach->dmabuf->ops->cache_sgt_mapping) { in dma_buf_map_attachment()
927 if (WARN_ON(!attach || !attach->dmabuf || !sg_table)) in dma_buf_unmap_attachment()
931 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
936 if (dma_buf_is_dynamic(attach->dmabuf)) in dma_buf_unmap_attachment()
937 dma_resv_assert_held(attach->dmabuf->resv); in dma_buf_unmap_attachment()
939 attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction); in dma_buf_unmap_attachment()
941 if (dma_buf_is_dynamic(attach->dmabuf) && in dma_buf_unmap_attachment()
955 void dma_buf_move_notify(struct dma_buf *dmabuf) in dma_buf_move_notify() argument
959 dma_resv_assert_held(dmabuf->resv); in dma_buf_move_notify()
961 list_for_each_entry(attach, &dmabuf->attachments, node) in dma_buf_move_notify()
1051 static int __dma_buf_begin_cpu_access(struct dma_buf *dmabuf, in __dma_buf_begin_cpu_access() argument
1056 struct dma_resv *resv = dmabuf->resv; in __dma_buf_begin_cpu_access()
1082 int dma_buf_begin_cpu_access(struct dma_buf *dmabuf, in dma_buf_begin_cpu_access() argument
1087 if (WARN_ON(!dmabuf)) in dma_buf_begin_cpu_access()
1090 if (dmabuf->ops->begin_cpu_access) in dma_buf_begin_cpu_access()
1091 ret = dmabuf->ops->begin_cpu_access(dmabuf, direction); in dma_buf_begin_cpu_access()
1098 ret = __dma_buf_begin_cpu_access(dmabuf, direction); in dma_buf_begin_cpu_access()
1116 int dma_buf_end_cpu_access(struct dma_buf *dmabuf, in dma_buf_end_cpu_access() argument
1121 WARN_ON(!dmabuf); in dma_buf_end_cpu_access()
1123 if (dmabuf->ops->end_cpu_access) in dma_buf_end_cpu_access()
1124 ret = dmabuf->ops->end_cpu_access(dmabuf, direction); in dma_buf_end_cpu_access()
1145 int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma, in dma_buf_mmap() argument
1151 if (WARN_ON(!dmabuf || !vma)) in dma_buf_mmap()
1155 if (!dmabuf->ops->mmap) in dma_buf_mmap()
1164 dmabuf->size >> PAGE_SHIFT) in dma_buf_mmap()
1168 get_file(dmabuf->file); in dma_buf_mmap()
1170 vma->vm_file = dmabuf->file; in dma_buf_mmap()
1173 ret = dmabuf->ops->mmap(dmabuf, vma); in dma_buf_mmap()
1177 fput(dmabuf->file); in dma_buf_mmap()
1199 void *dma_buf_vmap(struct dma_buf *dmabuf) in dma_buf_vmap() argument
1203 if (WARN_ON(!dmabuf)) in dma_buf_vmap()
1206 if (!dmabuf->ops->vmap) in dma_buf_vmap()
1209 mutex_lock(&dmabuf->lock); in dma_buf_vmap()
1210 if (dmabuf->vmapping_counter) { in dma_buf_vmap()
1211 dmabuf->vmapping_counter++; in dma_buf_vmap()
1212 BUG_ON(!dmabuf->vmap_ptr); in dma_buf_vmap()
1213 ptr = dmabuf->vmap_ptr; in dma_buf_vmap()
1217 BUG_ON(dmabuf->vmap_ptr); in dma_buf_vmap()
1219 ptr = dmabuf->ops->vmap(dmabuf); in dma_buf_vmap()
1225 dmabuf->vmap_ptr = ptr; in dma_buf_vmap()
1226 dmabuf->vmapping_counter = 1; in dma_buf_vmap()
1229 mutex_unlock(&dmabuf->lock); in dma_buf_vmap()
1239 void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) in dma_buf_vunmap() argument
1241 if (WARN_ON(!dmabuf)) in dma_buf_vunmap()
1244 BUG_ON(!dmabuf->vmap_ptr); in dma_buf_vunmap()
1245 BUG_ON(dmabuf->vmapping_counter == 0); in dma_buf_vunmap()
1246 BUG_ON(dmabuf->vmap_ptr != vaddr); in dma_buf_vunmap()
1248 mutex_lock(&dmabuf->lock); in dma_buf_vunmap()
1249 if (--dmabuf->vmapping_counter == 0) { in dma_buf_vunmap()
1250 if (dmabuf->ops->vunmap) in dma_buf_vunmap()
1251 dmabuf->ops->vunmap(dmabuf, vaddr); in dma_buf_vunmap()
1252 dmabuf->vmap_ptr = NULL; in dma_buf_vunmap()
1254 mutex_unlock(&dmabuf->lock); in dma_buf_vunmap()