On Thu, Jan 29, 2015 at 2:18 PM, Sean Paul <seanpaul@xxxxxxxxxxxx> 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@xxxxxxxxxxxx> Reviewed-by: Rob Clark <robdclark@xxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel