[libvirt] [PATCHv2.5 03/10] conf: Add device address type for dimm devices
John Ferlan
jferlan at redhat.com
Fri Mar 13 03:46:58 UTC 2015
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 {
>
More information about the libvir-list
mailing list