Add new controller type 'pci' with models 'pci-root' and
'pci-bridge'.
---
docs/formatdomain.html.in | 22 +++++++++++++++++++++-
docs/schemas/domaincommon.rng | 12 ++++++++++++
src/conf/domain_conf.c | 21 ++++++++++++++++++++-
src/conf/domain_conf.h | 9 +++++++++
4 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 888c005..4a700f9 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2124,7 +2124,7 @@
<p>
Each controller has a mandatory attribute <code>type</code>,
which must be one of "ide", "fdc", "scsi",
"sata", "usb",
- "ccid", or "virtio-serial", and a mandatory
+ "ccid", "virtio-serial" or "pci", and a mandatory
attribute <code>index</code> which is the decimal integer
describing in which order the bus controller is encountered (for
use in <code>controller</code> attributes
@@ -2177,6 +2177,26 @@
</devices>
...</pre>
+ <p>
+ PCI controllers have an optional <code>model</code> attribute with
+ possible values <code>pci-root</code> or
<code>pci-bridge</code>.
+ For machine types which provide an implicit pci bus, the pci-root
+ controller with index=0 is auto-added and required to use PCI devices.
+ PCI root has no address.
+ PCI bridges are auto-added if there are too many devices to fit on
+ the one bus provided by pci-root, or a PCI bus number greater than zero
+ was specified. (<span class="since">since 1.0.5</span>)
+ </p>
+<pre>
+ ...
+ <devices>
+ <controller type='pci' index='0'
model='pci-root'/>
+ <controller type='pci' index='1'
model='pci-bridge'>
+ <address type='pci' domain='0' bus='0'
slot='5' function='0' multifunction=off'/>
+ </controller>
+ </devices>
+ ...</pre>
+
<h4><a name="elementsLease">Device leases</a></h4>
<p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 3976b82..cf91c2d 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1475,6 +1475,18 @@
<ref name="usbmaster"/>
</optional>
</group>
+ <!-- pci has an optional attribute "model" -->
+ <group>
+ <attribute name="type">
+ <value>pci</value>
+ </attribute>
+ <attribute name="model">
+ <choice>
+ <value>pci-root</value>
+ <value>pci-bridge</value>
+ </choice>
+ </attribute>
+ </group>
<!-- virtio-serial has optional "ports" and "vectors"
-->
<group>
<attribute name="type">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 8d57256..1e7de52 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -300,7 +300,12 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST,
"sata",
"virtio-serial",
"ccid",
- "usb")
+ "usb",
+ "pci")
+
+VIR_ENUM_IMPL(virDomainControllerModelPCI, VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST,
+ "pci-root",
+ "pci-bridge")
VIR_ENUM_IMPL(virDomainControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,
"auto",
@@ -5144,6 +5149,8 @@ virDomainControllerModelTypeFromString(const
virDomainControllerDefPtr def,
return virDomainControllerModelSCSITypeFromString(model);
else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_USB)
return virDomainControllerModelUSBTypeFromString(model);
+ else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI)
+ return virDomainControllerModelPCITypeFromString(model);
return -1;
}
@@ -5261,6 +5268,16 @@ virDomainControllerDefParseXML(xmlNodePtr node,
}
break;
}
+ case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
+ switch (def->model) {
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+ if (def->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("pci-root controller should not "
+ "have an address"));
+ goto error;
+ }
+ }
default:
break;
@@ -13488,6 +13505,8 @@ virDomainControllerModelTypeToString(virDomainControllerDefPtr
def,
return virDomainControllerModelSCSITypeToString(model);
else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_USB)
return virDomainControllerModelUSBTypeToString(model);
+ else if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI)
+ return virDomainControllerModelPCITypeToString(model);
return NULL;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 89515de..3cb626b 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -696,11 +696,19 @@ enum virDomainControllerType {
VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
VIR_DOMAIN_CONTROLLER_TYPE_CCID,
VIR_DOMAIN_CONTROLLER_TYPE_USB,
+ VIR_DOMAIN_CONTROLLER_TYPE_PCI,
VIR_DOMAIN_CONTROLLER_TYPE_LAST
};
+enum virDomainControllerModelPCI {
+ VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT,
+ VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE,
+
+ VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST
+};
+
enum virDomainControllerModelSCSI {
VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO,
VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC,
@@ -2425,6 +2433,7 @@ VIR_ENUM_DECL(virDomainIoEventFd)
VIR_ENUM_DECL(virDomainVirtioEventIdx)
VIR_ENUM_DECL(virDomainDiskCopyOnRead)
VIR_ENUM_DECL(virDomainController)
+VIR_ENUM_DECL(virDomainControllerModelPCI)
VIR_ENUM_DECL(virDomainControllerModelSCSI)
VIR_ENUM_DECL(virDomainControllerModelUSB)
VIR_ENUM_DECL(virDomainFS)
--
1.8.1.5