From: Tiejun Chen <tiejun.chen@intel.com>
To: ian.campbell@citrix.com, wei.liu2@citrix.com,
stefano.stabellini@citrix.com, Ian.Jackson@eu.citrix.com
Cc: qemu-devel@nongnu.org, xen-devel@lists.xen.org
Subject: [Qemu-devel] [v4][PATCH 2/2] libxl: introduce gfx_passthru_kind
Date: Fri, 18 Sep 2015 16:30:17 +0800 [thread overview]
Message-ID: <1442565017-31725-3-git-send-email-tiejun.chen@intel.com> (raw)
In-Reply-To: <1442565017-31725-1-git-send-email-tiejun.chen@intel.com>
Although we already have 'gfx_passthru' in b_info, this doesn't suffice
after we want to handle IGD specifically. Now we define a new field of
type, gfx_passthru_kind, to indicate we're trying to pass IGD. Actually
this means we can benefit this to support other specific devices just
by extending gfx_passthru_kind. And then we can cooperate with
gfx_passthru to address IGD cases as follows:
gfx_passthru = 0 => sets build_info.u.gfx_passthru to false
gfx_passthru = 1 => sets build_info.u.gfx_passthru to true and
build_info.u.gfx_passthru_kind to DEFAULT
gfx_passthru = "igd" => sets build_info.u.gfx_passthru to true
and build_info.u.gfx_passthru_kind to IGD
Here if gfx_passthru_kind = DEFAULT, we will call
libxl__is_igd_vga_passthru() to check if we're hitting that table to need
to pass that option to qemu. But if gfx_passthru_kind = "igd" we always
force to pass that.
And "-gfx_passthru" is just introduced to work for qemu-xen-traditional
so we should get this away from libxl__build_device_model_args_new() in
the case of qemu upstream.
Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
---
docs/man/xl.cfg.pod.5 | 35 ++++++++++++++++++++++++++++++----
tools/libxl/libxl.h | 6 ++++++
tools/libxl/libxl_dm.c | 46 +++++++++++++++++++++++++++++++++++++++++----
tools/libxl/libxl_types.idl | 6 ++++++
tools/libxl/xl_cmdimpl.c | 14 ++++++++++++--
5 files changed, 97 insertions(+), 10 deletions(-)
diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
index db4a163..4aa7b05 100644
--- a/docs/man/xl.cfg.pod.5
+++ b/docs/man/xl.cfg.pod.5
@@ -812,7 +812,7 @@ through to this VM. See L<seize|/"seize_boolean"> above.
devices passed through to this VM. See L<power_mgt|/"power_mgmt_boolean">
above.
-=item B<gfx_passthru=BOOLEAN>
+=item B<gfx_passthru=BOOLEAN|"STRING">
Enable graphics device PCI passthrough. This option makes an assigned
PCI graphics card become primary graphics card in the VM. The QEMU
@@ -840,9 +840,36 @@ working graphics passthrough. See the XenVGAPassthroughTestedAdapters
L<http://wiki.xen.org/wiki/XenVGAPassthroughTestedAdapters> wiki page
for currently supported graphics cards for gfx_passthru.
-gfx_passthru is currently only supported with the qemu-xen-traditional
-device-model. Upstream qemu-xen device-model currently does not have
-support for gfx_passthru.
+gfx_passthru is currently supported both with the qemu-xen-traditional
+device-model and upstream qemu-xen device-model.
+
+When given as a boolean the B<gfx_passthru> option either disables gfx
+passthru or enables autodetection.
+
+But when given as a string the B<gfx_passthru> option describes the type
+of device to enable. Note this behavior is only supported with the upstream
+qemu-xen device-model. With qemu-xen-traditional IGD is always assumed
+and other options than autodetect or explicit IGD will result in an error.
+
+Currently, valid options are:
+
+=over 4
+
+=item B<gfx_passthru=0>
+
+Disables graphics device PCI passthrough.
+
+=item B<gfx_passthru=1>, B<gfx_passthru="default">
+
+Enables graphics device PCI passthrough and autodetects the type of device
+which is being used.
+
+=item "igd"
+
+Enables graphics device PCI passthrough but forcing the type of device to
+Intel Graphics Device.
+
+=back
Note that some graphics adapters (AMD/ATI cards, for example) do not
necessarily require gfx_passthru option, so you can use the normal Xen
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 5f9047c..899de28 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -832,6 +832,12 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src);
*/
#define LIBXL_HAVE_SRM_V1 1
+/*
+ * libxl_domain_build_info has the u.hvm.gfx_passthru_kind field and
+ * the libxl_gfx_passthru_kind enumeration is defined.
+*/
+#define LIBXL_HAVE_GFX_PASSTHRU_KIND
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index b7c6592..9378b0b 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -605,7 +605,15 @@ static int libxl__build_device_model_args_old(libxl__gc *gc,
flexarray_vappend(dm_args, "-net", "none", NULL);
}
if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
- flexarray_append(dm_args, "-gfx_passthru");
+ switch (b_info->u.hvm.gfx_passthru_kind) {
+ case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
+ case LIBXL_GFX_PASSTHRU_KIND_IGD:
+ flexarray_append(dm_args, "-gfx_passthru");
+ break;
+ default:
+ LOG(ERROR, "unsupported gfx_passthru_kind.");
+ return ERROR_INVAL;
+ }
}
} else {
if (!sdl && !vnc)
@@ -700,6 +708,22 @@ static char *dm_spice_options(libxl__gc *gc,
return opt;
}
+static enum libxl_gfx_passthru_kind
+libxl__detect_gfx_passthru_kind(libxl__gc *gc,
+ const libxl_domain_config *guest_config)
+{
+ const libxl_domain_build_info *b_info = &guest_config->b_info;
+
+ if (b_info->u.hvm.gfx_passthru_kind != LIBXL_GFX_PASSTHRU_KIND_DEFAULT)
+ return b_info->u.hvm.gfx_passthru_kind;
+
+ if (libxl__is_igd_vga_passthru(gc, guest_config)) {
+ return LIBXL_GFX_PASSTHRU_KIND_IGD;
+ }
+
+ return LIBXL_GFX_PASSTHRU_KIND_DEFAULT;
+}
+
static int libxl__build_device_model_args_new(libxl__gc *gc,
const char *dm, int guest_domid,
const libxl_domain_config *guest_config,
@@ -1031,9 +1055,6 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
flexarray_append(dm_args, "-net");
flexarray_append(dm_args, "none");
}
- if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
- flexarray_append(dm_args, "-gfx_passthru");
- }
} else {
if (!sdl && !vnc) {
flexarray_append(dm_args, "-nographic");
@@ -1078,6 +1099,23 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
machinearg, max_ram_below_4g);
}
}
+
+ if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
+ enum libxl_gfx_passthru_kind gfx_passthru_kind =
+ libxl__detect_gfx_passthru_kind(gc, guest_config);
+ switch (gfx_passthru_kind) {
+ case LIBXL_GFX_PASSTHRU_KIND_IGD:
+ machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
+ break;
+ case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
+ LOG(ERROR, "unable to detect required gfx_passthru_kind");
+ return ERROR_FAIL;
+ default:
+ LOG(ERROR, "invalid value for gfx_passthru_kind");
+ return ERROR_INVAL;
+ }
+ }
+
flexarray_append(dm_args, machinearg);
for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
flexarray_append(dm_args, b_info->extra_hvm[i]);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 9f6ec00..7e1ab85 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -157,6 +157,11 @@ libxl_tsc_mode = Enumeration("tsc_mode", [
(3, "native_paravirt"),
])
+libxl_gfx_passthru_kind = Enumeration("gfx_passthru_kind", [
+ (0, "default"),
+ (1, "igd"),
+ ])
+
# Consistent with the values defined for HVM_PARAM_TIMER_MODE.
libxl_timer_mode = Enumeration("timer_mode", [
(-1, "unknown"),
@@ -488,6 +493,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
("spice", libxl_spice_info),
("gfx_passthru", libxl_defbool),
+ ("gfx_passthru_kind", libxl_gfx_passthru_kind),
("serial", string),
("boot", string),
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 2706759..b26fc37 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2295,8 +2295,18 @@ skip_vfb:
xlu_cfg_replace_string (config, "spice_streaming_video",
&b_info->u.hvm.spice.streaming_video, 0);
xlu_cfg_get_defbool(config, "nographic", &b_info->u.hvm.nographic, 0);
- xlu_cfg_get_defbool(config, "gfx_passthru",
- &b_info->u.hvm.gfx_passthru, 0);
+ if (!xlu_cfg_get_long(config, "gfx_passthru", &l, 1)) {
+ libxl_defbool_set(&b_info->u.hvm.gfx_passthru, l);
+ } else if (!xlu_cfg_get_string(config, "gfx_passthru", &buf, 0)) {
+ if (libxl_gfx_passthru_kind_from_string(buf,
+ &b_info->u.hvm.gfx_passthru_kind)) {
+ fprintf(stderr,
+ "ERROR: invalid value \"%s\" for \"gfx_passthru\"\n",
+ buf);
+ exit (1);
+ }
+ libxl_defbool_set(&b_info->u.hvm.gfx_passthru, true);
+ }
switch (xlu_cfg_get_list_as_string_list(config, "serial",
&b_info->u.hvm.serial_list,
1))
--
1.9.1
next prev parent reply other threads:[~2015-09-18 8:31 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-18 8:30 [Qemu-devel] [v4][PATCH 0/2] libxl: try to support IGD passthrough for qemu upstream Tiejun Chen
2015-09-18 8:30 ` [v4][PATCH 1/2] libxl: introduce libxl__is_igd_vga_passthru Tiejun Chen
2015-09-18 8:30 ` [Qemu-devel] " Tiejun Chen
2015-09-18 8:30 ` Tiejun Chen [this message]
2015-09-25 15:38 ` [Qemu-devel] [v4][PATCH 2/2] libxl: introduce gfx_passthru_kind Ian Campbell
2015-10-06 15:30 ` Stefano Stabellini
2015-10-06 15:30 ` Stefano Stabellini
2015-09-25 15:38 ` Ian Campbell
2015-09-18 8:30 ` Tiejun Chen
2015-09-25 5:51 ` [Qemu-devel] [v4][PATCH 0/2] libxl: try to support IGD passthrough for qemu upstream Chen, Tiejun
2015-09-25 5:51 ` Chen, Tiejun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1442565017-31725-3-git-send-email-tiejun.chen@intel.com \
--to=tiejun.chen@intel.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=ian.campbell@citrix.com \
--cc=qemu-devel@nongnu.org \
--cc=stefano.stabellini@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.