Lines Matching +full:dma +full:- +full:safe +full:- +full:map
30 #include <linux/dma-buf.h>
68 * GEM-based drivers, the &dma_buf should be exported using
72 * importing GEM object -> dma-buf -> exported GEM bo. A further complication
81 * Self-importing: If userspace is using PRIME as a replacement for flink then
82 * it will get a fd->handle request for a GEM object that it created. Drivers
84 * dma-buf private. For GEM based drivers this is handled in
104 return -ENOMEM; in drm_prime_add_buf_handle()
107 member->dma_buf = dma_buf; in drm_prime_add_buf_handle()
108 member->handle = handle; in drm_prime_add_buf_handle()
111 p = &prime_fpriv->dmabufs.rb_node; in drm_prime_add_buf_handle()
117 if (dma_buf > pos->dma_buf) in drm_prime_add_buf_handle()
118 p = &rb->rb_right; in drm_prime_add_buf_handle()
120 p = &rb->rb_left; in drm_prime_add_buf_handle()
122 rb_link_node(&member->dmabuf_rb, rb, p); in drm_prime_add_buf_handle()
123 rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs); in drm_prime_add_buf_handle()
126 p = &prime_fpriv->handles.rb_node; in drm_prime_add_buf_handle()
132 if (handle > pos->handle) in drm_prime_add_buf_handle()
133 p = &rb->rb_right; in drm_prime_add_buf_handle()
135 p = &rb->rb_left; in drm_prime_add_buf_handle()
137 rb_link_node(&member->handle_rb, rb, p); in drm_prime_add_buf_handle()
138 rb_insert_color(&member->handle_rb, &prime_fpriv->handles); in drm_prime_add_buf_handle()
148 rb = prime_fpriv->handles.rb_node; in drm_prime_lookup_buf_by_handle()
153 if (member->handle == handle) in drm_prime_lookup_buf_by_handle()
154 return member->dma_buf; in drm_prime_lookup_buf_by_handle()
155 else if (member->handle < handle) in drm_prime_lookup_buf_by_handle()
156 rb = rb->rb_right; in drm_prime_lookup_buf_by_handle()
158 rb = rb->rb_left; in drm_prime_lookup_buf_by_handle()
170 rb = prime_fpriv->dmabufs.rb_node; in drm_prime_lookup_buf_handle()
175 if (member->dma_buf == dma_buf) { in drm_prime_lookup_buf_handle()
176 *handle = member->handle; in drm_prime_lookup_buf_handle()
178 } else if (member->dma_buf < dma_buf) { in drm_prime_lookup_buf_handle()
179 rb = rb->rb_right; in drm_prime_lookup_buf_handle()
181 rb = rb->rb_left; in drm_prime_lookup_buf_handle()
185 return -ENOENT; in drm_prime_lookup_buf_handle()
193 mutex_lock(&prime_fpriv->lock); in drm_prime_remove_buf_handle()
195 rb = prime_fpriv->handles.rb_node; in drm_prime_remove_buf_handle()
200 if (member->handle == handle) { in drm_prime_remove_buf_handle()
201 rb_erase(&member->handle_rb, &prime_fpriv->handles); in drm_prime_remove_buf_handle()
202 rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs); in drm_prime_remove_buf_handle()
204 dma_buf_put(member->dma_buf); in drm_prime_remove_buf_handle()
207 } else if (member->handle < handle) { in drm_prime_remove_buf_handle()
208 rb = rb->rb_right; in drm_prime_remove_buf_handle()
210 rb = rb->rb_left; in drm_prime_remove_buf_handle()
214 mutex_unlock(&prime_fpriv->lock); in drm_prime_remove_buf_handle()
219 mutex_init(&prime_fpriv->lock); in drm_prime_init_file_private()
220 prime_fpriv->dmabufs = RB_ROOT; in drm_prime_init_file_private()
221 prime_fpriv->handles = RB_ROOT; in drm_prime_init_file_private()
227 WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs)); in drm_prime_destroy_file_private()
231 * drm_gem_dmabuf_export - &dma_buf export implementation for GEM
245 struct drm_gem_object *obj = exp_info->priv; in drm_gem_dmabuf_export()
254 dma_buf->file->f_mapping = obj->dev->anon_inode->i_mapping; in drm_gem_dmabuf_export()
261 * drm_gem_dmabuf_release - &dma_buf release implementation for GEM
271 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_dmabuf_release()
272 struct drm_device *dev = obj->dev; in drm_gem_dmabuf_release()
282 * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
284 * @file_priv: drm file-private structure
285 * @prime_fd: fd id of the dma-buf which should be imported
290 * The actual importing of GEM object from the dma-buf is done through the
307 mutex_lock(&file_priv->prime.lock); in drm_gem_prime_fd_to_handle()
309 ret = drm_prime_lookup_buf_handle(&file_priv->prime, in drm_gem_prime_fd_to_handle()
315 mutex_lock(&dev->object_name_lock); in drm_gem_prime_fd_to_handle()
316 if (dev->driver->gem_prime_import) in drm_gem_prime_fd_to_handle()
317 obj = dev->driver->gem_prime_import(dev, dma_buf); in drm_gem_prime_fd_to_handle()
325 if (obj->dma_buf) { in drm_gem_prime_fd_to_handle()
326 WARN_ON(obj->dma_buf != dma_buf); in drm_gem_prime_fd_to_handle()
328 obj->dma_buf = dma_buf; in drm_gem_prime_fd_to_handle()
332 /* _handle_create_tail unconditionally unlocks dev->object_name_lock. */ in drm_gem_prime_fd_to_handle()
338 ret = drm_prime_add_buf_handle(&file_priv->prime, in drm_gem_prime_fd_to_handle()
340 mutex_unlock(&file_priv->prime.lock); in drm_gem_prime_fd_to_handle()
349 /* hmm, if driver attached, we are relying on the free-object path in drm_gem_prime_fd_to_handle()
357 mutex_unlock(&dev->object_name_lock); in drm_gem_prime_fd_to_handle()
359 mutex_unlock(&file_priv->prime.lock); in drm_gem_prime_fd_to_handle()
370 if (dev->driver->prime_fd_to_handle) { in drm_prime_fd_to_handle_ioctl()
371 return dev->driver->prime_fd_to_handle(dev, file_priv, args->fd, in drm_prime_fd_to_handle_ioctl()
372 &args->handle); in drm_prime_fd_to_handle_ioctl()
375 return drm_gem_prime_fd_to_handle(dev, file_priv, args->fd, &args->handle); in drm_prime_fd_to_handle_ioctl()
385 if (obj->handle_count == 0) { in export_and_register_object()
386 dmabuf = ERR_PTR(-ENOENT); in export_and_register_object()
390 if (obj->funcs && obj->funcs->export) in export_and_register_object()
391 dmabuf = obj->funcs->export(obj, flags); in export_and_register_object()
395 /* normally the created dma-buf takes ownership of the ref, in export_and_register_object()
403 * since the check for obj->handle_count guarantees that someone in export_and_register_object()
406 obj->dma_buf = dmabuf; in export_and_register_object()
407 get_dma_buf(obj->dma_buf); in export_and_register_object()
413 * drm_gem_prime_handle_to_dmabuf - PRIME export function for GEM drivers
415 * @file_priv: drm file-private structure
421 * The actual exporting from GEM object to a dma-buf is done through the
428 * can not revert if any cleanup is needed, so the descriptor-returning
442 mutex_lock(&file_priv->prime.lock); in drm_gem_prime_handle_to_dmabuf()
445 dmabuf = ERR_PTR(-ENOENT); in drm_gem_prime_handle_to_dmabuf()
449 dmabuf = drm_prime_lookup_buf_by_handle(&file_priv->prime, handle); in drm_gem_prime_handle_to_dmabuf()
455 mutex_lock(&dev->object_name_lock); in drm_gem_prime_handle_to_dmabuf()
456 /* re-export the original imported object */ in drm_gem_prime_handle_to_dmabuf()
457 if (obj->import_attach) { in drm_gem_prime_handle_to_dmabuf()
458 dmabuf = obj->import_attach->dmabuf; in drm_gem_prime_handle_to_dmabuf()
463 if (obj->dma_buf) { in drm_gem_prime_handle_to_dmabuf()
464 get_dma_buf(obj->dma_buf); in drm_gem_prime_handle_to_dmabuf()
465 dmabuf = obj->dma_buf; in drm_gem_prime_handle_to_dmabuf()
471 /* normally the created dma-buf takes ownership of the ref, in drm_gem_prime_handle_to_dmabuf()
474 mutex_unlock(&dev->object_name_lock); in drm_gem_prime_handle_to_dmabuf()
482 * protection of dev->object_name_lock to ensure that a racing gem close in drm_gem_prime_handle_to_dmabuf()
485 ret = drm_prime_add_buf_handle(&file_priv->prime, in drm_gem_prime_handle_to_dmabuf()
487 mutex_unlock(&dev->object_name_lock); in drm_gem_prime_handle_to_dmabuf()
495 mutex_unlock(&file_priv->prime.lock); in drm_gem_prime_handle_to_dmabuf()
501 * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
503 * @file_priv: drm file-private structure
506 * @prime_fd: pointer to storage for the fd id of the create dma-buf
510 * The actual exporting from GEM object to a dma-buf is done through the
530 fd_install(fd, dmabuf->file); in drm_gem_prime_handle_to_fd()
542 if (args->flags & ~(DRM_CLOEXEC | DRM_RDWR)) in drm_prime_handle_to_fd_ioctl()
543 return -EINVAL; in drm_prime_handle_to_fd_ioctl()
545 if (dev->driver->prime_handle_to_fd) { in drm_prime_handle_to_fd_ioctl()
546 return dev->driver->prime_handle_to_fd(dev, file_priv, in drm_prime_handle_to_fd_ioctl()
547 args->handle, args->flags, in drm_prime_handle_to_fd_ioctl()
548 &args->fd); in drm_prime_handle_to_fd_ioctl()
550 return drm_gem_prime_handle_to_fd(dev, file_priv, args->handle, in drm_prime_handle_to_fd_ioctl()
551 args->flags, &args->fd); in drm_prime_handle_to_fd_ioctl()
560 * implement dma-buf support in terms of some lower-level helpers, which are
566 * Optional pinning of buffers is handled at dma-buf attach and detach time in
572 * For kernel-internal access there's drm_gem_dmabuf_vmap() and
577 * storage is fully coherent and either permanently pinned, or it is safe to pin
585 * Importing dma-bufs using drm_gem_prime_import() relies on
594 * drm_gem_map_attach - dma_buf attach implementation for GEM
607 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_map_attach()
610 * drm_gem_map_dma_buf() requires obj->get_sg_table(), but drivers in drm_gem_map_attach()
611 * that implement their own ->map_dma_buf() do not. in drm_gem_map_attach()
613 if (dma_buf->ops->map_dma_buf == drm_gem_map_dma_buf && in drm_gem_map_attach()
614 !obj->funcs->get_sg_table) in drm_gem_map_attach()
615 return -ENOSYS; in drm_gem_map_attach()
622 * drm_gem_map_detach - dma_buf detach implementation for GEM
633 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_map_detach()
640 * drm_gem_map_dma_buf - map_dma_buf implementation for GEM
642 * @dir: direction of DMA transfer
649 * on error. May return -EINTR if it is interrupted by a signal.
654 struct drm_gem_object *obj = attach->dmabuf->priv; in drm_gem_map_dma_buf()
659 return ERR_PTR(-EINVAL); in drm_gem_map_dma_buf()
661 if (WARN_ON(!obj->funcs->get_sg_table)) in drm_gem_map_dma_buf()
662 return ERR_PTR(-ENOSYS); in drm_gem_map_dma_buf()
664 sgt = obj->funcs->get_sg_table(obj); in drm_gem_map_dma_buf()
668 ret = dma_map_sgtable(attach->dev, sgt, dir, in drm_gem_map_dma_buf()
681 * drm_gem_unmap_dma_buf - unmap_dma_buf implementation for GEM
684 * @dir: direction of DMA transfer
695 dma_unmap_sgtable(attach->dev, sgt, dir, DMA_ATTR_SKIP_CPU_SYNC); in drm_gem_unmap_dma_buf()
702 * drm_gem_dmabuf_vmap - dma_buf vmap implementation for GEM
704 * @map: the virtual address of the buffer
708 * The kernel virtual address is returned in map.
712 int drm_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct iosys_map *map) in drm_gem_dmabuf_vmap() argument
714 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_dmabuf_vmap()
716 return drm_gem_vmap(obj, map); in drm_gem_dmabuf_vmap()
721 * drm_gem_dmabuf_vunmap - dma_buf vunmap implementation for GEM
723 * @map: the virtual address of the buffer
728 void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map) in drm_gem_dmabuf_vunmap() argument
730 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_dmabuf_vunmap()
732 drm_gem_vunmap(obj, map); in drm_gem_dmabuf_vunmap()
737 * drm_gem_prime_mmap - PRIME mmap function for GEM drivers
743 * The fake GEM offset is added to vma->vm_pgoff and &drm_driver->fops->mmap is
753 vma->vm_pgoff += drm_vma_node_start(&obj->vma_node); in drm_gem_prime_mmap()
755 if (obj->funcs && obj->funcs->mmap) { in drm_gem_prime_mmap()
756 vma->vm_ops = obj->funcs->vm_ops; in drm_gem_prime_mmap()
759 ret = obj->funcs->mmap(obj, vma); in drm_gem_prime_mmap()
764 vma->vm_private_data = obj; in drm_gem_prime_mmap()
771 ret = -ENOMEM; in drm_gem_prime_mmap()
776 priv->minor = obj->dev->primary; in drm_gem_prime_mmap()
777 fil->private_data = priv; in drm_gem_prime_mmap()
779 ret = drm_vma_node_allow(&obj->vma_node, priv); in drm_gem_prime_mmap()
783 ret = obj->dev->driver->fops->mmap(fil, vma); in drm_gem_prime_mmap()
785 drm_vma_node_revoke(&obj->vma_node, priv); in drm_gem_prime_mmap()
795 * drm_gem_dmabuf_mmap - dma_buf mmap implementation for GEM
806 struct drm_gem_object *obj = dma_buf->priv; in drm_gem_dmabuf_mmap()
825 * drm_prime_pages_to_sg - converts a page array into an sg list
845 return ERR_PTR(-ENOMEM); in drm_prime_pages_to_sg()
848 max_segment = dma_max_mapping_size(dev->dev); in drm_prime_pages_to_sg()
863 * drm_prime_get_contiguous_size - returns the contiguous size of the buffer
866 * This helper calculates the contiguous size in the DMA address space
874 dma_addr_t expected = sg_dma_address(sgt->sgl); in drm_prime_get_contiguous_size()
894 * drm_gem_prime_export - helper library implementation of the export callback
905 struct drm_device *dev = obj->dev; in drm_gem_prime_export()
908 .owner = dev->driver->fops->owner, in drm_gem_prime_export()
910 .size = obj->size, in drm_gem_prime_export()
913 .resv = obj->resv, in drm_gem_prime_export()
921 * drm_gem_prime_import_dev - core implementation of the import callback
923 * @dma_buf: dma-buf object to import
943 if (dma_buf->ops == &drm_gem_prime_dmabuf_ops) { in drm_gem_prime_import_dev()
944 obj = dma_buf->priv; in drm_gem_prime_import_dev()
945 if (obj->dev == dev) { in drm_gem_prime_import_dev()
955 if (!dev->driver->gem_prime_import_sg_table) in drm_gem_prime_import_dev()
956 return ERR_PTR(-EINVAL); in drm_gem_prime_import_dev()
970 obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt); in drm_gem_prime_import_dev()
976 obj->import_attach = attach; in drm_gem_prime_import_dev()
977 obj->resv = dma_buf->resv; in drm_gem_prime_import_dev()
992 * drm_gem_prime_import - helper library implementation of the import callback
994 * @dma_buf: dma-buf object to import
1007 return drm_gem_prime_import_dev(dev, dma_buf, dev->dev); in drm_gem_prime_import()
1012 * drm_prime_sg_to_page_array - convert an sg table into a page array
1013 * @sgt: scatter-gather table to convert
1015 * @max_entries: size of the passed-in array
1031 if (WARN_ON(p - pages >= max_entries)) in drm_prime_sg_to_page_array()
1032 return -1; in drm_prime_sg_to_page_array()
1040 * drm_prime_sg_to_dma_addr_array - convert an sg table into a dma addr array
1041 * @sgt: scatter-gather table to convert
1042 * @addrs: array to store the dma bus address of each page
1043 * @max_entries: size of both the passed-in arrays
1057 if (WARN_ON(a - addrs >= max_entries)) in drm_prime_sg_to_dma_addr_array()
1058 return -1; in drm_prime_sg_to_dma_addr_array()
1066 * drm_prime_gem_destroy - helper to clean up a PRIME-imported GEM object
1067 * @obj: GEM object which was created from a dma-buf
1068 * @sg: the sg-table which was pinned at import time
1071 * drm_gem_prime_import() or drm_gem_prime_import_dev() to import dma-bufs.
1078 attach = obj->import_attach; in drm_prime_gem_destroy()
1081 dma_buf = attach->dmabuf; in drm_prime_gem_destroy()
1082 dma_buf_detach(attach->dmabuf, attach); in drm_prime_gem_destroy()