[kernel/f19] drm/qxl update qxl driver to v1.4
Dave Airlie
airlied at fedoraproject.org
Thu Apr 11 01:41:16 UTC 2013
commit 5af864752e9ec7acef126fdf34e05819fcde1b4d
Author: Dave Airlie <airlied at redhat.com>
Date: Wed Apr 10 21:40:27 2013 -0400
drm/qxl update qxl driver to v1.4
drm-qxl-driver.patch | 115 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 89 insertions(+), 26 deletions(-)
---
diff --git a/drm-qxl-driver.patch b/drm-qxl-driver.patch
index 6a6bf11..72341a8 100644
--- a/drm-qxl-driver.patch
+++ b/drm-qxl-driver.patch
@@ -1,7 +1,7 @@
-From 1a401a749cb1f06e637ef0e91fb8c120963aa356 Mon Sep 17 00:00:00 2001
+From bb57317d5f86a60fd5dd98b3f82241c47ae2cc5d Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied at gmail.com>
Date: Mon, 25 Feb 2013 14:47:55 +1000
-Subject: [PATCH 2/2] drm: add new QXL driver. (v1.3)
+Subject: [PATCH] drm: add new QXL driver. (v1.4)
QXL is a paravirtual graphics device used by the Spice virtual desktop
interface.
@@ -28,6 +28,7 @@ v1.1: fixup some issues in the ioctl interface with padding
v1.2: add module device table
v1.3: fix nomodeset, fbcon leak, dumb bo create, release ring irq,
don't try flush release ring (broken hw), fix -modesetting.
+v1.4: fbcon cpu usage reduction + suitable accel flags.
Signed-off-by: Alon Levy <alevy at redhat.com>
Signed-off-by: Dave Airlie <airlied at redhat.com>
@@ -40,14 +41,14 @@ Signed-off-by: Dave Airlie <airlied at redhat.com>
drivers/gpu/drm/qxl/qxl_debugfs.c | 135 ++++++
drivers/gpu/drm/qxl/qxl_dev.h | 879 ++++++++++++++++++++++++++++++++++
drivers/gpu/drm/qxl/qxl_display.c | 981 ++++++++++++++++++++++++++++++++++++++
- drivers/gpu/drm/qxl/qxl_draw.c | 384 +++++++++++++++
+ drivers/gpu/drm/qxl/qxl_draw.c | 390 +++++++++++++++
drivers/gpu/drm/qxl/qxl_drv.c | 145 ++++++
drivers/gpu/drm/qxl/qxl_drv.h | 566 ++++++++++++++++++++++
drivers/gpu/drm/qxl/qxl_dumb.c | 93 ++++
drivers/gpu/drm/qxl/qxl_fb.c | 567 ++++++++++++++++++++++
drivers/gpu/drm/qxl/qxl_fence.c | 97 ++++
drivers/gpu/drm/qxl/qxl_gem.c | 178 +++++++
- drivers/gpu/drm/qxl/qxl_image.c | 120 +++++
+ drivers/gpu/drm/qxl/qxl_image.c | 176 +++++++
drivers/gpu/drm/qxl/qxl_ioctl.c | 411 ++++++++++++++++
drivers/gpu/drm/qxl/qxl_irq.c | 97 ++++
drivers/gpu/drm/qxl/qxl_kms.c | 302 ++++++++++++
@@ -57,7 +58,7 @@ Signed-off-by: Dave Airlie <airlied at redhat.com>
drivers/gpu/drm/qxl/qxl_ttm.c | 577 ++++++++++++++++++++++
include/uapi/drm/Kbuild | 1 +
include/uapi/drm/qxl_drm.h | 152 ++++++
- 25 files changed, 7198 insertions(+)
+ 25 files changed, 7260 insertions(+)
create mode 100644 drivers/gpu/drm/qxl/Kconfig
create mode 100644 drivers/gpu/drm/qxl/Makefile
create mode 100644 drivers/gpu/drm/qxl/qxl_cmd.c
@@ -2860,10 +2861,10 @@ index 0000000..c80ddfe
+}
diff --git a/drivers/gpu/drm/qxl/qxl_draw.c b/drivers/gpu/drm/qxl/qxl_draw.c
new file mode 100644
-index 0000000..7d5396d2
+index 0000000..3c8c3db
--- /dev/null
+++ b/drivers/gpu/drm/qxl/qxl_draw.c
-@@ -0,0 +1,384 @@
+@@ -0,0 +1,390 @@
+/*
+ * Copyright 2011 Red Hat, Inc.
+ *
@@ -3029,17 +3030,23 @@ index 0000000..7d5396d2
+ ret = qxl_image_create(qdev, release, &image_bo,
+ (const uint8_t *)src, 0, 0,
+ width, height, depth, stride);
-+ QXL_INFO(qdev, "image_bo offset %llx\n",
-+ image_bo->tbo.addr_space_offset - DRM_FILE_OFFSET);
++ if (ret) {
++ qxl_release_unreserve(qdev, release);
++ qxl_release_free(qdev, release);
++ return;
++ }
++
+ if (depth == 1) {
+ struct qxl_bo *palette_bo;
-+
++ void *ptr;
+ ret = qxl_palette_create_1bit(&palette_bo, qxl_fb_image);
+ qxl_release_add_res(qdev, release, palette_bo);
-+ ret = qxl_bo_kmap(image_bo, (void **)&image);
++
++ ptr = qxl_bo_kmap_atomic_page(qdev, image_bo, 0);
++ image = ptr;
+ image->u.bitmap.palette =
+ qxl_bo_physical_address(qdev, palette_bo, 0);
-+ qxl_bo_kunmap(image_bo);
++ qxl_bo_kunmap_atomic_page(qdev, image_bo, ptr);
+ qxl_bo_unreserve(palette_bo);
+ qxl_bo_unref(&palette_bo);
+ }
@@ -3134,7 +3141,7 @@ index 0000000..7d5396d2
+
+ ret = qxl_bo_kmap(bo, (void **)&surface_base);
+ if (ret)
-+ return;
++ goto out_unref;
+
+ ret = qxl_image_create(qdev, release, &image_bo, surface_base,
+ left, top, width, height, depth, stride);
@@ -4072,7 +4079,7 @@ index 0000000..847c4ee
+}
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
new file mode 100644
-index 0000000..0c5067d
+index 0000000..232b52b
--- /dev/null
+++ b/drivers/gpu/drm/qxl/qxl_fb.c
@@ -0,0 +1,567 @@
@@ -4493,7 +4500,7 @@ index 0000000..0c5067d
+
+ drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
+
-+ info->flags = FBINFO_DEFAULT;
++ info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
+ info->fbops = &qxlfb_ops;
+
+ /*
@@ -4932,10 +4939,10 @@ index 0000000..adc1ee2
+}
diff --git a/drivers/gpu/drm/qxl/qxl_image.c b/drivers/gpu/drm/qxl/qxl_image.c
new file mode 100644
-index 0000000..7fc7204
+index 0000000..cf85620
--- /dev/null
+++ b/drivers/gpu/drm/qxl/qxl_image.c
-@@ -0,0 +1,120 @@
+@@ -0,0 +1,176 @@
+/*
+ * Copyright 2013 Red Hat Inc.
+ *
@@ -4983,6 +4990,7 @@ index 0000000..7fc7204
+ int linesize = width * depth / 8;
+ struct qxl_bo *chunk_bo;
+ int ret;
++ void *ptr;
+ /* Chunk */
+ /* FIXME: Check integer overflow */
+ /* TODO: variable number of chunks */
@@ -4991,23 +4999,77 @@ index 0000000..7fc7204
+ first) */
+ ret = qxl_alloc_bo_reserved(qdev, sizeof(*chunk) + height * chunk_stride,
+ &chunk_bo);
-+ ret = qxl_bo_kmap(chunk_bo, (void **)&chunk);
++
++ ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, 0);
++ chunk = ptr;
+ chunk->data_size = height * chunk_stride;
+ chunk->prev_chunk = 0;
+ chunk->next_chunk = 0;
++ qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr);
++
++ {
++ void *k_data, *i_data;
++ int remain;
++ int page;
++ int size;
++ if (stride == linesize && chunk_stride == stride) {
++ remain = linesize * height;
++ page = 0;
++ i_data = (void *)data;
++
++ while (remain > 0) {
++ ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page << PAGE_SHIFT);
++
++ if (page == 0) {
++ chunk = ptr;
++ k_data = chunk->data;
++ size = PAGE_SIZE - offsetof(struct qxl_data_chunk, data);
++ } else {
++ k_data = ptr;
++ size = PAGE_SIZE;
++ }
++ size = min(size, remain);
++
++ memcpy(k_data, i_data, size);
++
++ qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr);
++ i_data += size;
++ remain -= size;
++ page++;
++ }
++ } else {
++ unsigned page_base, page_offset, out_offset;
++ for (i = 0 ; i < height ; ++i) {
++ i_data = (void *)data + i * stride;
++ remain = linesize;
++ out_offset = offsetof(struct qxl_data_chunk, data) + i * chunk_stride;
++
++ while (remain > 0) {
++ page_base = out_offset & PAGE_MASK;
++ page_offset = offset_in_page(out_offset);
++
++ size = min((int)(PAGE_SIZE - page_offset), remain);
++
++ ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page_base);
++ k_data = ptr + page_offset;
++ memcpy(k_data, i_data, size);
++ qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr);
++ remain -= size;
++ i_data += size;
++ out_offset += size;
++ }
++ }
++ }
++ }
+
-+ if (stride == linesize && chunk_stride == stride)
-+ memcpy(chunk->data, data, linesize * height);
-+ else
-+ for (i = 0 ; i < height ; ++i)
-+ memcpy(chunk->data + i*chunk_stride, data + i*stride,
-+ linesize);
+
+ qxl_bo_kunmap(chunk_bo);
+
+ /* Image */
+ ret = qxl_alloc_bo_reserved(qdev, sizeof(*image), image_bo);
-+ qxl_bo_kmap(*image_bo, (void **)&image);
++
++ ptr = qxl_bo_kmap_atomic_page(qdev, *image_bo, 0);
++ image = ptr;
+
+ image->descriptor.id = 0;
+ image->descriptor.type = SPICE_IMAGE_TYPE_BITMAP;
@@ -5041,7 +5103,8 @@ index 0000000..7fc7204
+ qxl_bo_unreserve(chunk_bo);
+ qxl_bo_unref(&chunk_bo);
+
-+ qxl_bo_kunmap(*image_bo);
++ qxl_bo_kunmap_atomic_page(qdev, *image_bo, ptr);
++
+ return 0;
+}
+
More information about the scm-commits
mailing list