Fabio Fantoni
2013-Sep-13 14:25 UTC
[PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
Usage: usbversion=1|2|3 (default=2) Specifies the type of an emulated USB bus in the guest. 1 for usb1, 2 for usb2 and 3 for usb3, it is available only with upstream qemu. Default is 2. Signed-off-by: Fabio Fantoni <fabio.fantoni@m2r.biz> --- docs/man/xl.cfg.pod.5 | 6 ++++++ tools/libxl/libxl.h | 14 ++++++++++++++ tools/libxl/libxl_create.c | 3 +++ tools/libxl/libxl_dm.c | 25 ++++++++++++++++++++++++- tools/libxl/libxl_types.idl | 1 + tools/libxl/xl_cmdimpl.c | 2 ++ 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 769767b..f768784 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -1168,6 +1168,12 @@ device. Enables or disables an emulated USB bus in the guest. +=item B<usbversion=NUMBER> + +Specifies the type of an emulated USB bus in the guest. 1 for usb1, +2 for usb2 and 3 for usb3, it is available only with upstream qemu. +Default is 2. + =item B<usbdevice=[ "DEVICE", "DEVICE", ...]> Adds B<DEVICE>s to the emulated USB bus. The USB bus must also be diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 4cab294..e27308e 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -305,6 +305,20 @@ #define LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST 1 /* + * LIBXL_HAVE_BUILDINFO_USBVERSION + * + * If this is defined, then the libxl_domain_build_info structure will + * contain hvm.usbversion, a integer type that contains a USB + * controller version to specify on the qemu upstream command-line. + * + * If it is set, callers may use hvm.usbversion to specify if the usb + * controller is usb1, usb2 or usb3. + * + * If this is not defined, the usb controller is only usb1. + */ +#define LIBXL_HAVE_BUILDINFO_USBVERSION 1 + +/* * LIBXL_HAVE_DEVICE_BACKEND_DOMNAME * * If this is defined, libxl_device_* structures containing a backend_domid diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 7567238..a6bfb0a 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -229,6 +229,9 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, return ERROR_INVAL; } + if (!b_info->u.hvm.usbversion) + b_info->u.hvm.usbversion = 2; + if (b_info->u.hvm.timer_mode == LIBXL_TIMER_MODE_DEFAULT) b_info->u.hvm.timer_mode LIBXL_TIMER_MODE_NO_DELAY_FOR_MISSED_TICKS; diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 43c3bec..e0123b7 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -511,7 +511,30 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, __func__); return NULL; } - flexarray_append(dm_args, "-usb"); + + switch (b_info->u.hvm.usbversion) { + case 1: + flexarray_vappend(dm_args, + "-device", "piix3-usb-uhci,id=usb", NULL); + break; + case 2: + flexarray_append_pair(dm_args, "-device", + "ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x1d.0x7"); + for (i = 1; i < 4; i++) + flexarray_append_pair(dm_args, "-device", + GCSPRINTF("ich9-usb-uhci%d,masterbus=usb.0," + "firstport=%d,bus=pci.0%s,addr=0x1d.%#x", i, + 2*(i-1), i == 1 ?",multifunction=on" : "", i-1)); + break; + case 3: + flexarray_vappend(dm_args, + "-device", "nec-usb-xhci,id=usb", NULL); + break; + default: + LIBXL__LOG(CTX, LIBXL__LOG_ERROR, + "usbversion parameter is invalid must be between 1 and 3"); + return NULL; + } if (b_info->u.hvm.usbdevice) { flexarray_vappend(dm_args, "-usbdevice", b_info->u.hvm.usbdevice, NULL); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 049dbb5..34010ee 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -338,6 +338,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("serial", string), ("boot", string), ("usb", libxl_defbool), + ("usbversion", integer), # usbdevice: # - "tablet" for absolute mouse, # - "mouse" for PS/2 protocol relative mouse diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 3d7eaad..0be71be 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1505,6 +1505,8 @@ skip_vfb: xlu_cfg_replace_string (config, "serial", &b_info->u.hvm.serial, 0); xlu_cfg_replace_string (config, "boot", &b_info->u.hvm.boot, 0); xlu_cfg_get_defbool(config, "usb", &b_info->u.hvm.usb, 0); + if (!xlu_cfg_get_long (config, "usbversion", &l, 0)) + b_info->u.hvm.usbversion = l; switch (xlu_cfg_get_list_as_string_list(config, "usbdevice", &b_info->u.hvm.usbdevice_list, 1)) -- 1.7.9.5
Ian Campbell
2013-Sep-17 14:18 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
On Fri, 2013-09-13 at 16:25 +0200, Fabio Fantoni wrote:> diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 > index 769767b..f768784 100644 > --- a/docs/man/xl.cfg.pod.5 > +++ b/docs/man/xl.cfg.pod.5 > @@ -1168,6 +1168,12 @@ device. > > Enables or disables an emulated USB bus in the guest. > > +=item B<usbversion=NUMBER> > + > +Specifies the type of an emulated USB bus in the guest. 1 for usb1, > +2 for usb2 and 3 for usb3, it is available only with upstream qemu. > +Default is 2.For trad qemu the default is effectively 1 and unchangeable, is that right?
Anthony PERARD
2013-Sep-17 17:04 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
On Fri, Sep 13, 2013 at 04:25:37PM +0200, Fabio Fantoni wrote:> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c > index 43c3bec..e0123b7 100644 > --- a/tools/libxl/libxl_dm.c > +++ b/tools/libxl/libxl_dm.c > @@ -511,7 +511,30 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, > __func__); > return NULL; > } > - flexarray_append(dm_args, "-usb"); > + > + switch (b_info->u.hvm.usbversion) { > + case 1: > + flexarray_vappend(dm_args, > + "-device", "piix3-usb-uhci,id=usb", NULL); > + break; > + case 2: > + flexarray_append_pair(dm_args, "-device", > + "ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x1d.0x7"); > + for (i = 1; i < 4; i++) > + flexarray_append_pair(dm_args, "-device", > + GCSPRINTF("ich9-usb-uhci%d,masterbus=usb.0," > + "firstport=%d,bus=pci.0%s,addr=0x1d.%#x", i, > + 2*(i-1), i == 1 ?",multifunction=on" : "", i-1)); > + break; > + case 3: > + flexarray_vappend(dm_args, > + "-device", "nec-usb-xhci,id=usb", NULL); > + break; > + default: > + LIBXL__LOG(CTX, LIBXL__LOG_ERROR, > + "usbversion parameter is invalid must be between 1 and 3"); > + return NULL; > + } > if (b_info->u.hvm.usbdevice) { > flexarray_vappend(dm_args, > "-usbdevice", b_info->u.hvm.usbdevice, NULL);I''ve took a look at the QEMU command line, and especially the usb2 case. I think the bus=pci.0 is not needed, QEMU does not complain and the usb controller is visible in the guest. About the id, I think it would be better to name the different version with different ids, they could be uhci, ehci and xhci as I saw in few example, or it could be usb1, usb2, usb3. So when those id are used later, they will carry which usb version there are providing, without the need to know how the guest have been configured. About the multifunction=on, do you know why it''s only on applied to one of the ich9-usb-uhci devices (in the for loop)? Would it change something to applied to all of them? Otherwise, there is some docs in the qemu.git tree to make sense of this, and especially docs/usb2.txt. -- Anthony PERARD
Fabio Fantoni
2013-Sep-17 17:52 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
Yes 2013/9/17 Ian Campbell <ian.campbell@citrix.com>> On Fri, 2013-09-13 at 16:25 +0200, Fabio Fantoni wrote: > > > diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 > > index 769767b..f768784 100644 > > --- a/docs/man/xl.cfg.pod.5 > > +++ b/docs/man/xl.cfg.pod.5 > > @@ -1168,6 +1168,12 @@ device. > > > > Enables or disables an emulated USB bus in the guest. > > > > +=item B<usbversion=NUMBER> > > + > > +Specifies the type of an emulated USB bus in the guest. 1 for usb1, > > +2 for usb2 and 3 for usb3, it is available only with upstream qemu. > > +Default is 2. > > For trad qemu the default is effectively 1 and unchangeable, is that > right? > > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Fabio Fantoni
2013-Sep-18 07:44 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
Fabio Fantoni
2013-Sep-20 13:08 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
Fabio Fantoni
2013-Sep-23 08:56 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
Ian Campbell
2013-Sep-23 09:52 UTC
Re: [PATCH v5] libxl: usb2 and usb3 controller support for upstream qemu
On Mon, 2013-09-23 at 10:56 +0200, Fabio Fantoni wrote:> > I tried to change this part with: > flexarray_vappend(dm_args, "-device", > GCSPRINTF("ich9-usb-uhci%d,masterbus=usb.0," > "firstport=%d,addr=0x1d.%#x,multifunction=on", > i, 2*(i-1), i-1) ); > > But on xl create it stops with segfault: > xl -vvv create /etc/xen/W7.cfg > ... > libxl: debug: libxl_dm.c:1286:libxl__spawn_local_dm: -device > libxl: debug: libxl_dm.c:1286:libxl__spawn_local_dm: > ich9-usb-uhci1,masterbus=usb.0,firstport=0,addr=0x1d.0,multifunction=on > libxl: debug: libxl_dm.c:1286:libxl__spawn_local_dm: > Segfault error > > I not understand what is the problem, can someone help me to solve > please?flexarray_vappend needs a NULL terminator. You want ..._append_pair. Ian.