diff options
author | Alan Cox <alan@linux.intel.com> | 2011-07-15 17:32:38 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-07-15 19:05:06 +0200 |
commit | 7dfe43c52d2cd595964c38281499c5361a0a8e85 (patch) | |
tree | 30daa55b964f37e15bdd68531c81ad1e1e164f25 | |
parent | bd7b9f91ddc2d08381a853bd33b3ce7d0012b1df (diff) | |
download | op-kernel-dev-7dfe43c52d2cd595964c38281499c5361a0a8e85.zip op-kernel-dev-7dfe43c52d2cd595964c38281499c5361a0a8e85.tar.gz |
gma500: add an mmap ioctl
This does the same as the dumb mmap but we want them separated in the ABI
in case a future extension to the dumb interface means we can't treat them
the same way.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/gma500/gem.c | 8 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_drm.h | 12 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_drv.c | 8 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_drv.h | 2 |
4 files changed, 29 insertions, 1 deletions
diff --git a/drivers/staging/gma500/gem.c b/drivers/staging/gma500/gem.c index 68ecd5f..d7b74b6 100644 --- a/drivers/staging/gma500/gem.c +++ b/drivers/staging/gma500/gem.c @@ -261,3 +261,11 @@ int psb_gem_create_ioctl(struct drm_device *dev, void *data, return psb_gem_create(file, dev, args->size, &args->handle); } +int psb_gem_mmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct drm_psb_gem_mmap *args = data; + return dev->driver->dumb_map_offset(file, dev, + args->handle, &args->offset); +} + diff --git a/drivers/staging/gma500/psb_drm.h b/drivers/staging/gma500/psb_drm.h index eef53f3..70115a9 100644 --- a/drivers/staging/gma500/psb_drm.h +++ b/drivers/staging/gma500/psb_drm.h @@ -162,6 +162,7 @@ struct drm_psb_register_rw_arg { #define DRM_PSB_GEM_CREATE 0x10 #define DRM_PSB_2D_OP 0x11 +#define DRM_PSB_GEM_MMAP 0x12 #define DRM_PSB_DPST 0x1B #define DRM_PSB_GAMMA 0x1C #define DRM_PSB_DPST_BL 0x1D @@ -203,4 +204,15 @@ struct drm_psb_2d_op { __u32 cmd[PSB_2D_OP_BUFLEN]; }; +struct drm_psb_gem_mmap { + __u32 handle; + __u32 pad; + /** + * Fake offset to use for subsequent mmap call + * + * This is a fixed-size type for 32/64 compatibility. + */ + __u64 offset; +}; + #endif diff --git a/drivers/staging/gma500/psb_drv.c b/drivers/staging/gma500/psb_drv.c index 36bb716..b8b9864 100644 --- a/drivers/staging/gma500/psb_drv.c +++ b/drivers/staging/gma500/psb_drv.c @@ -127,6 +127,9 @@ MODULE_DEVICE_TABLE(pci, pciidlist); #define DRM_IOCTL_PSB_2D_OP \ DRM_IOW(DRM_PSB_2D_OP + DRM_COMMAND_BASE, \ struct drm_psb_2d_op) +#define DRM_IOCTL_PSB_GEM_MMAP \ + DRM_IOWR(DRM_PSB_GEM_MMAP + DRM_COMMAND_BASE, \ + struct drm_psb_gem_mmap) static int psb_sizes_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); @@ -167,7 +170,10 @@ static struct drm_ioctl_desc psb_ioctls[] = { psb_intel_get_pipe_from_crtc_id, 0), PSB_IOCTL_DEF(DRM_IOCTL_PSB_GEM_CREATE, psb_gem_create_ioctl, DRM_UNLOCKED | DRM_AUTH), - PSB_IOCTL_DEF(DRM_IOCTL_PSB_2D_OP, psb_accel_ioctl, DRM_UNLOCKED), + PSB_IOCTL_DEF(DRM_IOCTL_PSB_2D_OP, psb_accel_ioctl, + DRM_UNLOCKED| DRM_AUTH), + PSB_IOCTL_DEF(DRM_IOCTL_PSB_GEM_MMAP, psb_gem_mmap_ioctl, + DRM_UNLOCKED | DRM_AUTH), }; static void psb_lastclose(struct drm_device *dev) diff --git a/drivers/staging/gma500/psb_drv.h b/drivers/staging/gma500/psb_drv.h index db3e356..daf3ca5 100644 --- a/drivers/staging/gma500/psb_drv.h +++ b/drivers/staging/gma500/psb_drv.h @@ -799,6 +799,8 @@ extern int psb_gem_dumb_map_gtt(struct drm_file *file, struct drm_device *dev, extern int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); extern int psb_gem_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file); +extern int psb_gem_mmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file); /* psb_device.c */ extern const struct psb_ops psb_chip_ops; |