diff options
author | Alon Levy <alevy@redhat.com> | 2012-09-09 10:49:55 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2012-09-13 12:42:16 +0300 |
commit | 3235e901578ff1bf89fc2b33e1aeca589dab3e74 (patch) | |
tree | 028f819a90364150bf5add191f7ef7424439c37b /drivers/gpu/drm/qxl/qxl_dumb.c | |
parent | 24299c351217a5d3e52045e43f8003074a9b424f (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.c | 61 |
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; +} |