On 03/04/2015 11:24 AM, Peter Krempa wrote: > 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); Both are %u not %d ACK - with the adjustment. John > + 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 { > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list