From 9f1ef16f2c739da94261ecb32a8ce96a62a94eac Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 18 Jun 2009 00:00:30 +0100 Subject: More KMS plumbing Signed-off-by: Thomas White --- drivers/mfd/glamo/glamo-buffer.c | 54 +++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 17 deletions(-) (limited to 'drivers/mfd/glamo/glamo-buffer.c') diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c index 945824a1b15..9f19c454477 100644 --- a/drivers/mfd/glamo/glamo-buffer.c +++ b/drivers/mfd/glamo/glamo-buffer.c @@ -27,49 +27,70 @@ #include "glamo-drm-private.h" -int glamo_ioctl_gem_create(struct drm_device *dev, void *data, - struct drm_file *file_priv) +struct drm_gem_object *glamo_gem_object_alloc(struct drm_device *dev, int size, + int alignment) { - struct drm_glamo_gem_create *args = data; struct drm_gem_object *obj; struct glamodrm_handle *gdrm; struct drm_glamo_gem_object *gobj; - int handle, ret; gdrm = dev->dev_private; - args->size = roundup(args->size, PAGE_SIZE); + size = roundup(size, PAGE_SIZE); - obj = drm_gem_object_alloc(dev, args->size); - if (obj == NULL) return -ENOMEM; + obj = drm_gem_object_alloc(dev, size); + if (obj == NULL) return NULL; gobj = obj->driver_private; /* Allocate memory for this object in VRAM */ - gobj->block = drm_mm_search_free(gdrm->mmgr, args->size, - args->alignment, 1); + gobj->block = drm_mm_search_free(gdrm->mmgr, size, alignment, 1); if (!gobj->block) { - ret = -ENOMEM; goto fail; } - gobj->block = drm_mm_get_block(gobj->block, args->size, - args->alignment); + gobj->block = drm_mm_get_block(gobj->block, size, alignment); if (!gobj->block) { - ret = -ENOMEM; goto fail; } + return obj; + +fail: + mutex_lock(&dev->struct_mutex); + drm_gem_object_unreference(obj); + mutex_unlock(&dev->struct_mutex); + printk(KERN_INFO "[glamo-drm] Failed to allocate object\n"); + + return NULL; +} + + +int glamo_ioctl_gem_create(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + struct drm_glamo_gem_create *args = data; + struct drm_gem_object *obj; + struct drm_glamo_gem_object *gobj; + int handle, ret; + + /* Create an object */ + obj = glamo_gem_object_alloc(dev, args->size, args->alignment); + if ( obj == NULL ) return -ENOMEM; + + /* Create a handle for it */ ret = drm_gem_handle_create(file_priv, obj, &handle); mutex_lock(&dev->struct_mutex); drm_gem_object_handle_unreference(obj); mutex_unlock(&dev->struct_mutex); - if (ret) goto fail; - + + /* Watchpoint */ + gobj = obj->driver_private; printk(KERN_INFO "[glamo-drm] GEM object %i: %li bytes at 0x%lx\n", handle, gobj->block->size, gobj->block->start); + + /* Return */ args->handle = handle; - return 0; fail: @@ -77,7 +98,6 @@ fail: drm_gem_object_unreference(obj); mutex_unlock(&dev->struct_mutex); printk(KERN_INFO "[glamo-drm] Failed to allocate object\n"); - return ret; } -- cgit v1.2.3