aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-buffer.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-06-18 00:00:30 +0100
committerThomas White <taw@bitwiz.org.uk>2009-06-18 00:00:30 +0100
commit9f1ef16f2c739da94261ecb32a8ce96a62a94eac (patch)
treed2d8e4be55aa18ffd5803563a8ebc5768c80b569 /drivers/mfd/glamo/glamo-buffer.c
parentef859741e8baf985777015207041860cc42a2939 (diff)
More KMS plumbing
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.c54
1 files changed, 37 insertions, 17 deletions
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;
}