[PATCH v2] drm/tegra: Add tegra_gem_mmap2 to fix 64-bit offsets

Rob Clark robdclark at gmail.com
Thu Jan 29 12:11:50 PST 2015


On Thu, Jan 29, 2015 at 2:18 PM, Sean Paul <seanpaul at chromium.org> wrote:
> On 64-bit targets, tegra_gem_mmap doesn't return the
> offset to userspace. As such, subsequent calls to mmap(2)
> fail. Add a new tegra_gem_mmap2 ioctl to fix this.
>
> Signed-off-by: Sean Paul <seanpaul at chromium.org>

Reviewed-by: Rob Clark <robdclark at gmail.com>


> ---
>  drivers/gpu/drm/tegra/drm.c  | 21 +++++++++++++++++++++
>  include/uapi/drm/tegra_drm.h |  9 +++++++++
>  2 files changed, 30 insertions(+)
>
> diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
> index d4f8275..be5dbe7 100644
> --- a/drivers/gpu/drm/tegra/drm.c
> +++ b/drivers/gpu/drm/tegra/drm.c
> @@ -343,6 +343,26 @@ static int tegra_gem_create(struct drm_device *drm, void *data,
>         return 0;
>  }
>
> +static int tegra_gem_mmap2(struct drm_device *drm, void *data,
> +                         struct drm_file *file)
> +{
> +       struct drm_tegra_gem_mmap2 *args = data;
> +       struct drm_gem_object *gem;
> +       struct tegra_bo *bo;
> +
> +       gem = drm_gem_object_lookup(drm, file, args->handle);
> +       if (!gem)
> +               return -EINVAL;
> +
> +       bo = to_tegra_bo(gem);
> +
> +       args->offset = drm_vma_node_offset_addr(&bo->gem.vma_node);
> +
> +       drm_gem_object_unreference(gem);
> +
> +       return 0;
> +}
> +
>  static int tegra_gem_mmap(struct drm_device *drm, void *data,
>                           struct drm_file *file)
>  {
> @@ -677,6 +697,7 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
>         DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED),
>         DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_FLAGS, tegra_gem_set_flags, DRM_UNLOCKED),
>         DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_FLAGS, tegra_gem_get_flags, DRM_UNLOCKED),
> +       DRM_IOCTL_DEF_DRV(TEGRA_GEM_MMAP2, tegra_gem_mmap2, DRM_UNLOCKED),
>  #endif
>  };
>
> diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h
> index c15d781..9057b0f 100644
> --- a/include/uapi/drm/tegra_drm.h
> +++ b/include/uapi/drm/tegra_drm.h
> @@ -167,6 +167,13 @@ struct drm_tegra_gem_get_flags {
>         __u32 flags;
>  };
>
> +struct drm_tegra_gem_mmap2 {
> +       __u32 handle;
> +       __u32 pad;
> +       __u64 offset;
> +};
> +
> +
>  #define DRM_TEGRA_GEM_CREATE           0x00
>  #define DRM_TEGRA_GEM_MMAP             0x01
>  #define DRM_TEGRA_SYNCPT_READ          0x02
> @@ -181,6 +188,7 @@ struct drm_tegra_gem_get_flags {
>  #define DRM_TEGRA_GEM_GET_TILING       0x0b
>  #define DRM_TEGRA_GEM_SET_FLAGS                0x0c
>  #define DRM_TEGRA_GEM_GET_FLAGS                0x0d
> +#define DRM_TEGRA_GEM_MMAP2            0x0e
>
>  #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
>  #define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
> @@ -196,5 +204,6 @@ struct drm_tegra_gem_get_flags {
>  #define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
>  #define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
>  #define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
> +#define DRM_IOCTL_TEGRA_GEM_MMAP2 DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP2, struct drm_tegra_gem_mmap2)
>
>  #endif
> --
> 2.2.0.rc0.207.ga3a616c
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list