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.
Unified · Split
| @@ -699,6 +699,17 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data, · 698 unmodified lines | |||
| 699 | return ret; | 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 | static int msm_ioctl_gem_info(struct drm_device *dev, void *data, | 713 | static int msm_ioctl_gem_info(struct drm_device *dev, void *data, |
| 703 | struct drm_file *file) | 714 | struct drm_file *file) |
| 704 | { | 715 | { |
| @@ -706,14 +717,22 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data, · 1 unmodified line | |||
| 706 | struct drm_gem_object *obj; | 717 | struct drm_gem_object *obj; |
| 707 | int ret = 0; | 718 | int ret = 0; |
| 708 | 719 | ||
| 709 | if (args->pad) | 720 | if (args->flags & ~MSM_INFO_FLAGS) |
| 710 | return -EINVAL; | 721 | return -EINVAL; |
| 711 | 722 | ||
| 712 | obj = drm_gem_object_lookup(file, args->handle); | 723 | obj = drm_gem_object_lookup(file, args->handle); |
| 713 | if (!obj) | 724 | if (!obj) |
| 714 | return -ENOENT; | 725 | return -ENOENT; |
| 715 | 726 | ||
| 716 | args->offset = msm_gem_mmap_offset(obj); | 727 | if (args->flags & MSM_INFO_IOVA) { |
| 728 | uint64_t iova; | ||
| 729 | |||
| 730 | ret = msm_ioctl_gem_info_iova(dev, obj, &iova); | ||
| 731 | if (!ret) | ||
| 732 | args->offset = iova; | ||
| 733 | } else { | ||
| 734 | args->offset = msm_gem_mmap_offset(obj); | ||
| 735 | } | ||
| 717 | 736 | ||
| 718 | drm_gem_object_unreference_unlocked(obj); | 737 | drm_gem_object_unreference_unlocked(obj); |
| 719 | 738 | ||
| @@ -104,10 +104,14 @@ struct drm_msm_gem_new { · 103 unmodified lines | |||
| 104 | __u32 handle; /* out */ | 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 | struct drm_msm_gem_info { | 111 | struct drm_msm_gem_info { |
| 108 | __u32 handle; /* in */ | 112 | __u32 handle; /* in */ |
| 109 | __u32 pad; | 113 | __u32 flags; /* in - combination of MSM_INFO_* flags */ |
| 110 | __u64 offset; /* out, offset to pass to mmap() */ | 114 | __u64 offset; /* out, mmap() offset or iova */ |
| 111 | }; | 115 | }; |
| 112 | 116 | ||
| 113 | #define MSM_PREP_READ 0x01 | 117 | #define MSM_PREP_READ 0x01 |