Dimm devices are described by the slot and base address. Add a new
address type to be able to describe such address.
---
docs/schemas/domaincommon.rng | 18 +++++++++++
src/conf/domain_conf.c | 74 ++++++++++++++++++++++++++++++++++++++++++-
src/conf/domain_conf.h | 9 ++++++
3 files changed, 100 insertions(+), 1 deletion(-)
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 8e107e6..c1c02e4 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4028,6 +4028,18 @@
</attribute>
</optional>
</define>
+ <define name="dimmaddress">
+ <optional>
+ <attribute name="slot">
+ <ref name="unsignedInt"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="base">
+ <ref name="hexuint"/>
+ </attribute>
+ </optional>
+ </define>
<define name="devices">
<element name="devices">
<interleave>
@@ -4447,6 +4459,12 @@
<value>virtio-mmio</value>
</attribute>
</group>
+ <group>
+ <attribute name="type">
+ <value>dimm</value>
+ </attribute>
+ <ref name="dimmaddress"/>
+ </group>
</choice>
</element>
</define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4d765f9..3be52a7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -249,7 +249,8 @@ VIR_ENUM_IMPL(virDomainDeviceAddress,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
"virtio-s390",
"ccw",
"virtio-mmio",
- "isa")
+ "isa",
+ "dimm")
VIR_ENUM_IMPL(virDomainDiskDevice, VIR_DOMAIN_DISK_DEVICE_LAST,
"disk",
@@ -2828,6 +2829,11 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a,
if (memcmp(&a->addr.isa, &b->addr.isa, sizeof(a->addr.isa)))
return false;
break;
+
+ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
+ if (memcmp(&a->addr.dimm, &b->addr.dimm, sizeof(a->addr.dimm)))
+ return false;
+ break;
}
return true;
@@ -3657,6 +3663,12 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
virBufferAsprintf(buf, " irq='0x%x'",
info->addr.isa.irq);
break;
+ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
+ virBufferAsprintf(buf, " slot='%u'", info->addr.dimm.slot);
+ virBufferAsprintf(buf, " base='0x%llx'",
info->addr.dimm.base);
+
+ break;
+
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
@@ -4026,6 +4038,41 @@ virDomainDeviceISAAddressParseXML(xmlNodePtr node,
return ret;
}
+
+static int
+virDomainDeviceDimmAddressParseXML(xmlNodePtr node,
+ virDomainDeviceDimmAddressPtr addr)
+{
+ int ret = -1;
+ char *tmp = NULL;
+
+ if (!(tmp = virXMLPropString(node, "slot")) ||
+ virStrToLong_uip(tmp, NULL, 10, &addr->slot) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid or missing dimm slot id '%s'"),
+ NULLSTR(tmp));
+ goto cleanup;
+ }
+ VIR_FREE(tmp);
+
+ if (!(tmp = virXMLPropString(node, "base")) ||
+ virStrToLong_ullp(tmp, NULL, 16, &addr->base) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid or missing dimm base address '%s'"),
+ NULLSTR(tmp));
+ goto cleanup;
+ }
+ VIR_FREE(tmp);
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(tmp);
+
+ return ret;
+}
+
+
/* Parse the XML definition for a device address
* @param node XML nodeset to parse for device address definition
*/
@@ -4167,6 +4214,11 @@ virDomainDeviceInfoParseXML(xmlNodePtr node,
_("virtio-s390 bus doesn't have an address"));
goto cleanup;
+ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
+ if (virDomainDeviceDimmAddressParseXML(address, &info->addr.dimm) < 0)
+ goto cleanup;
+ break;
+
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
break;
@@ -15295,6 +15347,26 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfoPtr src,
}
break;
+ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
+ if (src->addr.dimm.slot != dst->addr.dimm.slot) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target device dimm slot %d does not match "
+ "source %d"),
+ dst->addr.dimm.slot,
+ src->addr.dimm.slot);
+ return false;
+ }
+
+ if (src->addr.dimm.base != dst->addr.dimm.base) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target device dimm base addres '%llx' does
"
+ "not match source '%llx'"),
+ dst->addr.dimm.base,
+ src->addr.dimm.base);
+ return false;
+ }
+ break;
+
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3537b32..da13bf6 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -235,6 +235,7 @@ typedef enum {
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA,
+ VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
} virDomainDeviceAddressType;
@@ -310,6 +311,13 @@ struct _virDomainDeviceISAAddress {
unsigned int irq;
};
+typedef struct _virDomainDeviceDimmAddress virDomainDeviceDimmAddress;
+typedef virDomainDeviceDimmAddress *virDomainDeviceDimmAddressPtr;
+struct _virDomainDeviceDimmAddress {
+ unsigned int slot;
+ unsigned long long base;
+};
+
typedef struct _virDomainDeviceInfo virDomainDeviceInfo;
typedef virDomainDeviceInfo *virDomainDeviceInfoPtr;
struct _virDomainDeviceInfo {
@@ -328,6 +336,7 @@ struct _virDomainDeviceInfo {
virDomainDeviceSpaprVioAddress spaprvio;
virDomainDeviceCCWAddress ccw;
virDomainDeviceISAAddress isa;
+ virDomainDeviceDimmAddress dimm;
} addr;
int mastertype;
union {
--
2.2.2