[PATCH 03/11] drm/msm: Add hint to DRM_IOCTL_MSM_GEM_INFO to return an object IOVA
Rob Clark
robdclark at gmail.com
Mon Feb 6 19:57:50 UTC 2017
On Mon, Feb 6, 2017 at 2:20 PM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> Hi Jordan,
>
> On 6 February 2017 at 17:39, Jordan Crouse <jcrouse at codeaurora.org> wrote:
>> Modify the 'pad' member of struct drm_msm_gem_info to 'hint'. If the
>> user sets 'hint' 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 at codeaurora.org>
>> ---
>> drivers/gpu/drm/msm/msm_drv.c | 29 +++++++++++++++++++++++++----
>> include/uapi/drm/msm_drm.h | 4 ++--
>> 2 files changed, 27 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
>> index e29bb66..1e4e022 100644
>> --- a/drivers/gpu/drm/msm/msm_drv.c
>> +++ b/drivers/gpu/drm/msm/msm_drv.c
>> @@ -677,6 +677,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;
>> +
> Not too familiar with msm so perhaps a silly question: how can we trigger this ?
if gpu has not loaded (for example, missing firmware, or kernel does
not have iommu, etc)
>> + return msm_gem_get_iova(obj, priv->gpu->aspace, iova);
>> +}
>> +
>> static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
>> struct drm_file *file)
>> {
>> @@ -684,14 +695,24 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
>> struct drm_gem_object *obj;
>> int ret = 0;
>>
>> - if (args->pad)
>> - return -EINVAL;
>> -
> Please keep the input validation before doing any work (the lookup below).
+1 for making this args->flags and checking against
GEM_INFO_VALID_FLAGS up front. We may want to use some of those other
bits some day
>> obj = drm_gem_object_lookup(file, args->handle);
>> if (!obj)
>> return -ENOENT;
>>
>> - args->offset = msm_gem_mmap_offset(obj);
>> + /*
>> + * If the hint variable is set, it means that the user wants a IOVA for
>> + * this buffer. Return the address from the GPU because that is
>> + * probably what it is looking for
>> + */
>> + if (args->hint) {
> One could also rename hint to flags. Regardless of the name you can
> use hint/flags as a bitmask.
>
>> + 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);
>>
>> diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h
>> index 4d5d6a2..045ad20 100644
>> --- a/include/uapi/drm/msm_drm.h
>> +++ b/include/uapi/drm/msm_drm.h
>> @@ -105,8 +105,8 @@ struct drm_msm_gem_new {
>>
>> struct drm_msm_gem_info {
>> __u32 handle; /* in */
>> - __u32 pad;
>> - __u64 offset; /* out, offset to pass to mmap() */
>> + __u32 hint; /* in */
> Please add explicit #define for the currently valid hints/flags.
>
>> + __u64 offset; /* out, mmap() offset if hint is 0, iova if 1 */
> Other drivers have used anonymous unions to improve the naming, in
> such situations.
>
> struct drm_msm_gem_info {
> __u32 handle; /* in */
> __u32 hint; /* in */
> union { /* out */
> __u64 offset; /* offset if hint is FOO */
> __u64 iova; /* iova if hint is BAR */
> };
> };
is anon union legit for uabi? I was under the impression that for
some reason it was not. But I could be wrong.
BR,
-R
>
> Thanks
> Emil
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list