aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-buffer.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-05-22 10:32:08 +0100
committerThomas White <taw@bitwiz.org.uk>2009-05-22 10:32:08 +0100
commit799dc0363fc2c4c98f18dbd9abf39c20811618d9 (patch)
treeb2390bef28ac888db92fde4348c3bc71a26df9ed /drivers/mfd/glamo/glamo-buffer.c
parente8950ddf2823a4b2698870b057409fd98abb3aae (diff)
Implement glamo_ioctl_gem_mmap
This implements the ioctl used for mapping GEM objects into memory. This needs a unit test in glamo-dri-tests, but for the time being appears to make X.org less segfaulty. Signed-off-by: Thomas White <taw@bitwiz.org.uk>
Diffstat (limited to 'drivers/mfd/glamo/glamo-buffer.c')
-rw-r--r--drivers/mfd/glamo/glamo-buffer.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c
index a1da63f6e9b..945824a1b15 100644
--- a/drivers/mfd/glamo/glamo-buffer.c
+++ b/drivers/mfd/glamo/glamo-buffer.c
@@ -85,7 +85,30 @@ fail:
int glamo_ioctl_gem_mmap(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
- printk(KERN_INFO "glamo_ioctl_gem_mmap\n");
+ struct drm_glamo_gem_mmap *args = data;
+ struct drm_gem_object *obj;
+ loff_t offset;
+ unsigned long addr;
+
+ obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+ if (obj == NULL)
+ return -EBADF;
+
+ offset = args->offset;
+
+ down_write(&current->mm->mmap_sem);
+ addr = do_mmap(obj->filp, 0, args->size,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ args->offset);
+ up_write(&current->mm->mmap_sem);
+ mutex_lock(&dev->struct_mutex);
+ drm_gem_object_unreference(obj);
+ mutex_unlock(&dev->struct_mutex);
+ if (IS_ERR((void *)addr))
+ return addr;
+
+ args->addr_ptr = (uint64_t) addr;
+
return 0;
}