drm/qxl update qxl driver to v1.4

This commit is contained in:
Dave Airlie 2013-04-10 21:40:27 -04:00
parent f846a2a17e
commit 5af864752e
1 changed files with 89 additions and 26 deletions

View File

@ -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@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@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
@ -40,14 +41,14 @@ Signed-off-by: Dave Airlie <airlied@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@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;
+}
+