[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