xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/3] tools:libxl: Add qxl vga interface support v2
@ 2012-06-05 11:22 ZhouPeng
  2012-06-06 13:05 ` Ian Campbell
  0 siblings, 1 reply; 18+ messages in thread
From: ZhouPeng @ 2012-06-05 11:22 UTC (permalink / raw)
  To: Ian Campbell; +Cc: Xen-Devel (E-mail), ian.jackson, Stefano Stabellini

[-- Attachment #1: Type: text/plain, Size: 5740 bytes --]

changeset:   25454:1804a873a64d
tag:         tip
user:        Zhou Peng <ailvpeng25@gmail.com>
date:        Tue Jun 05 17:56:46 2012 +0800
files:       tools/libxl/libxl_create.c tools/libxl/libxl_dm.c
tools/libxl/libxl_types.idl tools/libxl/xl_cmdimpl.c
description:
tools:libxl: Add qxl vga interface support.

Usage:
 qxl=1
 qxlvram=64
 qxlram=64

Signed-off-by: Zhou Peng <ailvpeng25@gmail.com>


diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_create.c	Tue Jun 05 17:56:46 2012 +0800
@@ -23,6 +23,32 @@
 #include <xc_dom.h>
 #include <xenguest.h>

+/*
+ * For qxl vga interface, the total video mem is determined by
+ * RAM bar and VRAM bar. But it is not simply linearly determined,
+ * get_qxl_ram_size below gives the details.
+ */
+static inline uint32_t msb_mask(uint32_t val)
+{
+    uint32_t mask;
+
+    do {
+        mask = ~(val - 1) & val;
+        val &= ~mask;
+    } while (mask < val);
+
+    return mask;
+}
+
+static inline uint32_t get_qxl_ram_size(uint32_t vram_sizekb,
+                                    uint32_t ram_sizekb)
+{
+    uint32_t vram = msb_mask(2 * vram_sizekb * 1024 - 1);
+    uint32_t ram = msb_mask(2 * ram_sizekb * 1024 - 1);
+
+    return (vram + ram + 1023) / 1024;
+}
+
 void libxl_domain_config_init(libxl_domain_config *d_config)
 {
     memset(d_config, 0, sizeof(*d_config));
@@ -195,6 +221,25 @@ int libxl__domain_build_info_setdefault(

         if (b_info->u.hvm.vga.type == LIBXL_VGA_INTERFACE_TYPE_DEFAULT)
             b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
+        if (b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN
+            && b_info->u.hvm.vga.type == LIBXL_VGA_INTERFACE_TYPE_QXL) {
+            if (b_info->u.hvm.vga.vramkb == LIBXL_MEMKB_DEFAULT)
+                b_info->u.hvm.vga.vramkb = 64 * 1024;
+            if (b_info->u.hvm.vga.ramkb == LIBXL_MEMKB_DEFAULT)
+                b_info->u.hvm.vga.ramkb = 64 * 1024;
+            uint32_t qxl_ram = get_qxl_ram_size(b_info->u.hvm.vga.vramkb,
+                                                b_info->u.hvm.vga.ramkb);
+            /*
+             * video_memkb is the real size of video memory to assign.
+             * If video_memkb can't meet the need of qxl, adjust it
+             * accordingly.
+             */
+            if ((b_info->video_memkb == LIBXL_MEMKB_DEFAULT)
+                || (b_info->video_memkb < qxl_ram)) {
+                b_info->video_memkb = qxl_ram;
+            }
+        }
+
         libxl_defbool_setdefault(&b_info->u.hvm.vnc.enable, true);
         if (libxl_defbool_val(b_info->u.hvm.vnc.enable)) {
             libxl_defbool_setdefault(&b_info->u.hvm.vnc.findunused, true);
diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_dm.c	Tue Jun 05 17:56:46 2012 +0800
@@ -181,6 +181,8 @@ static char ** libxl__build_device_model
             flexarray_append(dm_args, "-std-vga");
             break;
         case LIBXL_VGA_INTERFACE_TYPE_CIRRUS:
+            break;
+        case LIBXL_VGA_INTERFACE_TYPE_QXL:
             break;
         }

@@ -429,6 +431,17 @@ static char ** libxl__build_device_model
             break;
         case LIBXL_VGA_INTERFACE_TYPE_CIRRUS:
             flexarray_vappend(dm_args, "-vga", "cirrus", NULL);
+            break;
+        case LIBXL_VGA_INTERFACE_TYPE_QXL:
+            flexarray_vappend(dm_args, "-vga", "qxl", NULL);
+            flexarray_vappend(dm_args, "-global",
+                              GCSPRINTF("qxl-vga.vram_size=%lu",
+                                        b_info->u.hvm.vga.vramkb * 1024),
+                              NULL);
+            flexarray_vappend(dm_args, "-global",
+                              GCSPRINTF("qxl-vga.ram_size=%lu",
+                                        b_info->u.hvm.vga.ramkb * 1024),
+                              NULL);
             break;
         }

diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_types.idl	Tue Jun 05 17:56:46 2012 +0800
@@ -128,6 +128,7 @@ libxl_vga_interface_type = Enumeration("
 libxl_vga_interface_type = Enumeration("vga_interface_type", [
     (0, "CIRRUS"),
     (1, "STD"),
+    (2, "QXL"),
     ], init_val = "LIBXL_VGA_INTERFACE_TYPE_DEFAULT")

 #
@@ -136,6 +137,10 @@ libxl_vga_interface_type = Enumeration("

 libxl_vga_interface_info = Struct("vga_interface_info", [
     ("type",    libxl_vga_interface_type),
+    # VRAM bar for qxl
+    ("vramkb",  MemKB),
+    # RAM bar for qxl
+    ("ramkb",  MemKB),
     ])

 libxl_vnc_info = Struct("vnc_info", [
diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/xl_cmdimpl.c	Tue Jun 05 17:56:46 2012 +0800
@@ -1260,6 +1260,16 @@ skip_vfb:
             if (l)
                 b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_STD;

+        if (!xlu_cfg_get_long(config, "qxl", &l, 0)) {
+            if (l) {
+                b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_QXL;
+                if (!xlu_cfg_get_long (config, "qxlvram", &l, 0))
+                    b_info->u.hvm.vga.vramkb = l * 1024;
+                if (!xlu_cfg_get_long (config, "qxlram", &l, 0))
+                    b_info->u.hvm.vga.ramkb = l * 1024;
+            }
+        }
+
         xlu_cfg_get_defbool(config, "vnc", &b_info->u.hvm.vnc.enable, 0);
         xlu_cfg_replace_string (config, "vnclisten",
                                 &b_info->u.hvm.vnc.listen, 0);


-- 
Zhou Peng

[-- Attachment #2: spice.tools.libxl.qxl.support.v2.diff --]
[-- Type: application/octet-stream, Size: 5733 bytes --]

changeset:   25454:1804a873a64d
tag:         tip
user:        Zhou Peng <ailvpeng25@gmail.com>
date:        Tue Jun 05 17:56:46 2012 +0800
files:       tools/libxl/libxl_create.c tools/libxl/libxl_dm.c tools/libxl/libxl_types.idl tools/libxl/xl_cmdimpl.c
description:
tools:libxl: Add qxl vga interface support.

Usage:
 qxl=1
 qxlvram=64
 qxlram=64

Signed-off-by: Zhou Peng <ailvpeng25@gmail.com>


diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_create.c	Tue Jun 05 17:56:46 2012 +0800
@@ -23,6 +23,32 @@
 #include <xc_dom.h>
 #include <xenguest.h>
 
+/*
+ * For qxl vga interface, the total video mem is determined by
+ * RAM bar and VRAM bar. But it is not simply linearly determined,
+ * get_qxl_ram_size below gives the details.
+ */
+static inline uint32_t msb_mask(uint32_t val)
+{
+    uint32_t mask;
+
+    do {
+        mask = ~(val - 1) & val;
+        val &= ~mask;
+    } while (mask < val);
+
+    return mask;
+}
+
+static inline uint32_t get_qxl_ram_size(uint32_t vram_sizekb,
+                                    uint32_t ram_sizekb)
+{
+    uint32_t vram = msb_mask(2 * vram_sizekb * 1024 - 1);
+    uint32_t ram = msb_mask(2 * ram_sizekb * 1024 - 1);
+
+    return (vram + ram + 1023) / 1024;
+}
+
 void libxl_domain_config_init(libxl_domain_config *d_config)
 {
     memset(d_config, 0, sizeof(*d_config));
@@ -195,6 +221,25 @@ int libxl__domain_build_info_setdefault(
 
         if (b_info->u.hvm.vga.type == LIBXL_VGA_INTERFACE_TYPE_DEFAULT)
             b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
+        if (b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN
+            && b_info->u.hvm.vga.type == LIBXL_VGA_INTERFACE_TYPE_QXL) {
+            if (b_info->u.hvm.vga.vramkb == LIBXL_MEMKB_DEFAULT)
+                b_info->u.hvm.vga.vramkb = 64 * 1024;
+            if (b_info->u.hvm.vga.ramkb == LIBXL_MEMKB_DEFAULT)
+                b_info->u.hvm.vga.ramkb = 64 * 1024;
+            uint32_t qxl_ram = get_qxl_ram_size(b_info->u.hvm.vga.vramkb,
+                                                b_info->u.hvm.vga.ramkb);
+            /*
+             * video_memkb is the real size of video memory to assign.
+             * If video_memkb can't meet the need of qxl, adjust it
+             * accordingly.
+             */
+            if ((b_info->video_memkb == LIBXL_MEMKB_DEFAULT)
+                || (b_info->video_memkb < qxl_ram)) {
+                b_info->video_memkb = qxl_ram;
+            }
+        }
+
         libxl_defbool_setdefault(&b_info->u.hvm.vnc.enable, true);
         if (libxl_defbool_val(b_info->u.hvm.vnc.enable)) {
             libxl_defbool_setdefault(&b_info->u.hvm.vnc.findunused, true);
diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_dm.c	Tue Jun 05 17:56:46 2012 +0800
@@ -181,6 +181,8 @@ static char ** libxl__build_device_model
             flexarray_append(dm_args, "-std-vga");
             break;
         case LIBXL_VGA_INTERFACE_TYPE_CIRRUS:
+            break;
+        case LIBXL_VGA_INTERFACE_TYPE_QXL:
             break;
         }
 
@@ -429,6 +431,17 @@ static char ** libxl__build_device_model
             break;
         case LIBXL_VGA_INTERFACE_TYPE_CIRRUS:
             flexarray_vappend(dm_args, "-vga", "cirrus", NULL);
+            break;
+        case LIBXL_VGA_INTERFACE_TYPE_QXL:
+            flexarray_vappend(dm_args, "-vga", "qxl", NULL);
+            flexarray_vappend(dm_args, "-global",
+                              GCSPRINTF("qxl-vga.vram_size=%lu",
+                                        b_info->u.hvm.vga.vramkb * 1024),
+                              NULL);
+            flexarray_vappend(dm_args, "-global",
+                              GCSPRINTF("qxl-vga.ram_size=%lu",
+                                        b_info->u.hvm.vga.ramkb * 1024),
+                              NULL);
             break;
         }
 
diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/libxl_types.idl	Tue Jun 05 17:56:46 2012 +0800
@@ -128,6 +128,7 @@ libxl_vga_interface_type = Enumeration("
 libxl_vga_interface_type = Enumeration("vga_interface_type", [
     (0, "CIRRUS"),
     (1, "STD"),
+    (2, "QXL"),
     ], init_val = "LIBXL_VGA_INTERFACE_TYPE_DEFAULT")
 
 #
@@ -136,6 +137,10 @@ libxl_vga_interface_type = Enumeration("
 
 libxl_vga_interface_info = Struct("vga_interface_info", [
     ("type",    libxl_vga_interface_type),
+    # VRAM bar for qxl
+    ("vramkb",  MemKB),
+    # RAM bar for qxl
+    ("ramkb",  MemKB),
     ])
 
 libxl_vnc_info = Struct("vnc_info", [
diff -r 7bd08f83a2ce -r 1804a873a64d tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Jun 05 17:39:37 2012 +0800
+++ b/tools/libxl/xl_cmdimpl.c	Tue Jun 05 17:56:46 2012 +0800
@@ -1260,6 +1260,16 @@ skip_vfb:
             if (l)
                 b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_STD;
 
+        if (!xlu_cfg_get_long(config, "qxl", &l, 0)) {
+            if (l) {
+                b_info->u.hvm.vga.type = LIBXL_VGA_INTERFACE_TYPE_QXL;
+                if (!xlu_cfg_get_long (config, "qxlvram", &l, 0))
+                    b_info->u.hvm.vga.vramkb = l * 1024;
+                if (!xlu_cfg_get_long (config, "qxlram", &l, 0))
+                    b_info->u.hvm.vga.ramkb = l * 1024;
+            }
+        }
+
         xlu_cfg_get_defbool(config, "vnc", &b_info->u.hvm.vnc.enable, 0);
         xlu_cfg_replace_string (config, "vnclisten",
                                 &b_info->u.hvm.vnc.listen, 0);


[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2013-01-16 17:00 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-05 11:22 [PATCH 2/3] tools:libxl: Add qxl vga interface support v2 ZhouPeng
2012-06-06 13:05 ` Ian Campbell
2012-06-07  3:19   ` ZhouPeng
2012-06-07  6:08     ` Ian Campbell
2012-06-07  7:49       ` ZhouPeng
2012-07-03 11:30       ` ZhouPeng
2012-07-03 14:24         ` Ian Campbell
2012-10-10 16:50           ` George Dunlap
2012-10-14  5:16             ` ZhouPeng
2012-10-18 10:19               ` ZhouPeng
2012-10-22 14:36                 ` George Dunlap
2012-10-24  8:06                   ` ZhouPeng
2012-10-24 13:25                     ` George Dunlap
2012-10-30  7:45                       ` ZhouPeng
2012-11-19 11:37                     ` Ian Campbell
2012-11-21  3:27                       ` ZhouPeng
2012-11-21 11:02                         ` Ian Campbell
2013-01-16 17:00                           ` George Dunlap

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).