Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/prime: Add drm_gem_prime_mmap()

Add a generic PRIME GEM mmap function.

v2: Fix link in docs (Daniel Vetter)

Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181110145647.17580-3-noralf@tronnes.org

+38
+37
drivers/gpu/drm/drm_prime.c
··· 652 652 EXPORT_SYMBOL(drm_gem_prime_handle_to_fd); 653 653 654 654 /** 655 + * drm_gem_prime_mmap - PRIME mmap function for GEM drivers 656 + * @obj: GEM object 657 + * @vma: Virtual address range 658 + * 659 + * This function sets up a userspace mapping for PRIME exported buffers using 660 + * the same codepath that is used for regular GEM buffer mapping on the DRM fd. 661 + * The fake GEM offset is added to vma->vm_pgoff and &drm_driver->fops->mmap is 662 + * called to set up the mapping. 663 + * 664 + * Drivers can use this as their &drm_driver.gem_prime_mmap callback. 665 + */ 666 + int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 667 + { 668 + /* Used by drm_gem_mmap() to lookup the GEM object */ 669 + struct drm_file priv = { 670 + .minor = obj->dev->primary, 671 + }; 672 + struct file fil = { 673 + .private_data = &priv, 674 + }; 675 + int ret; 676 + 677 + ret = drm_vma_node_allow(&obj->vma_node, &priv); 678 + if (ret) 679 + return ret; 680 + 681 + vma->vm_pgoff += drm_vma_node_start(&obj->vma_node); 682 + 683 + ret = obj->dev->driver->fops->mmap(&fil, vma); 684 + 685 + drm_vma_node_revoke(&obj->vma_node, &priv); 686 + 687 + return ret; 688 + } 689 + EXPORT_SYMBOL(drm_gem_prime_mmap); 690 + 691 + /** 655 692 * drm_gem_prime_import_dev - core implementation of the import callback 656 693 * @dev: drm_device to import into 657 694 * @dma_buf: dma-buf object to import
+1
include/drm/drm_prime.h
··· 70 70 int drm_gem_prime_handle_to_fd(struct drm_device *dev, 71 71 struct drm_file *file_priv, uint32_t handle, uint32_t flags, 72 72 int *prime_fd); 73 + int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 73 74 struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, 74 75 struct dma_buf *dma_buf); 75 76