The <code>type</code> attribute is mandatory, and is typically
"pci" or "drive". For a "pci" controller, additional
attributes for <code>bus</code>, <code>slot</code>,
- and <code>function</code> must be present, as well as an
- optional <code>domain</code>. For a "drive" controller,
- additional attributes <code>controller</code>, <code>bus</code>,
+ and <code>function</code> must be present, as well as
+ optional <code>domain</code> and <code>multifunction</code>.
+ Multifunction defaults to 'off'; any other value requires
+ QEMU 0.1.3 and <span class="since">libvirt 0.9.7</span>. For a
+ "drive" controller, additional attributes
+ <code>controller</code>, <code>bus</code>,
and <code>unit</code> are available, each defaulting to 0.
+
</dd>
</dl>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0' bus='0' slot='4' function='0'/>
+ <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
</controller>
...
</devices>
with <code>virsh nodedev-list</code>. The
<code>bus</code> attribute allows the hexadecimal values 0 to ff, the
<code>slot</code> attribute allows the hexadecimal values 0 to 1f, and
- the <code>function</code> attribute allows the hexadecimal values 0 to
- 7. There is also an optional <code>domain</code> attribute for the
- PCI domain, with hexadecimal values 0 to ffff, but it is currently
- not used by qemu.</dd>
+ the <code>function</code> attribute allows the hexadecimal values 0 to 7.
+ The <code>multifunction</code> attribute controls turning on the
+ multifunction bit for a particular slot/function in the PCI
+ control register<span class="since">since 0.9.7, requires QEMU
+ 0.13</span>. <code>multifunction</code> defaults to 'off', but
+ should be set to 'on' for function 0 of a slot that will have
+ multiple functions used.
+ There is also an optional <code>domain</code> attribute for
+ the PCI domain, with hexadecimal values 0 to ffff, but it is
+ currently not used by qemu.</dd>
</dl>
<h4><a name="elementsRedir">Redirected devices</a></h4>
the interface to a particular pci slot, with
attribute <code>type='pci'</code> and additional
attributes <code>domain</code>, <code>bus</code>, <code>slot</code>,
- and <code>function</code> as appropriate.
+ <code>function</code>, and <code>multifunction</code>
+ <span class="since">since 0.9.7, requires QEMU 0.13</span> as appropriate.
</p>
<h5><a name="elementsNICSVirtual">Virtual network</a></h5>
<attribute name="function">
<ref name="pciFunc"/>
</attribute>
+ <optional>
+ <attribute name="multifunction">
+ <choice>
+ <value>on</value>
+ <value>off</value>
+ </choice>
+ </attribute>
+ </optional>
</define>
<define name="driveaddress">
<optional>
"ccid",
"usb")
+VIR_ENUM_IMPL(virDomainDeviceAddressPciMulti,
+ VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_LAST,
+ "default",
+ "on",
+ "off")
+
VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST,
"block",
"file",
info->addr.pci.bus,
info->addr.pci.slot,
info->addr.pci.function);
+ if (info->addr.pci.multi) {
+ virBufferAsprintf(buf, " multifunction='%s'",
+ virDomainDeviceAddressPciMultiTypeToString(info->addr.pci.multi));
+ }
break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
virDomainDevicePCIAddressParseXML(xmlNodePtr node,
virDomainDevicePCIAddressPtr addr)
{
- char *domain, *slot, *bus, *function;
+ char *domain, *slot, *bus, *function, *multi;
int ret = -1;
memset(addr, 0, sizeof(*addr));
bus = virXMLPropString(node, "bus");
slot = virXMLPropString(node, "slot");
function = virXMLPropString(node, "function");
+ multi = virXMLPropString(node, "multifunction");
if (domain &&
virStrToLong_ui(domain, NULL, 0, &addr->domain) < 0) {
goto cleanup;
}
+ if (multi &&
+ ((addr->multi = virDomainDeviceAddressPciMultiTypeFromString(multi)) <= 0)) {
+ virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unknown value '%s' for <address> 'multifunction' attribute"),
+ multi);
+ goto cleanup;
+
+ }
if (!virDomainDevicePCIAddressIsValid(addr)) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Insufficient specification for PCI address"));
VIR_FREE(bus);
VIR_FREE(slot);
VIR_FREE(function);
+ VIR_FREE(multi);
return ret;
}
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
};
+enum virDomainDeviceAddressPciMulti {
+ VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_DEFAULT = 0,
+ VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON,
+ VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF,
+
+ VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_LAST
+};
+
typedef struct _virDomainDevicePCIAddress virDomainDevicePCIAddress;
typedef virDomainDevicePCIAddress *virDomainDevicePCIAddressPtr;
struct _virDomainDevicePCIAddress {
unsigned int bus;
unsigned int slot;
unsigned int function;
+ int multi; /* enum virDomainDeviceAddressPciMulti */
};
typedef struct _virDomainDeviceDriveAddress virDomainDeviceDriveAddress;
VIR_ENUM_DECL(virDomainLifecycleCrash)
VIR_ENUM_DECL(virDomainDevice)
VIR_ENUM_DECL(virDomainDeviceAddress)
+VIR_ENUM_DECL(virDomainDeviceAddressPciMulti)
VIR_ENUM_DECL(virDomainDisk)
VIR_ENUM_DECL(virDomainDiskDevice)
VIR_ENUM_DECL(virDomainDiskBus)
virDomainDefParseString;
virDomainDeleteConfig;
virDomainDeviceAddressIsValid;
+virDomainDeviceAddressPciMultiTypeFromString;
+virDomainDeviceAddressPciMultiTypeToString;
virDomainDeviceAddressTypeToString;
virDomainDeviceDefFree;
virDomainDeviceDefParse;
virDomainDeviceInfoPtr dev,
void *opaque)
{
+ int ret = -1;
+ char *addr = NULL;
qemuDomainPCIAddressSetPtr addrs = opaque;
- if (dev->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
- char *addr = qemuPCIAddressAsString(dev);
- if (!addr)
- return -1;
+ if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+ return 0;
- VIR_DEBUG("Remembering PCI addr %s", addr);
+ addr = qemuPCIAddressAsString(dev);
+ if (!addr)
+ goto cleanup;
- if (virHashAddEntry(addrs->used, addr, addr) < 0) {
- VIR_FREE(addr);
- return -1;
+ if (virHashLookup(addrs->used, addr)) {
+ if (dev->addr.pci.function != 0) {
+ qemuReportError(VIR_ERR_XML_ERROR,
+ _("Attempted double use of PCI Address '%s' "
+ "(may need \"multifunction='on'\" for device on function 0"),
+ addr);
+ } else {
+ qemuReportError(VIR_ERR_XML_ERROR,
+ _("Attempted double use of PCI Address '%s'"), addr);
}
+ goto cleanup;
}
- return 0;
+ VIR_DEBUG("Remembering PCI addr %s", addr);
+ if (virHashAddEntry(addrs->used, addr, addr) < 0)
+ goto cleanup;
+ addr = NULL;
+
+ if ((dev->addr.pci.function == 0) &&
+ (dev->addr.pci.multi != VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)) {
+ /* a function 0 w/o multifunction=on must reserve the entire slot */
+ int function;
+ virDomainDeviceInfo temp_dev = *dev;
+
+ for (function = 1; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
+ temp_dev.addr.pci.function = function;
+ addr = qemuPCIAddressAsString(&temp_dev);
+ if (!addr)
+ goto cleanup;
+
+ if (virHashLookup(addrs->used, addr)) {
+ qemuReportError(VIR_ERR_XML_ERROR,
+ _("Attempted double use of PCI Address '%s'"
+ "(need \"multifunction='off'\" for device on function 0)"),
+ addr);
+ goto cleanup;
+ }
+
+ VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", addr);
+ if (virHashAddEntry(addrs->used, addr, addr))
+ goto cleanup;
+ addr = NULL;
+ }
+ }
+ ret = 0;
+cleanup:
+ VIR_FREE(addr);
+ return ret;
}
if (info->addr.pci.function != 0) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Only PCI device addresses with function=0 "
- "are supported"));
+ "are supported with this QEMU binary"));
+ return -1;
+ }
+ if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("'multifunction=on' is not supported with "
+ "this QEMU binary"));
return -1;
}
}
virBufferAsprintf(buf, ",bus=pci.0");
else
virBufferAsprintf(buf, ",bus=pci");
- if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION))
- virBufferAsprintf(buf, ",multifunction=on,addr=0x%x.0x%x",
- info->addr.pci.slot, info->addr.pci.function);
- else
- virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
+ if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)
+ virBufferAddLit(buf, ",multifunction=on");
+ else if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF)
+ virBufferAddLit(buf, ",multifunction=off");
+ virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
+ if (info->addr.pci.function != 0)
+ virBufferAsprintf(buf, ".0x%x", info->addr.pci.function);
} else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
virBufferAsprintf(buf, ",bus=");
qemuUsbId(buf, info->addr.usb.bus);
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
--device lsi,id=scsi0,bus=pci.0,multifunction=on,addr=0x3.0x0 \
--device lsi,id=scsi1,bus=pci.0,multifunction=on,addr=0x4.0x0 \
+-device lsi,id=scsi0,bus=pci.0,multifunction=off,addr=0x3 \
+-device lsi,id=scsi1,bus=pci.0,multifunction=on,addr=0x4 \
-device lsi,id=scsi2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
--device lsi,id=scsi3,bus=pci.0,multifunction=on,addr=0x4.0x2 \
--device lsi,id=scsi4,bus=pci.0,multifunction=on,addr=0x4.0x3 \
--device lsi,id=scsi5,bus=pci.0,multifunction=on,addr=0x4.0x4 \
--device lsi,id=scsi6,bus=pci.0,multifunction=on,addr=0x4.0x5 \
--device lsi,id=scsi7,bus=pci.0,multifunction=on,addr=0x4.0x6 \
--device lsi,id=scsi8,bus=pci.0,multifunction=on,addr=0x4.0x7 \
+-device lsi,id=scsi3,bus=pci.0,addr=0x4.0x2 \
+-device lsi,id=scsi4,bus=pci.0,addr=0x4.0x3 \
+-device lsi,id=scsi5,bus=pci.0,addr=0x4.0x4 \
+-device lsi,id=scsi6,bus=pci.0,addr=0x4.0x5 \
+-device lsi,id=scsi7,bus=pci.0,addr=0x4.0x6 \
+-device lsi,id=scsi8,bus=pci.0,addr=0x4.0x7 \
-drive file=/tmp/scsidisk.img,if=none,id=drive-scsi0-0-0 \
-device scsi-disk,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0 \
--usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x5.0x0
+-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='scsi' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='off'/>
</controller>
<controller type='scsi' index='1'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='scsi' index='2'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1' multifunction='on'/>
</controller>
<controller type='scsi' index='3'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
--device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 \
--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc \
+-m 214 -smp 1 -nographic -nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
+-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
+-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
+-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0' bus='0' slot='4' function='0'/>
+ <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
+-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device piix3-usb-uhci,id=usb,bus=pci.0,multifunction=on,addr=0x1.0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
+-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
--device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 \
--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
+-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
+-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
+-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
+-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
-chardev socket,id=charredir0,host=localhost,port=4000 \
-device usb-redir,chardev=charredir0,id=redir0 \
-chardev spicevmc,id=charredir1,name=usbredir \
-device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=4 \
--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
--device piix3-usb-uhci,id=usb,bus=pci.0,multifunction=on,addr=0x1.0x2 \
--device ich9-usb-ehci1,id=usb1,bus=pci.0,multifunction=on,addr=0x4.0x7 \
--device ich9-usb-uhci1,masterbus=usb1.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
--device ich9-usb-uhci2,masterbus=usb1.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
--device ich9-usb-uhci3,masterbus=usb1.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
--device ich9-usb-ehci1,id=usb2,bus=pci.0,multifunction=on,addr=0x5.0x7 \
--device ich9-usb-uhci1,masterbus=usb2.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5.0x0 \
--device ich9-usb-uhci2,masterbus=usb2.0,firstport=2,bus=pci.0,multifunction=on,addr=0x5.0x1 \
--device ich9-usb-uhci3,masterbus=usb2.0,firstport=4,bus=pci.0,multifunction=on,addr=0x5.0x2 \
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
+-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-device ich9-usb-ehci1,id=usb1,bus=pci.0,addr=0x4.0x7 \
+-device ich9-usb-uhci1,masterbus=usb1.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
+-device ich9-usb-uhci2,masterbus=usb1.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
+-device ich9-usb-uhci3,masterbus=usb1.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
+-device ich9-usb-ehci1,id=usb2,bus=pci.0,addr=0x5.0x7 \
+-device ich9-usb-uhci1,masterbus=usb2.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 \
+-device ich9-usb-uhci2,masterbus=usb2.0,firstport=2,bus=pci.0,addr=0x5.0x1 \
+-device ich9-usb-uhci3,masterbus=usb2.0,firstport=4,bus=pci.0,addr=0x5.0x2 \
-device usb-hub,id=hub0,bus=usb1.0,port=1 \
-device usb-tablet,id=input0,bus=usb.0,port=2 \
-device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bus=usb2.0,port=1 \
-device usb-host,hostbus=14,hostaddr=7,id=hostdev1,bus=usb2.0,port=2 \
--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
</controller>
<controller type='usb' index='1' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0' bus='0' slot='4' function='0'/>
+ <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
</controller>
<controller type='usb' index='1' model='ich9-uhci2'>
<master startport='2'/>
</controller>
<controller type='usb' index='2' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0' bus='0' slot='5' function='0'/>
+ <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='on'/>
</controller>
<controller type='usb' index='2' model='ich9-uhci2'>
<master startport='2'/>