aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/glamo/glamo-buffer.c')
-rw-r--r--drivers/mfd/glamo/glamo-buffer.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c
index 945824a1b15..ecf9cefc74c 100644
--- a/drivers/mfd/glamo/glamo-buffer.c
+++ b/drivers/mfd/glamo/glamo-buffer.c
@@ -27,6 +27,54 @@
#include "glamo-drm-private.h"
+int glamo_ioctl_gem_info(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ struct drm_glamo_gem_info *args = data;
+ struct glamodrm_handle *gdrm;
+ int ret;
+
+ gdrm = dev->dev_private;
+
+ /* Have we decided on a name for the front buffer yet? */
+ if ( gdrm->front_buffer_handle ) {
+ args->front_buffer_handle = gdrm->front_buffer_handle;
+ } else {
+
+ /* "Baptise" the front buffer */
+ struct drm_gem_object *obj;
+ struct drm_glamo_gem_object *gobj;
+ uint32_t handle;
+
+ /* We don't really care about this object - it's only being
+ * created so we can generate a handle to refer to the front
+ * buffer which X can use for the screen pixmap. */
+ obj = drm_gem_object_alloc(dev, PAGE_SIZE);
+ if (obj == NULL) return -ENOMEM;
+
+ gobj = obj->driver_private;
+
+ 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) return ret;
+
+ /* The handle is specific to this context */
+ printk(KERN_INFO "[glamo-drm] Front buffer handle: %i\n",
+ handle);
+
+ args->front_buffer_handle = handle;
+ gdrm->front_buffer_handle = handle;
+
+ }
+
+ args->vram_size = gdrm->vram_size;
+
+ return 0;
+}
+
+
int glamo_ioctl_gem_create(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
@@ -34,7 +82,7 @@ int glamo_ioctl_gem_create(struct drm_device *dev, void *data,
struct drm_gem_object *obj;
struct glamodrm_handle *gdrm;
struct drm_glamo_gem_object *gobj;
- int handle, ret;
+ uint32_t handle, ret;
gdrm = dev->dev_private;
@@ -185,6 +233,7 @@ int glamo_buffer_init(struct glamodrm_handle *gdrm)
{
gdrm->mmgr = drm_calloc(1, sizeof(struct drm_mm), DRM_MEM_DRIVER);
drm_mm_init(gdrm->mmgr, 0, gdrm->vram_size);
+ gdrm->front_buffer_handle = 0;
return 0;
}