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

drm/msm: Add hint to DRM_IOCTL_MSM_GEM_INFO to return an object IOVA

Modify the 'pad' member of struct drm_msm_gem_info to 'flags'. If the
user sets 'flags' to non-zero it means that they want a IOVA for the
GEM object instead of a mmap() offset. Return the iova in the 'offset'
member.

Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
[robclark: s/hint/flags in commit msg]
Signed-off-by: Rob Clark <robdclark@gmail.com>

authored by

Jordan Crouse and committed by
Rob Clark
49fd08ba e895c7bd

+27 -4
+21 -2
drivers/gpu/drm/msm/msm_drv.c
··· 699 699 return ret; 700 700 } 701 701 702 + static int msm_ioctl_gem_info_iova(struct drm_device *dev, 703 + struct drm_gem_object *obj, uint64_t *iova) 704 + { 705 + struct msm_drm_private *priv = dev->dev_private; 706 + 707 + if (!priv->gpu) 708 + return -EINVAL; 709 + 710 + return msm_gem_get_iova(obj, priv->gpu->id, iova); 711 + } 712 + 702 713 static int msm_ioctl_gem_info(struct drm_device *dev, void *data, 703 714 struct drm_file *file) 704 715 { ··· 717 706 struct drm_gem_object *obj; 718 707 int ret = 0; 719 708 720 - if (args->pad) 709 + if (args->flags & ~MSM_INFO_FLAGS) 721 710 return -EINVAL; 722 711 723 712 obj = drm_gem_object_lookup(file, args->handle); 724 713 if (!obj) 725 714 return -ENOENT; 726 715 727 - args->offset = msm_gem_mmap_offset(obj); 716 + if (args->flags & MSM_INFO_IOVA) { 717 + uint64_t iova; 718 + 719 + ret = msm_ioctl_gem_info_iova(dev, obj, &iova); 720 + if (!ret) 721 + args->offset = iova; 722 + } else { 723 + args->offset = msm_gem_mmap_offset(obj); 724 + } 728 725 729 726 drm_gem_object_unreference_unlocked(obj); 730 727
+6 -2
include/uapi/drm/msm_drm.h
··· 104 104 __u32 handle; /* out */ 105 105 }; 106 106 107 + #define MSM_INFO_IOVA 0x01 108 + 109 + #define MSM_INFO_FLAGS (MSM_INFO_IOVA) 110 + 107 111 struct drm_msm_gem_info { 108 112 __u32 handle; /* in */ 109 - __u32 pad; 110 - __u64 offset; /* out, offset to pass to mmap() */ 113 + __u32 flags; /* in - combination of MSM_INFO_* flags */ 114 + __u64 offset; /* out, mmap() offset or iova */ 111 115 }; 112 116 113 117 #define MSM_PREP_READ 0x01