diff options
| -rw-r--r-- | drivers/gpu/drm/drm_prime.c | 37 | ||||
| -rw-r--r-- | include/drm/drm_prime.h | 1 |
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index ba6c7e02a2ae..6a4fe0216e27 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c | |||
| @@ -652,6 +652,43 @@ out_unlock: | |||
| 652 | EXPORT_SYMBOL(drm_gem_prime_handle_to_fd); | 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 | * drm_gem_prime_import_dev - core implementation of the import callback | 692 | * drm_gem_prime_import_dev - core implementation of the import callback |
| 656 | * @dev: drm_device to import into | 693 | * @dev: drm_device to import into |
| 657 | * @dma_buf: dma-buf object to import | 694 | * @dma_buf: dma-buf object to import |
diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h index e2032fbc0f08..b03731a3f079 100644 --- a/include/drm/drm_prime.h +++ b/include/drm/drm_prime.h | |||
| @@ -70,6 +70,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev, | |||
| 70 | int drm_gem_prime_handle_to_fd(struct drm_device *dev, | 70 | int drm_gem_prime_handle_to_fd(struct drm_device *dev, |
| 71 | struct drm_file *file_priv, uint32_t handle, uint32_t flags, | 71 | struct drm_file *file_priv, uint32_t handle, uint32_t flags, |
| 72 | int *prime_fd); | 72 | int *prime_fd); |
| 73 | int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); | ||
| 73 | struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, | 74 | struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, |
| 74 | struct dma_buf *dma_buf); | 75 | struct dma_buf *dma_buf); |
| 75 | 76 | ||
