Commit 49fd08ba authored by Jordan Crouse's avatar Jordan Crouse Committed by Rob Clark

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: default avatarJordan Crouse <jcrouse@codeaurora.org>
[robclark: s/hint/flags in commit msg]
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent e895c7bd
...@@ -699,6 +699,17 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data, ...@@ -699,6 +699,17 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
return ret; return ret;
} }
static int msm_ioctl_gem_info_iova(struct drm_device *dev,
struct drm_gem_object *obj, uint64_t *iova)
{
struct msm_drm_private *priv = dev->dev_private;
if (!priv->gpu)
return -EINVAL;
return msm_gem_get_iova(obj, priv->gpu->id, iova);
}
static int msm_ioctl_gem_info(struct drm_device *dev, void *data, static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
struct drm_file *file) struct drm_file *file)
{ {
...@@ -706,14 +717,22 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data, ...@@ -706,14 +717,22 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
struct drm_gem_object *obj; struct drm_gem_object *obj;
int ret = 0; int ret = 0;
if (args->pad) if (args->flags & ~MSM_INFO_FLAGS)
return -EINVAL; return -EINVAL;
obj = drm_gem_object_lookup(file, args->handle); obj = drm_gem_object_lookup(file, args->handle);
if (!obj) if (!obj)
return -ENOENT; return -ENOENT;
args->offset = msm_gem_mmap_offset(obj); if (args->flags & MSM_INFO_IOVA) {
uint64_t iova;
ret = msm_ioctl_gem_info_iova(dev, obj, &iova);
if (!ret)
args->offset = iova;
} else {
args->offset = msm_gem_mmap_offset(obj);
}
drm_gem_object_unreference_unlocked(obj); drm_gem_object_unreference_unlocked(obj);
......
...@@ -104,10 +104,14 @@ struct drm_msm_gem_new { ...@@ -104,10 +104,14 @@ struct drm_msm_gem_new {
__u32 handle; /* out */ __u32 handle; /* out */
}; };
#define MSM_INFO_IOVA 0x01
#define MSM_INFO_FLAGS (MSM_INFO_IOVA)
struct drm_msm_gem_info { struct drm_msm_gem_info {
__u32 handle; /* in */ __u32 handle; /* in */
__u32 pad; __u32 flags; /* in - combination of MSM_INFO_* flags */
__u64 offset; /* out, offset to pass to mmap() */ __u64 offset; /* out, mmap() offset or iova */
}; };
#define MSM_PREP_READ 0x01 #define MSM_PREP_READ 0x01
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment