summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/qxl/qxl_dumb.c
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-09-09 10:49:55 +0300
committerAlon Levy <alevy@redhat.com>2012-09-13 12:42:16 +0300
commit3235e901578ff1bf89fc2b33e1aeca589dab3e74 (patch)
tree028f819a90364150bf5add191f7ef7424439c37b /drivers/gpu/drm/qxl/qxl_dumb.c
parent24299c351217a5d3e52045e43f8003074a9b424f (diff)
drivers/gpu/qxl: add new driverqxl.v7
QXL is a paravirtual graphics device used by the Spice virtual desktop interface. This version is not meant for kernel inclusion as many TODOs remain, performance is sub par due to whole page allocation on the pci bar, and missing off screen surfaces support. It works with the modesetting X driver, and with an updated qxl X driver. Signed-off-by: Alon Levy <alevy@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_dumb.c')
-rw-r--r--drivers/gpu/drm/qxl/qxl_dumb.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c
new file mode 100644
index 00000000000..668611581ff
--- /dev/null
+++ b/drivers/gpu/drm/qxl/qxl_dumb.c
@@ -0,0 +1,61 @@
+#include "qxl_drv.h"
+#include "qxl_object.h"
+
+/* dumb ioctls implementation */
+
+int qxl_mode_dumb_create(struct drm_file *file_priv,
+ struct drm_device *dev,
+ struct drm_mode_create_dumb *args)
+{
+ struct qxl_device *qdev = dev->dev_private;
+ struct qxl_bo *qobj;
+ uint32_t handle;
+ int r;
+
+ args->pitch = args->width * ((args->bpp + 1) / 8);
+ args->size = args->pitch * args->height;
+ args->size = ALIGN(args->size, PAGE_SIZE);
+
+ r = qxl_gem_object_create_with_handle(qdev, file_priv,
+ QXL_GEM_DOMAIN_VRAM,
+ args->size, &qobj,
+ &handle);
+ DRM_INFO("%s: width %d, height %d, bpp %d, pitch %d, size %lld, %s\n",
+ __func__, args->width, args->height, args->bpp,
+ args->pitch, args->size, r ? "failed" : "success");
+ if (r)
+ return r;
+ args->handle = handle;
+ DRM_INFO("%s: kptr %p\n", __func__, qobj->kptr);
+ return 0;
+}
+
+int qxl_mode_dumb_destroy(struct drm_file *file_priv,
+ struct drm_device *dev,
+ uint32_t handle)
+{
+ return drm_gem_handle_delete(file_priv, handle);
+}
+
+int qxl_mode_dumb_mmap(struct drm_file *file_priv,
+ struct drm_device *dev,
+ uint32_t handle, uint64_t *offset_p)
+{
+ struct drm_gem_object *gobj;
+ struct qxl_bo *qobj;
+
+ BUG_ON(!offset_p);
+ gobj = drm_gem_object_lookup(dev, file_priv, handle);
+ DRM_INFO("%s: %d, %s\n", __func__, handle, gobj ? "success" : "failed");
+ if (gobj == NULL)
+ return -ENOENT;
+ qobj = gem_to_qxl_bo(gobj);
+ *offset_p = qxl_bo_mmap_offset(qobj);
+ DRM_INFO("%s: %p, %lld| %lld, %ld, %ld\n", __func__, gobj, *offset_p,
+ qobj->tbo.addr_space_offset,
+ qobj->tbo.vm_node ?
+ qobj->tbo.vm_node->start : -1,
+ qobj->tbo.num_pages);
+ drm_gem_object_unreference_unlocked(gobj);
+ return 0;
+}