diff options
author | Thomas White <taw@bitwiz.org.uk> | 2009-07-15 12:02:49 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-07-15 12:02:49 +0100 |
commit | 7903aad4738b38f48fb8800782b186be8dfaa024 (patch) | |
tree | a8b20157c57c9dc35f049725d38fb2ca645c816a /drivers/mfd/glamo/glamo-buffer.c | |
parent | d1bb1b43b8db0926715d4bb1bbd9abcb88a4c5ee (diff) | |
parent | 5b85050a8f1e7db530f803627ba6371ca9c0ba9b (diff) |
Merge branch 'drm-kms' into drm-tracking
Conflicts:
drivers/mfd/glamo/glamo-cmdq.c
drivers/mfd/glamo/glamo-cmdq.h
drivers/mfd/glamo/glamo-drm-drv.c
drivers/mfd/glamo/glamo-drm-private.h
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.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c index 945824a1b15..c8172cce503 100644 --- a/drivers/mfd/glamo/glamo-buffer.c +++ b/drivers/mfd/glamo/glamo-buffer.c @@ -27,49 +27,71 @@ #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; + /* See glamodrm_gem_init_object() below */ 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 +99,6 @@ fail: drm_gem_object_unreference(obj); mutex_unlock(&dev->struct_mutex); printk(KERN_INFO "[glamo-drm] Failed to allocate object\n"); - return ret; } |