Signed-off-by: Andrea Bolognani <abologna(a)redhat.com>
---
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 24 ++++++++++++++++++++++++
src/conf/domain_conf.h | 1 +
3 files changed, 30 insertions(+)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 4950ddc..7234b49 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1997,6 +1997,11 @@
</attribute>
</optional>
<optional>
+ <attribute name='index'>
+ <ref name='uint8'/>
+ </attribute>
+ </optional>
+ <optional>
<element name='node'>
<ref name='unsignedInt'/>
</element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6ee7696..107cdba 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1866,6 +1866,7 @@ virDomainControllerDefNew(virDomainControllerType type)
def->opts.pciopts.chassis = -1;
def->opts.pciopts.port = -1;
def->opts.pciopts.busNr = -1;
+ def->opts.pciopts.idx = -1;
def->opts.pciopts.numaNode = -1;
break;
case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
@@ -9031,6 +9032,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
goto error;
}
def->idx = idxVal;
+ VIR_FREE(idx);
}
cur = node->children;
@@ -9062,6 +9064,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
chassis = virXMLPropString(cur, "chassis");
port = virXMLPropString(cur, "port");
busNr = virXMLPropString(cur, "busNr");
+ idx = virXMLPropString(cur, "index");
processedTarget = true;
}
}
@@ -9280,6 +9283,23 @@ virDomainControllerDefParseXML(xmlNodePtr node,
goto error;
}
}
+ if (idx) {
+ if (virStrToLong_i(idx, NULL, 0,
+ &def->opts.pciopts.idx) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid target index '%s' in PCI
controller"),
+ idx);
+ goto error;
+ }
+ if (def->opts.pciopts.idx < 0 ||
+ def->opts.pciopts.idx > 31) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("PCI controller target index '%s' out of
"
+ "range - must be 0-31"),
+ idx);
+ goto error;
+ }
+ }
if (numaNode >= 0)
def->opts.pciopts.numaNode = numaNode;
break;
@@ -21680,6 +21700,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
def->opts.pciopts.chassis != -1 ||
def->opts.pciopts.port != -1 ||
def->opts.pciopts.busNr != -1 ||
+ def->opts.pciopts.idx != -1 ||
def->opts.pciopts.numaNode != -1) {
virBufferAddLit(&childBuf, "<target");
if (def->opts.pciopts.chassisNr != -1)
@@ -21694,6 +21715,9 @@ virDomainControllerDefFormat(virBufferPtr buf,
if (def->opts.pciopts.busNr != -1)
virBufferAsprintf(&childBuf, " busNr='%d'",
def->opts.pciopts.busNr);
+ if (def->opts.pciopts.idx != -1)
+ virBufferAsprintf(&childBuf, " index='%d'",
+ def->opts.pciopts.idx);
if (def->opts.pciopts.numaNode == -1) {
virBufferAddLit(&childBuf, "/>\n");
} else {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e67b6fd..3713b7f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -785,6 +785,7 @@ struct _virDomainPCIControllerOpts {
int chassis;
int port;
int busNr; /* used by pci-expander-bus, -1 == unspecified */
+ int idx; /* used by spapr-pci-host-bridge, -1 == unspecified */
/* numaNode is a *subelement* of target (to match existing
* item in memory target config) -1 == unspecified
*/
--
2.7.5