[libvirt] [v2 07/13] Add USB companion controllers support
Daniel P. Berrange
berrange at redhat.com
Thu Sep 1 10:58:42 UTC 2011
On Fri, Aug 26, 2011 at 01:44:23AM +0300, Marc-André Lureau wrote:
> Companion controllers take an extra 'master' attribute to associate
> them.
>
> Changes since v1:
> - use the same bus index for companion controllers
> - removed the master bus attribute, redundant with controller index
> ---
> docs/formatdomain.html.in | 22 ++++++++++++
> docs/schemas/domain.rng | 12 +++++++
> src/conf/domain_conf.c | 35 ++++++++++++++++++++
> src/conf/domain_conf.h | 18 ++++++++++
> src/qemu/qemu_command.c | 11 ++++++-
> .../qemuxml2argv-input-usbmouse-addr.args | 2 +-
> .../qemuxml2argv-usb-ich9-companion.args | 6 +++
> .../qemuxml2argv-usb-ich9-companion.xml | 30 +++++++++++++++++
> tests/qemuxml2argvtest.c | 3 ++
> 9 files changed, 137 insertions(+), 2 deletions(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 5552fbc..633cea1 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1243,6 +1243,28 @@
> sub-element.
> </p>
>
> + <p>
> + USB companion controllers have an optional
> + sub-element <code><master></code> to specify the exact
> + relationship of the companion to its master controller.
> + A companion controller is on the same bus as its master, so
> + the companion <code>index</code> value should be equal.
> + </p>
> +
> +<pre>
> + ...
> + <devices>
> + <controller type='usb' index='0' model='ich9-ehci1'>
> + <address type='pci' domain='0' bus='0' slot='4' function='7'/>
> + </controller>
> + <controller type='usb' index='0' model='ich9-uhci1'>
> + <master startport='0'/>
> + <address type='pci' domain='0' bus='0' slot='4' function='0'/>
> + </controller>
> + ...
> + </devices>
> + ...</pre>
> +
> <h4><a name="elementsLease">Device leases</a></h4>
>
> <p>
> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 632e029..455f57d 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -923,6 +923,9 @@
> </attribute>
> </optional>
> <optional>
> + <ref name="usbmaster"/>
> + </optional>
> + <optional>
> <ref name="address"/>
> </optional>
> </element>
> @@ -2378,6 +2381,15 @@
> </element>
> </define>
>
> + <define name="usbmaster">
> + <element name="master">
> + <attribute name="startport">
> + <ref name="usbAddr"/>
> + </attribute>
> + <empty/>
> + </element>
> + </define>
> +
> <define name="filterref-node-attributes">
> <attribute name="filter">
> <data type="NCName"/>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 5487e0e..5ef062a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1832,6 +1832,31 @@ cleanup:
> return ret;
> }
>
> +static int
> +virDomainDeviceUSBMasterParseXML(xmlNodePtr node,
> + virDomainDeviceUSBMasterPtr master)
> +{
> + char *startport;
> + int ret = -1;
> +
> + memset(master, 0, sizeof(*master));
> +
> + startport = virXMLPropString(node, "startport");
> +
> + if (startport &&
> + virStrToLong_ui(startport, NULL, 10, &master->startport) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Cannot parse <master> 'startport' attribute"));
> + goto cleanup;
> + }
> +
> + ret = 0;
> +
> +cleanup:
> + VIR_FREE(startport);
> + return ret;
> +}
> +
> /* Parse the XML definition for a device address
> * @param node XML nodeset to parse for device address definition
> */
> @@ -1842,6 +1867,7 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
> {
> xmlNodePtr cur;
> xmlNodePtr address = NULL;
> + xmlNodePtr master = NULL;
> xmlNodePtr alias = NULL;
> char *type = NULL;
> int ret = -1;
> @@ -1858,6 +1884,9 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
> } else if (address == NULL &&
> xmlStrEqual(cur->name, BAD_CAST "address")) {
> address = cur;
> + } else if (master == NULL &&
> + xmlStrEqual(cur->name, BAD_CAST "master")) {
> + master = cur;
> }
> }
> cur = cur->next;
> @@ -1866,6 +1895,12 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
> if (alias)
> info->alias = virXMLPropString(alias, "name");
>
> + if (master) {
> + info->mastertype = VIR_DOMAIN_CONTROLLER_MASTER_USB;
> + if (virDomainDeviceUSBMasterParseXML(master, &info->master.usb) < 0)
> + goto cleanup;
> + }
> +
> if (!address)
> return 0;
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 1ad8071..07d60a4 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -113,6 +113,20 @@ struct _virDomainDeviceUSBAddress {
> unsigned int port;
> };
>
> +enum virDomainControllerMaster {
> + VIR_DOMAIN_CONTROLLER_MASTER_NONE,
> + VIR_DOMAIN_CONTROLLER_MASTER_USB,
> +
> + VIR_DOMAIN_CONTROLLER_MASTER_LAST
> +};
> +
> +typedef struct _virDomainDeviceUSBMaster virDomainDeviceUSBMaster;
> +typedef virDomainDeviceUSBMaster *virDomainDeviceUSBMasterPtr;
> +struct _virDomainDeviceUSBMaster {
> + unsigned int bus;
> + unsigned int startport;
> +};
The 'bus' field is now unused, so can be removed here I believe.
ACK aside from that
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list