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>
This commit is contained in:
Родитель
e895c7bd31
Коммит
49fd08baa3
|
@ -699,6 +699,17 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
|
|||
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,
|
||||
struct drm_file *file)
|
||||
{
|
||||
|
@ -706,14 +717,22 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
|
|||
struct drm_gem_object *obj;
|
||||
int ret = 0;
|
||||
|
||||
if (args->pad)
|
||||
if (args->flags & ~MSM_INFO_FLAGS)
|
||||
return -EINVAL;
|
||||
|
||||
obj = drm_gem_object_lookup(file, args->handle);
|
||||
if (!obj)
|
||||
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);
|
||||
|
||||
|
|
|
@ -104,10 +104,14 @@ struct drm_msm_gem_new {
|
|||
__u32 handle; /* out */
|
||||
};
|
||||
|
||||
#define MSM_INFO_IOVA 0x01
|
||||
|
||||
#define MSM_INFO_FLAGS (MSM_INFO_IOVA)
|
||||
|
||||
struct drm_msm_gem_info {
|
||||
__u32 handle; /* in */
|
||||
__u32 pad;
|
||||
__u64 offset; /* out, offset to pass to mmap() */
|
||||
__u32 flags; /* in - combination of MSM_INFO_* flags */
|
||||
__u64 offset; /* out, mmap() offset or iova */
|
||||
};
|
||||
|
||||
#define MSM_PREP_READ 0x01
|
||||
|
|
Загрузка…
Ссылка в новой задаче